예제 #1
0
    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)
예제 #2
0
 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")
예제 #3
0
    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
예제 #4
0
    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()
예제 #5
0
 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!
예제 #7
0
    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
예제 #8
0
    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")
예제 #9
0
 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()
예제 #11
0
 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
예제 #12
0
    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
예제 #13
0
 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")
예제 #15
0
 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
예제 #16
0
 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)
예제 #17
0
 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
예제 #18
0
 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
예제 #19
0
    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)
예제 #20
0
 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
예제 #21
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]
예제 #22
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:
         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]
예제 #23
0
 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
예제 #24
0
    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)
예제 #25
0
 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
예제 #26
0
 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")
예제 #27
0
 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
예제 #28
0
        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
예제 #29
0
 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
예제 #30
0
        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