Exemplo n.º 1
0
 /**
  * @internal
  */
 public static function fixUnpackedUInt64($payload, $field)
 {
     // uint64 is unpacked as 8 uint8 values, collect and decode them
     return Base256::decode(self::collectUnpackedArray($payload, $field, 8));
 }
Exemplo n.º 2
0
 /**
  * @internal
  */
 private function handleResponse($packet, $directCallbackDispatch)
 {
     $uid = Base256::decode(self::collectUnpackedArray(unpack('C4uid', $packet), 'uid', 4));
     $header = unpack('Clength/CfunctionID/CsequenceNumberAndOptions/CerrorCodeAndFutureUse', substr($packet, 4));
     $header['uid'] = $uid;
     $functionID = $header['functionID'];
     $sequenceNumber = $header['sequenceNumberAndOptions'] >> 4 & 0xf;
     $payload = substr($packet, 8);
     $this->nextDisconnectProbe = microtime(true) + self::DISCONNECT_PROBE_INTERVAL;
     if ($sequenceNumber == 0 && $functionID == self::CALLBACK_ENUMERATE) {
         if (array_key_exists(self::CALLBACK_ENUMERATE, $this->registeredCallbacks)) {
             if ($directCallbackDispatch) {
                 if ($this->socket === FALSE) {
                     return;
                 }
                 $this->handleEnumerate($header, $payload);
             } else {
                 array_push($this->pendingCallbacks, array($header, $payload));
             }
         }
         return;
     }
     if (!array_key_exists($uid, $this->devices)) {
         // Response from an unknown device, ignoring it
         return;
     }
     $device = $this->devices[$uid];
     if ($sequenceNumber == 0) {
         if (array_key_exists($functionID, $device->registeredCallbacks)) {
             if ($directCallbackDispatch) {
                 if ($this->socket === FALSE) {
                     return;
                 }
                 $device->handleCallback($header, $payload);
             } else {
                 array_push($device->pendingCallbacks, array($header, $payload));
             }
         }
         return;
     }
     if ($device->expectedResponseFunctionID == $functionID && $device->expectedResponseSequenceNumber == $sequenceNumber) {
         $device->receivedResponse = array($header, $payload);
         return;
     }
     // Response seems to be OK, but can't be handled
 }