Index: twisted/internet/interfaces.py =================================================================== --- twisted/internet/interfaces.py (revision 28429) +++ twisted/internet/interfaces.py (working copy) @@ -387,7 +387,35 @@ @return: An object which provides L{IListeningPort}. """ +class IReactorWin32Events(Interface): + """ + Win32 Event API methods + """ + + def addEvent(event, fd, action): + """ + Add a new win32 event to the event loop. + + @param event: a Win32 event object created using win32event.CreateEvent() + + @param fd: an instance of L{twisted.internet.abstract.FileDescriptor} + + @param action: a callable, called in response to the registered event + + @return: None + """ + def removeEvent(event): + """ + Remove an event. + + @param event: a Win32 event object added using L{IReactorWin32Events.addEvent} + + @return: None + """ + + + class IReactorUDP(Interface): """ UDP socket methods. Index: twisted/internet/win32eventreactor.py =================================================================== --- twisted/internet/win32eventreactor.py (revision 28429) +++ twisted/internet/win32eventreactor.py (working copy) @@ -57,7 +57,7 @@ # Twisted imports from twisted.internet import posixbase from twisted.python import log, threadable, failure -from twisted.internet.interfaces import IReactorFDSet, IReactorProcess +from twisted.internet.interfaces import IReactorFDSet, IReactorProcess, IReactorWin32Events from twisted.internet._dumbwin32proc import Process @@ -76,7 +76,7 @@ @ivar _events: A dictionary mapping win32 event object to tuples of L{FileDescriptor} instances and event masks. """ - implements(IReactorFDSet, IReactorProcess) + implements(IReactorFDSet, IReactorProcess, IReactorWin32Events) dummyEvent = CreateEvent(None, 0, 0, None) Index: twisted/internet/_win32serialport.py =================================================================== --- twisted/internet/_win32serialport.py (revision 28429) +++ twisted/internet/_win32serialport.py (working copy) @@ -21,6 +21,7 @@ from twisted.protocols import basic from twisted.internet import abstract from twisted.python import log +from twisted.internet.interfaces import IReactorWin32Events # sibling imports from serialport import BaseSerialPort @@ -34,6 +35,9 @@ def __init__(self, protocol, deviceNameOrPortNumber, reactor, baudrate = 9600, bytesize = EIGHTBITS, parity = PARITY_NONE, stopbits = STOPBITS_ONE, xonxoff = 0, rtscts = 0): + + assert IReactorWin32Events.providedBy(reactor), "win32eventreactor needs to be installed for use with SerialPort on Win32. e.g.\nfrom twisted.internet import win32eventreactor\nwin32eventreactor.install()" + self._serial = serial.Serial(deviceNameOrPortNumber, baudrate=baudrate, bytesize=bytesize, parity=parity, stopbits=stopbits, timeout=None, @@ -52,7 +56,7 @@ self._overlappedRead.hEvent = win32event.CreateEvent(None, 1, 0, None) self._overlappedWrite = win32file.OVERLAPPED() self._overlappedWrite.hEvent = win32event.CreateEvent(None, 0, 0, None) - + self.reactor.addEvent(self._overlappedRead.hEvent, self, 'serialReadEvent') self.reactor.addEvent(self._overlappedWrite.hEvent, self, 'serialWriteEvent')