def serialReadEvent(self): #get that character we set up n = win32file.GetOverlappedResult(self._serial.hComPort, self._overlappedRead, 0) if n: first = str(self.read_buf[:n]) #now we should get everything that is already in the buffer flags, comstat = win32file.ClearCommError(self._serial.hComPort) if comstat.cbInQue: win32event.ResetEvent(self._overlappedRead.hEvent) rc, buf = win32file.ReadFile( self._serial.hComPort, win32file.AllocateReadBuffer(comstat.cbInQue), self._overlappedRead) n = win32file.GetOverlappedResult(self._serial.hComPort, self._overlappedRead, 1) #handle all the received data: self.protocol.dataReceived(first + str(buf[:n])) else: #handle all the received data: self.protocol.dataReceived(first) #set up next one win32event.ResetEvent(self._overlappedRead.hEvent) rc, self.read_buf = win32file.ReadFile(self._serial.hComPort, win32file.AllocateReadBuffer(1), self._overlappedRead)
def test_connect_without_payload(self): giveup_event = win32event.CreateEvent(None, 0, 0, None) t = threading.Thread(target=self.connect_thread_runner, args=(False, giveup_event)) t.start() time.sleep(0.1) s2 = socket.socket() ol = pywintypes.OVERLAPPED() s2.bind(('0.0.0.0', 0)) # connectex requires the socket be bound beforehand try: win32file.ConnectEx(s2, self.addr, ol) except win32file.error as exc: win32event.SetEvent(giveup_event) if exc.winerror == 10022: # WSAEINVAL raise TestSkipped("ConnectEx is not available on this platform") raise # some error error we don't expect. win32file.GetOverlappedResult(s2.fileno(), ol, 1) ol = pywintypes.OVERLAPPED() buff = win32file.AllocateReadBuffer(1024) win32file.WSARecv(s2, buff, ol, 0) length = win32file.GetOverlappedResult(s2.fileno(), ol, 1) self.response = buff[:length] self.assertEqual(self.response, str2bytes('some expected response')) t.join(5) self.failIf(t.isAlive(), "worker thread didn't terminate")
def readuntil(self, char): "read bytes from serial port until char is hit" if not self.hComPort: raise portNotOpenError print thetime(), "readuntil entered" overlapped = win32file.OVERLAPPED() overlapped.hEvent = win32event.CreateEvent(None, 1, 0, None) dcb = win32file.GetCommState(self.hComPort) oldevt = dcb.EvtChar dcb.EvtChar = char rc = win32file.SetCommState(self.hComPort, dcb) print thetime(), "setcommstate returned", rc oldmask = win32file.GetCommMask(self.hComPort) rc = win32file.SetCommMask(self.hComPort, win32file.EV_RXFLAG) print thetime(), "setcommmask returned", rc rc, mask = win32file.WaitCommEvent(self.hComPort, overlapped) print thetime(), "waitcommevent returned", rc, mask rc = win32event.WaitForSingleObject(overlapped.hEvent, 10000) print thetime(), "waitforsingleobject returned", rc n = win32file.GetOverlappedResult(self.hComPort, overlapped, 0) print thetime(), "getoverlappedresult returned", n win32file.SetCommMask(self.hComPort, oldmask) flags, comstat = win32file.ClearCommError(self.hComPort) print thetime(), "clearcommerror", flags, comstat.cbInQue rc, buf = win32file.ReadFile( self.hComPort, win32file.AllocateReadBuffer(comstat.cbInQue), overlapped) print thetime(), "readfile retrurned", rc n = win32file.GetOverlappedResult(self.hComPort, overlapped, 1) print thetime(), "getoverlappedresult returned", n read = str(buf[:n]) return read
def run(self): continueloop = True n = 1 waitingOnRead = False buf = win32file.AllocateReadBuffer(n) while continueloop: if self.EVENT.isSet(): win32event.SetEvent(self.stopevent) if not waitingOnRead: win32event.ResetEvent(self.serial._overlappedRead.hEvent) hr, _ = win32file.ReadFile(self.serial.hComPort, buf, self.serial._overlappedRead) if hr == 997: waitingOnRead = True elif hr == 0: pass else: raise rc = win32event.MsgWaitForMultipleObjects((self.serial._overlappedRead.hEvent, self.stopevent), 0, 1000, win32event.QS_ALLINPUT) if rc == win32event.WAIT_OBJECT_0: n = win32file.GetOverlappedResult(self.serial.hComPort, self.serial._overlappedRead, 1) if n and not self.EVENT.isSet(): self.plugin.Decode(ord(buf[0])) waitingOnRead = False elif rc == win32event.WAIT_OBJECT_0+1: continueloop = False elif rc == win32event.WAIT_TIMEOUT: pass else: pass self.serial.close()
def data(self): ur"""Wait until the IO has completed and return the data from the read. This is expected to be called after is_complete is true. """ n_bytes = win32file.GetOverlappedResult(self.handle, self.overlapped, True) return str(self.buffer)[:n_bytes]
def _watcherThreadOverlapped(self, dn, dh, changes): flags = win32con.FILE_NOTIFY_CHANGE_FILE_NAME buf = win32file.AllocateReadBuffer(8192) overlapped = pywintypes.OVERLAPPED() overlapped.hEvent = win32event.CreateEvent(None, 0, 0, None) while 1: win32file.ReadDirectoryChangesW( dh, buf, False, #sub-tree flags, overlapped) # Wait for our event, or for 5 seconds. rc = win32event.WaitForSingleObject(overlapped.hEvent, 5000) if rc == win32event.WAIT_OBJECT_0: # got some data! Must use GetOverlappedResult to find out # how much is valid! 0 generally means the handle has # been closed. Blocking is OK here, as the event has # already been set. nbytes = win32file.GetOverlappedResult(dh, overlapped, True) if nbytes: bits = win32file.FILE_NOTIFY_INFORMATION(buf, nbytes) changes.extend(bits) else: # This is "normal" exit - our 'tearDown' closes the # handle. # print "looks like dir handle was closed!" return else: print("ERROR: Watcher thread timed-out!") return # kill the thread!
def receivebyte(self, RDtimeout=0): """read num bytes from serial port""" if not self.hComPort: raise portNotOpenError timeouts = (win32con.MAXDWORD, win32con.MAXDWORD, int(RDtimeout * 100), 0, 0) # timeouts in 100 ms units... win32file.SetCommTimeouts(self.hComPort, timeouts) win32event.ResetEvent(self._overlappedRead.hEvent) flags, comstat = win32file.ClearCommError(self.hComPort) n = comstat.cbInQue if n > 0: # there is data in buffer rc, buf = win32file.ReadFile(self.hComPort, win32file.AllocateReadBuffer(1), self._overlappedRead) win32event.WaitForSingleObject(self._overlappedRead.hEvent, win32event.INFINITE) read = buf[0] else: rc, buf = win32file.ReadFile(self.hComPort, win32file.AllocateReadBuffer(1), self._overlappedRead) n = win32file.GetOverlappedResult(self.hComPort, self._overlappedRead, 1) if n > 0: read = buf[0] else: read = -1 return read
def testTransactNamedPipeAsync(self): event = threading.Event() overlapped = pywintypes.OVERLAPPED() overlapped.hEvent = win32event.CreateEvent(None, 0, 0, None) self.startPipeServer(event, 0.5) open_mode = win32con.GENERIC_READ | win32con.GENERIC_WRITE hpipe = win32file.CreateFile( self.pipename, open_mode, 0, # no sharing None, # default security win32con.OPEN_EXISTING, win32con.FILE_FLAG_OVERLAPPED, None, ) # set to message mode. win32pipe.SetNamedPipeHandleState( hpipe, win32pipe.PIPE_READMODE_MESSAGE, None, None ) buffer = win32file.AllocateReadBuffer(1024) hr, got = win32pipe.TransactNamedPipe( hpipe, str2bytes("foo\0bar"), buffer, overlapped ) self.assertEqual(hr, winerror.ERROR_IO_PENDING) nbytes = win32file.GetOverlappedResult(hpipe, overlapped, True) got = buffer[:nbytes] self.assertEqual(got, str2bytes("bar\0foo")) event.wait(5) self.assertTrue(event.isSet(), "Pipe server thread didn't terminate")
def Write(self, data, timeout): if self.handle: try: self.lockObject.acquire() if eg.debugLevel: print("writing " + str(len(data)) + " bytes to " + self.getName()) if not self._overlappedWrite: self._overlappedWrite = win32file.OVERLAPPED() err, n = win32file.WriteFile(self.handle, data, self._overlappedWrite) if err: #will be ERROR_IO_PENDING: # Wait for the write to complete. n = win32file.GetOverlappedResult(self.handle, self._overlappedWrite, 1) if n != len(data): raise Exception("could not write full data") elif n != len(data): raise Exception("could not write full data") if timeout: #waits for response from device win32event.ResetEvent(self._overlappedRead.hEvent) res = win32event.WaitForSingleObject( self._overlappedRead.hEvent, timeout) if res == win32event.WAIT_TIMEOUT: raise Exception( "no response from device within timeout") finally: self.lockObject.release() else: raise Exception("invalid handle")
def acceptWorker(self, port, running_event, stopped_event): listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM) listener.bind(('', port)) listener.listen(200) # create accept socket accepter = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # An overlapped overlapped = pywintypes.OVERLAPPED() overlapped.hEvent = win32event.CreateEvent(None, 0, 0, None) # accept the connection. # We used to allow strings etc to be passed here, and they would be # modified! Obviously this is evil :) buffer = " " * 1024 # EVIL - SHOULD NOT BE ALLOWED. self.assertRaises(TypeError, win32file.AcceptEx, listener, accepter, buffer, overlapped) # This is the correct way to allocate the buffer... buffer = win32file.AllocateReadBuffer(1024) rc = win32file.AcceptEx(listener, accepter, buffer, overlapped) self.failUnlessEqual(rc, winerror.ERROR_IO_PENDING) # Set the event to say we are all ready running_event.set() # and wait for the connection. rc = win32event.WaitForSingleObject(overlapped.hEvent, 2000) if rc == win32event.WAIT_TIMEOUT: self.fail("timed out waiting for a connection") nbytes = win32file.GetOverlappedResult(listener.fileno(), overlapped, False) #fam, loc, rem = win32file.GetAcceptExSockaddrs(accepter, buffer) accepter.send(buffer[:nbytes]) # NOT set in a finally - this means *successfully* stopped! stopped_event.set()
def read(self, size=1): """Read size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.""" if not self.hComPort: raise portNotOpenError if size > 0: win32event.ResetEvent(self._overlappedRead.hEvent) flags, comstat = win32file.ClearCommError(self.hComPort) if self.timeout == 0: n = min(comstat.cbInQue, size) if n > 0: rc, buf = win32file.ReadFile( self.hComPort, win32file.AllocateReadBuffer(n), self._overlappedRead) win32event.WaitForSingleObject(self._overlappedRead.hEvent, win32event.INFINITE) read = str(buf) else: read = '' else: rc, buf = win32file.ReadFile( self.hComPort, win32file.AllocateReadBuffer(size), self._overlappedRead) n = win32file.GetOverlappedResult(self.hComPort, self._overlappedRead, 1) read = str(buf[:n]) else: read = '' return read
def _loop_asynchronous(self, callback): buf = win32file.AllocateReadBuffer(8192) overlapped = pywintypes.OVERLAPPED() overlapped.hEvent = win32event.CreateEvent(None, 0, 0, None) while not self._stopped: win32file.ReadDirectoryChangesW(self._hdir, buf, self._recurse, self._filter, overlapped) ## ## This will block until notification OR timeout. ## rc = win32event.WaitForSingleObject(overlapped.hEvent, self._timeout) if rc == win32event.WAIT_OBJECT_0: ## got event: determine data length .. n = win32file.GetOverlappedResult(self._hdir, overlapped, True) if n: ## retrieve data results = win32file.FILE_NOTIFY_INFORMATION(buf, n) r = [(DirWatcher._ACTIONS.get(x[0], "UNKNOWN"), x[1]) for x in results] if len(r) > 0: callback(r) else: # directory handled was closed self._stopped = True else: ## timeout pass
def write(self, s): try: win32file.WriteFile(self._hfile, s, self._write_ovrlpd) return win32file.GetOverlappedResult(self._hfile, self._write_ovrlpd, True) except: return 0
def testAcceptEx(self): port = 4680 running = threading.Event() stopped = threading.Event() t = threading.Thread(target=self.acceptWorker, args=(port, running, stopped)) t.start() running.wait(2) if not running.isSet(): self.fail("AcceptEx Worker thread failed to start") s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', port)) win32file.WSASend(s, str2bytes("hello"), None) overlapped = pywintypes.OVERLAPPED() overlapped.hEvent = win32event.CreateEvent(None, 0, 0, None) # Like above - WSARecv used to allow strings as the receive buffer!! buffer = " " * 10 self.assertRaises(TypeError, win32file.WSARecv, s, buffer, overlapped) # This one should work :) buffer = win32file.AllocateReadBuffer(10) win32file.WSARecv(s, buffer, overlapped) nbytes = win32file.GetOverlappedResult(s.fileno(), overlapped, True) got = buffer[:nbytes] self.failUnlessEqual(got, str2bytes("hello")) # thread should have stopped stopped.wait(2) if not stopped.isSet(): self.fail("AcceptEx Worker thread failed to successfully stop")
def read(self, size=1): "read num bytes from serial port" if not self.hComPort: raise portNotOpenError read = '' if size > 0: overlapped = win32file.OVERLAPPED() overlapped.hEvent = win32event.CreateEvent(None, 1, 0, None) if self.timeout == 0: flags, comstat = win32file.ClearCommError(self.hComPort) n = min(comstat.cbInQue, size) if n > 0: rc, buf = win32file.ReadFile( self.hComPort, win32file.AllocateReadBuffer(n), overlapped) win32event.WaitForSingleObject(overlapped.hEvent, win32event.INFINITE) read = str(buf) else: flags, comstat = win32file.ClearCommError(self.hComPort) rc, buf = win32file.ReadFile( self.hComPort, win32file.AllocateReadBuffer(size), overlapped) n = win32file.GetOverlappedResult(self.hComPort, overlapped, 1) read = str(buf[:n]) return read
def _read_watch(self, watch): if win32event.WaitForSingleObject(watch.event, 0) \ == win32event.WAIT_TIMEOUT: nbytes = 0 else: nbytes = win32file.GetOverlappedResult(watch.handle, watch.overlapped, False) return win32file.FILE_NOTIFY_INFORMATION(watch.buffer, nbytes)
def read(self, timeout=0, buf_sz=0): if self.transport == Pipe.Transport.ASYNCHRONOUS: if timeout is None: evTimeout = 50 # 50ms is the default value per MSDN docs. elif int(timeout) == 0: evTimeout = 50 # 50ms is the default value per MSDN docs. else: evTimeout = int(timeout) stream = self._getOverlappedStruct() if buf_sz <= 0: buf_sz = 2048 ov_buf = w32f.AllocateReadBuffer(buf_sz) pipe_data = '' while True: try: pipe_status, pipe_buffer = w32f.ReadFile( self.__hPipe, ov_buf, stream ) except WinT.error, e: if e.args[0] == werr.ERROR_BROKEN_PIPE: return 1, stream.Offset, pipe_data else: raise if pipe_status == 0 or \ pipe_status == werr.ERROR_IO_PENDING: #TODO: Return stream and then prompt user to fetch data. if pipe_status == werr.ERROR_IO_PENDING: self.__waitForEvent(stream, evTimeout) try: read_bytes = w32f.GetOverlappedResult( self.__hPipe, stream, False ) except WinT.error, e: if e.args[0] == werr.ERROR_MORE_DATA: ov_buf = self.__expandBufferPipe(buf_sz) stream.Offset += len(pipe_buffer) pipe_data += pipe_buffer continue elif e.args[0] == werr.ERROR_BROKEN_PIPE: return 1, stream.Offset, pipe_data else: raise elif pipe_status == werr.ERROR_MORE_DATA: ov_buf = self.__expandBufferPipe(buf_sz) stream.Offset += len(pipe_buffer) pipe_data += pipe_buffer continue else: raise PipeError( 'Pipe encountered a fatal error!', 'error_code', w32api.GetLastError() ) stream.Offset += read_bytes pipe_data += pipe_buffer[:read_bytes] if read_bytes < len(pipe_buffer): return 0, stream.Offset, pipe_data
def read(self): if win32event.WaitForSingleObject(self.event, 0) \ == win32event.WAIT_TIMEOUT: result = [] else: nbytes = win32file.GetOverlappedResult(self.handle, self.overlapped, False) result = win32file.FILE_NOTIFY_INFORMATION(self.buffer, nbytes) self._start() return result
def pipeRead(self): """ Read some data """ n = win32file.GetOverlappedResult(self._handle, self._olapped_io, 0) data = self._read_buffer[:n] self.dataReceived(data) win32event.ResetEvent(self._olapped_io.hEvent) win32file.ReadFile(self._handle, self._read_buffer, self._olapped_io)
def write(self, s): try: win32file.WriteFile(self._hfile, s, self._write_ovrlpd) return win32file.GetOverlappedResult(self._hfile, self._write_ovrlpd, True) except: logging.debug("Exception writing to VirtIO", exc_info=True) # We do sleep here to avoid constant writes to spike the CPU time.sleep(1) return 0
def read(self, n): (nr, buf) = (0, ()) try: (hr, buf) = win32file.ReadFile(self._hfile, win32file.AllocateReadBuffer(n), self._read_ovrlpd) nr = win32file.GetOverlappedResult(self._hfile, self._read_ovrlpd, True) except: pass return buf[:nr]
def read(self, n): (nr, buf) = (0, ()) try: (hr, buf) = win32file.ReadFile(self._hfile, win32file.AllocateReadBuffer(n), self._read_ovrlpd) nr = win32file.GetOverlappedResult(self._hfile, self._read_ovrlpd, True) except: logging.debug("Exception on reading from VirtIO", exc_info=True) # We do sleep here to avoid constant reads spike the CPU time.sleep(1) return buf[:nr]
def write(self, data): self.write_lock.acquire() writelen = 0 try: win32event.ResetEvent(self.write_overlapped.hEvent) err, writelen = win32file.WriteFile(self.handle, data, self.write_overlapped) if err == 997: writelen = win32file.GetOverlappedResult( self.handle, self.write_overlapped, True) finally: self.write_lock.release() return writelen
def run(self): hDir = win32file.CreateFileW( self._watch_path, FILE_LIST_DIRECTORY, win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE, None, win32con.OPEN_EXISTING, win32con.FILE_FLAG_BACKUP_SEMANTICS | win32con.FILE_FLAG_OVERLAPPED, None ) while self._windows_sucks_flag: buf = win32file.AllocateReadBuffer(1024) win32file.ReadDirectoryChangesW( hDir, buf, True, win32con.FILE_NOTIFY_CHANGE_FILE_NAME | win32con.FILE_NOTIFY_CHANGE_DIR_NAME | win32con.FILE_NOTIFY_CHANGE_SIZE | win32con.FILE_NOTIFY_CHANGE_LAST_WRITE, self._overlapped ) result_stack = {} rc = win32event.WaitForMultipleObjects((self._wait_stop, self._overlapped.hEvent), 0, win32event.INFINITE) if rc == win32event.WAIT_OBJECT_0: # Stop event break data = win32file.GetOverlappedResult(hDir, self._overlapped, True) # lets read the data and store it in the results results = win32file.FILE_NOTIFY_INFORMATION(buf, data) for action, afile in results: if action in ACTIONS: full_filename = os.path.join(self._watch_path, afile) result_stack.setdefault(full_filename, []).append(ACTIONS.get(action)) keys = list(result_stack.keys()) while len(keys): key = keys.pop(0) event = result_stack.pop(key) if (ADDED in event) and (DELETED in event): event = [e for e in event if e not in (ADDED, DELETED)] noticed = [] for each_event in event: if each_event not in noticed: self._callback(each_event, full_filename) noticed.append(each_event)
def write(self, s): """Output the given string over the serial port.""" if not self.hComPort: raise portNotOpenError if s: #~ win32event.ResetEvent(self._overlappedWrite.hEvent) err, n = win32file.WriteFile(self.hComPort, s, self._overlappedWrite) if err: #will be ERROR_IO_PENDING: # Wait for the write to complete. #~ win32event.WaitForSingleObject(self._overlappedWrite.hEvent, win32event.INFINITE) n = win32file.GetOverlappedResult(self.hComPort, self._overlappedWrite, 1) if n != len(s): raise writeTimeoutError
def test_connect_with_payload(self): giveup_event = win32event.CreateEvent(None, 0, 0, None) t = threading.Thread(target=self.connect_thread_runner, args=(True, giveup_event)) t.start() time.sleep(0.1) s2 = socket.socket() ol = pywintypes.OVERLAPPED() s2.bind(("0.0.0.0", 0)) # connectex requires the socket be bound beforehand try: win32file.ConnectEx(s2, self.addr, ol, str2bytes("some expected request")) except win32file.error as exc: win32event.SetEvent(giveup_event) if exc.winerror == 10022: # WSAEINVAL raise TestSkipped( "ConnectEx is not available on this platform") raise # some error error we don't expect. # We occasionally see ERROR_CONNECTION_REFUSED in automation try: win32file.GetOverlappedResult(s2.fileno(), ol, 1) except win32file.error as exc: win32event.SetEvent(giveup_event) if exc.winerror == winerror.ERROR_CONNECTION_REFUSED: raise TestSkipped( "Assuming ERROR_CONNECTION_REFUSED is transient") raise ol = pywintypes.OVERLAPPED() buff = win32file.AllocateReadBuffer(1024) win32file.WSARecv(s2, buff, ol, 0) length = win32file.GetOverlappedResult(s2.fileno(), ol, 1) self.response = buff[:length] self.assertEqual(self.response, str2bytes("some expected response")) self.assertEqual(self.request, str2bytes("some expected request")) t.join(5) self.failIf(t.is_alive(), "worker thread didn't terminate")
def write(self, data): """Output the given string over the serial port.""" if not self.hComPort: raise portNotOpenError if not isinstance(data, str): raise TypeError('expected str, got %s' % type(data)) #print repr(s), if data: #~ win32event.ResetEvent(self._overlappedWrite.hEvent) err, n = win32file.WriteFile(self.hComPort, data, self._overlappedWrite) if err: #will be ERROR_IO_PENDING: # Wait for the write to complete. #~ win32event.WaitForSingleObject(self._overlappedWrite.hEvent, win32event.INFINITE) n = win32file.GetOverlappedResult(self.hComPort, self._overlappedWrite, 1) if n != len(data): raise writeTimeoutError
def mRead(self, iLen): oOl = pywintypes.OVERLAPPED() oOl.hEvent = win32event.CreateEvent(None, 1, 0, None) if not oOl.hEvent: print('Could not create overlapped handle') raise CommException iEr, sData = win32file.ReadFile(self._oFd, iLen, oOl) if iEr == winerror.ERROR_IO_PENDING: try: iNumRd = win32file.GetOverlappedResult(self._oFd, oOl, 1) except win32api.error: print('...wait error') raise CommException oOl.hEvent.Close() return sData
def read(self): self.read_lock.acquire() result = None try: win32event.ResetEvent(self.read_overlapped.hEvent) err, data = win32file.ReadFile(self.handle, self.buffer, self.read_overlapped) if err == 997: #ERROR_IO_PENDING n = win32file.GetOverlappedResult(self.handle, self.read_overlapped, True) result = bytes(data[:n]) else: result = bytes(data) finally: self.read_lock.release() return result
def mWrite(self, sData): oOl = pywintypes.OVERLAPPED() oOl.hEvent = win32event.CreateEvent(None, 1, 0, None) if not oOl.hEvent: print('could not create overlapped handle') return 0 iEr, iNumWr = win32file.WriteFile(self._oFd, sData, oOl) if iNumWr == 0: if iEr == winerror.ERROR_IO_PENDING: try: iNumWr = win32file.GetOverlappedResult( self._oFd, oOl, 1) except win32api.error: raise CommException oOl.hEvent.Close() return iNumWr