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.
46 lines
1.4 KiB
46 lines
1.4 KiB
"""
|
|
@author Georg Hopp
|
|
|
|
"""
|
|
from contextlib import contextmanager
|
|
|
|
import Transport
|
|
|
|
from Event.EventHandler import EventHandler
|
|
from Communication.EndPoint import CommunicationEndPoint
|
|
|
|
class IoHandler(EventHandler):
|
|
def __init__(self):
|
|
super(IoHandler, self).__init__()
|
|
|
|
self._event_methods = {
|
|
CommunicationEndPoint.eventId('read_ready') : self._read,
|
|
CommunicationEndPoint.eventId('write_ready') : self._write
|
|
}
|
|
|
|
@contextmanager
|
|
def _doio(self, subject, shutdown_type):
|
|
try:
|
|
yield
|
|
except Transport.Error as error:
|
|
if Transport.Error.ERR_REMOTE_CLOSE == error.errno:
|
|
self.issueEvent(subject, shutdown_type)
|
|
else:
|
|
self.issueEvent(subject, 'close')
|
|
|
|
def _read(self, event):
|
|
with self._doio(event.subject, 'shutdown_read'):
|
|
if event.subject.bufferRead():
|
|
self.issueEvent(event.subject, 'new_data')
|
|
|
|
def _write(self, event):
|
|
with self._doio(event.subject, 'shutdown_write'):
|
|
if event.subject.writeBuffered():
|
|
if event.subject.hasPendingData():
|
|
self.issueEvent(event.subject, 'pending_data')
|
|
else:
|
|
self.issueEvent(event.subject, 'end_data')
|
|
if event.subject.shouldClose():
|
|
self.issueEvent(event.subject, 'close')
|
|
|
|
# vim: set ft=python et ts=4 sw=4 sts=4:
|