You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.5 KiB
83 lines
2.5 KiB
import time
|
|
|
|
from Event.EventDispatcher import EventDispatcher, CLIENT
|
|
from Event.EventHandler import EventHandler
|
|
import Event.Signal as Signal
|
|
|
|
from Communication.Manager import CommunicationManager
|
|
from Communication.EndPoint import CommunicationEndPoint
|
|
from Communication.ProtocolHandler import ProtocolHandler
|
|
from Transport.IoHandler import IoHandler
|
|
from Transport.TcpSocket import TcpSocket
|
|
|
|
class SimpleClient(EventHandler):
|
|
def __init__(self, end_point):
|
|
super(SimpleClient, self).__init__()
|
|
|
|
self._event_methods = {
|
|
EventDispatcher.eventId('user_wait') : self._userInteraction,
|
|
CommunicationEndPoint.eventId('new_msg') : self._handleData
|
|
}
|
|
|
|
self._end_point = end_point
|
|
if isinstance(self._end_point.getTransport(), TcpSocket):
|
|
self._end_point.getTransport().connect()
|
|
|
|
self._remote_addr = end_point.getTransport().getAddr()
|
|
|
|
con_mngr = CommunicationManager()
|
|
con_mngr.addEndPoint(self._end_point)
|
|
|
|
dispatcher = EventDispatcher(CLIENT)
|
|
dispatcher.registerHandler(con_mngr)
|
|
dispatcher.registerHandler(IoHandler())
|
|
dispatcher.registerHandler(ProtocolHandler())
|
|
dispatcher.registerHandler(self)
|
|
Signal.initSignals(dispatcher)
|
|
|
|
self._timeout = None
|
|
self._starttime = None
|
|
self._request = None
|
|
self._response = None
|
|
self._sendIssued = False
|
|
|
|
|
|
def issue(self, request, timeout):
|
|
self._starttime = time.time()
|
|
self._timeout = timeout
|
|
self._request = request
|
|
self._response = None
|
|
self._sendIssued = False
|
|
self._dispatcher[0].start(None)
|
|
|
|
return self._response
|
|
|
|
def getRemoteAddr(self):
|
|
return self._remote_addr
|
|
|
|
def getProtocol(self):
|
|
return self._end_point.getProtocol()
|
|
|
|
def _userInteraction(self, event):
|
|
if self._sendIssued:
|
|
now = time.time()
|
|
|
|
if self._response or self._timeout <= (now - self._starttime):
|
|
event.subject.stop()
|
|
else:
|
|
self.issueEvent(
|
|
event.subject,
|
|
'data_wait',
|
|
self._timeout - (now - self._starttime)
|
|
)
|
|
else:
|
|
self.issueEvent(self._end_point, 'send_msg', self._request)
|
|
self._sendIssued = True
|
|
return True
|
|
|
|
def _handleData(self, event):
|
|
if event.data.isResponse():
|
|
self._response = event.data
|
|
return True
|
|
|
|
# vim: set ft=python et ts=8 sw=4 sts=4:
|