Exemplo n.º 1
0
 def process(self, timeout=None):
     if self.proto.connected:
         raise MuxException(
             'Socket is connected, cannot process listener events')
     rlo, wlo, xlo = select.select([self.socket.sock], [],
                                   [self.socket.sock], timeout)
     if xlo:
         self.socket.sock.close()
         raise MuxException('Exception in listener socket')
     if rlo:
         self._processpacket()
Exemplo n.º 2
0
 def _processpacket(self):
     resp, tag, data = self.proto.get_packet()
     if resp == self.proto.TYPE_DEVICE_ADD:
         self.devices.append(
             MuxDevice(data['DeviceID'], data['Properties']['ProductID'],
                       data['Properties']['SerialNumber'],
                       data['Properties']['LocationID']))
     elif resp == self.proto.TYPE_DEVICE_REMOVE:
         for dev in self.devices:
             if dev.devid == data['DeviceID']:
                 self.devices.remove(dev)
     elif resp == self.proto.TYPE_RESULT:
         raise MuxException('Unexpected result: %d' % resp)
     else:
         raise MuxException('Invalid packet type received: %d' % resp)
Exemplo n.º 3
0
 def _getreply(self):
     while True:
         resp, tag, data = self.proto.get_packet()
         if resp == self.proto.TYPE_RESULT:
             return tag, data
         else:
             raise MuxException('Invalid packet type received: %d' % resp)
Exemplo n.º 4
0
 def recv(self, size):
     msg = b''
     while len(msg) < size:
         chunk = self.sock.recv(size - len(msg))
         empty_chunk = b''
         if chunk == empty_chunk:
             raise MuxException('socket connection broken')
         msg = msg + chunk
     return msg
Exemplo n.º 5
0
 def send_packet(self, req, tag, payload=None):
     if payload is None:
         payload = {}
     payload = self._pack(req, payload)
     if self.connected:
         raise MuxException(
             'Mux is connected, cannot issue control packets')
     length = 16 + len(payload)
     data = struct.pack('IIII', length, self.VERSION, req, tag) + payload
     self.socket.send(data)
Exemplo n.º 6
0
 def connect(self, device, port):
     ret = self._exchange(
         self.proto.TYPE_CONNECT, {
             'DeviceID': device.devid,
             'PortNumber': ((port << 8) & 0xFF00) | (port >> 8)
         })
     if ret != 0:
         raise MuxException('Connect failed: error %d' % ret)
     self.proto.connected = True
     return self.socket.sock
Exemplo n.º 7
0
 def _exchange(self, req, payload=None):
     if payload is None:
         payload = {}
     mytag = self.pkttag
     self.pkttag += 1
     self.proto.send_packet(req, mytag, payload)
     recvtag, data = self._getreply()
     if recvtag != mytag:
         raise MuxException('Reply tag mismatch: expected %d, got %d' %
                            (mytag, recvtag))
     return data['Number']
Exemplo n.º 8
0
 def get_pair_record(self, udid):
     tag = self.pkttag
     self.pkttag += 1
     payload = {'PairRecordID': udid}
     self.proto.send_packet('ReadPairRecord', tag, payload)
     _, recvtag, data = self.proto.get_packet()
     if recvtag != tag:
         raise MuxException('Reply tag mismatch: expected %d, got %d' %
                            (tag, recvtag))
     pair_record = data['PairRecordData']
     pair_record = plistlib.loads(pair_record)
     return pair_record
Exemplo n.º 9
0
 def get_packet(self):
     if self.connected:
         raise MuxException(
             'Mux is connected, cannot issue control packets')
     dlen = self.socket.recv(4)
     dlen = struct.unpack('I', dlen)[0]
     body = self.socket.recv(dlen - 4)
     version, resp, tag = struct.unpack('III', body[:0xc])
     if version != self.VERSION:
         raise MuxVersionError('Version mismatch: expected %d, got %d' %
                               (self.VERSION, version))
     payload = self._unpack(resp, body[0xc:])
     return resp, tag, payload
Exemplo n.º 10
0
 def _unpack(self, resp, payload):
     if resp == self.TYPE_RESULT:
         return {'Number': struct.unpack('I', payload)[0]}
     elif resp == self.TYPE_DEVICE_ADD:
         devid, usbpid, serial, pad, location = struct.unpack(
             'IH256sHI', payload)
         serial = serial.split(b'\0')[0]
         return {
             'DeviceID': devid,
             'Properties': {
                 'LocationID': location,
                 'SerialNumber': serial,
                 'ProductID': usbpid
             }
         }
     elif resp == self.TYPE_DEVICE_REMOVE:
         devid = struct.unpack('I', payload)[0]
         return {'DeviceID': devid}
     else:
         raise MuxException('Invalid incoming response type %d' % resp)
Exemplo n.º 11
0
 def listen(self):
     ret = self._exchange(self.proto.TYPE_LISTEN)
     if ret != 0:
         raise MuxException('Listen failed: error %d' % ret)
Exemplo n.º 12
0
 def get_packet(self):
     resp, tag, payload = BinaryProtocol.get_packet(self)
     if resp != self.TYPE_PLIST:
         raise MuxException('Received non-plist type %d' % resp)
     payload = plistlib.loads(payload)
     return payload.get('MessageType', ''), tag, payload