コード例 #1
0
ファイル: _socket.py プロジェクト: sykeben/BITS-PyOS
 def callback():
     if token.CompletionToken.Status:
         self._accept_queue.append(
             (False, token.CompletionToken.Status))
     else:
         self._accept_queue.append((True, token.NewChildHandle))
     self._accept_running = False
     self._events.close_event(efi.EFI_EVENT(
         token.CompletionToken.Event))
コード例 #2
0
ファイル: _socket.py プロジェクト: sykeben/BITS-PyOS
 def callback():
     if token.CompletionToken.Status:
         if token.CompletionToken.Status == efi.EFI_CONNECTION_FIN:
             self._recv_shutdown = True
         else:
             self._recv_queue.append(token.CompletionToken.Status)
     else:
         if sizeof(buf) != rx.DataLength:
             resize(buf, rx.DataLength)
         self._recv_queue.append(buf)
     self._recv_running = False
     self._events.close_event(efi.EFI_EVENT(
         token.CompletionToken.Event))
コード例 #3
0
ファイル: _socket.py プロジェクト: sykeben/BITS-PyOS
    def sendall(self, data, flags=0):
        """sendall(data[, flags])

        Send a data string to the socket.  For the optional flags
        argument, see the Unix manual.  This calls send() repeatedly
        until all data is sent.  If an error occurs, it's impossible
        to tell how much data has been sent."""
        if isinstance(data, memoryview):
            data = data.tobytes()  # ctypes can't handle memoryview directly
        data = (c_uint8 * len(data)).from_buffer_copy(data)
        tx = efi.EFI_TCP4_TRANSMIT_DATA()
        tx.DataLength = len(data)
        tx.FragmentCount = 1
        tx.FragmentTable[0].FragmentLength = len(data)
        tx.FragmentTable[0].FragmentBuffer = cast(data, c_void_p)
        token = efi.EFI_TCP4_IO_TOKEN()
        send_status = []

        def callback():
            _ = data, tx  # Reference objects EFI will access, to keep them alive
            send_status.append(token.CompletionToken.Status)
            self._events.close_event(efi.EFI_EVENT(
                token.CompletionToken.Event))

        token.CompletionToken.Event = self._events.create_event(
            callback, abort=self._abort)
        token.Packet.TxData = pointer(tx)
        status = self._tcp4.Transmit(self._tcp4, byref(token))
        if status:
            self._events.close_event(efi.EFI_EVENT(
                token.CompletionToken.Event))
            efi.check_status(status)
            return
        while not send_status:
            self._poll()
        efi.check_status(send_status[0])
コード例 #4
0
ファイル: _socket.py プロジェクト: sykeben/BITS-PyOS
    def close(self):
        """"close()

        Close the socket.  It cannot be used after this call."""
        if hasattr(self, "closed") and self.closed:
            return
        token = efi.EFI_TCP4_CLOSE_TOKEN()

        def callback():
            if token.CompletionToken.Status:
                print("EFI_TCP4_PROTOCOL Close completed with an error:")
                print(efi.EFIException(token.CompletionToken.Status))
            self._events.close_event(efi.EFI_EVENT(
                token.CompletionToken.Event))

        token.CompletionToken.Event = self._events.create_event(
            callback, abort=self._abort)
        token.AbortOnClose = False
        status = self._tcp4.Close(self._tcp4, byref(token))
        if status:
            self._events.close_event(efi.EFI_EVENT(
                token.CompletionToken.Event))
            efi.check_status(status)
        self.closed = True
コード例 #5
0
ファイル: _socket.py プロジェクト: sykeben/BITS-PyOS
 def callback():
     _ = data, tx  # Reference objects EFI will access, to keep them alive
     send_status.append(token.CompletionToken.Status)
     self._events.close_event(efi.EFI_EVENT(
         token.CompletionToken.Event))
コード例 #6
0
ファイル: _socket.py プロジェクト: sykeben/BITS-PyOS
 def callback():
     self._connect_status = token.CompletionToken.Status
     self._events.close_event(efi.EFI_EVENT(
         token.CompletionToken.Event))
コード例 #7
0
ファイル: _socket.py プロジェクト: sykeben/BITS-PyOS
 def callback():
     if token.CompletionToken.Status:
         print("EFI_TCP4_PROTOCOL Close completed with an error:")
         print(efi.EFIException(token.CompletionToken.Status))
     self._events.close_event(efi.EFI_EVENT(
         token.CompletionToken.Event))