/** * @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)); }
/** * @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 }