Example #1
0
	def __init__(self, clientObject, serializer):
		# Alias for convenience
		self.serializer = serializer
		self.clientObject = clientObject
		self.nat = NATService(clientObject)
Example #2
0
class GTGClientProtocol(basic.LineReceiver):
	def __init__(self, clientObject, serializer):
		# Alias for convenience
		self.serializer = serializer
		self.clientObject = clientObject
		self.nat = NATService(clientObject)

	def lineReceived(self, line):
		try:
			#TODO: Perhaps in the future we should make (de)serialization operations asynchronous,
			# not sure if this is worth the effort/overhead or not.
			response = self.serializer.deserialize(line)

			if PRINT_PACKETS:
				log.msg("IN : %s | %s" % (response.__class__.__name__, line))

			# User Objects
			if isinstance(response, User) and self.clientObject.mainWindowHandler:
				self.clientObject.addUser(response)

			if isinstance(response, DeltaUser) and self.clientObject.mainWindowHandler:
				self.clientObject.updateUser(response)

			# Region Objects
			if isinstance(response, Region) and self.clientObject.mainWindowHandler:
				self.clientObject.addRegion(response)

			if isinstance(response, DeltaRegion) and self.clientObject.mainWindowHandler:
				self.clientObject.updateRegion(response)

			elif isinstance(response, NATCheckResponse) and self.clientObject.mainWindowHandler:
				log.msg("[NAT] External Status = " + str(response.status))
				self.nat.close()
				if response.status:
					self.loopback.run()
				else:
					delta = DeltaUser(self.clientObject.localUUID)
					delta.NATStatus = False
					self.writeRequest(delta)

			# Login Stuff
			elif isinstance(response, LoginResponse) and self.clientObject.loginHandler:
				if isinstance(response, LoginSuccess):
					self.clientObject.localUUID = response.UUID
					self.clientObject.localGrid = response.grid
					self.clientObject.email = response.email
					self.clientObject.externalhost = response.externalhost

					self.clientObject.mainWindowHandler = \
						self.clientObject.windowFactory.buildWindow("mainWindow", MainWindowHandler)
					self.clientObject.mainWindowHandler.window.show_all()
					self.clientObject.mainWindowHandler.setStatus('Logged in to coordination server.')

					self.clientObject.loginHandler.window.destroy()
					self.clientObject.loginHandler = None

					self.loopback = LoopbackService(self.clientObject, self.clientObject.externalhost)
					self.nat.run(self.clientObject.maxregionport)
				else:
					showModalDialog(
						self.clientObject.loginHandler.window,
						Gtk.MessageType.ERROR,
						response.message)

			# Create User Stuff
			elif isinstance(response, CreateUserResponse) and self.clientObject.createUserWindowHandler:
				if isinstance(response, CreateUserSuccess):
					self.clientObject.createUserWindowHandler.onCreateUserSuccess()
					self.clientObject.createUserWindowHandler.window.destroy()
					self.clientObject.createUserWindowHandler = None
				else:
					showModalDialog(
						self.clientObject.createUserWindowHandler.window,
						Gtk.MessageType.ERROR,
						response.message)

		except serialization.InvalidSerializedDataException:
			log.msg("Server sent bad data.")
			self.transport.loseConnection()

	def connectionLost(self, reason):
		if not self.clientObject.dieing:
			showModalDialog(None, Gtk.MessageType.ERROR, 'Connection lost!')
			self.clientObject.dieing = True
			self.clientObject.stop()

	def writeRequest(self, request):
		line = self.serializer.serialize(request)
		if PRINT_PACKETS:
			log.msg("OUT: %s | %s" % (request.__class__.__name__, line))
		self.transport.write(line + "\r\n")