public static function decodeRequest($encodedRequest, ClientOracle $clientOracle) { if ($encodedRequest == null) { throw new NullPointerException('encodedRequest cannot be null'); } if ($encodedRequest == '') { throw new IllegalArgumentException('encodedRequest cannot be empty'); } try { $decoder = null; try { $decoder = new SimplePayloadDecoder($clientOracle, $encodedRequest); } catch (ClassNotFoundException $e) { throw new IncompatibleRemoteServiceException('Server does not have a type sent by the client', $e); } $streamReader = new CommandServerSerializationStreamReader(); if ($decoder->getThrownValue() != null) { $streamReader->prepareToRead(array($decoder->getThrownValue())); throw new RemoteException($streamReader->readObject()); } else { $streamReader->prepareToRead($decoder->getValues()); } $serviceIntfName = $streamReader->readString(); //$servicePhpName = self::serviceInterfaceToPhpService($serviceIntfName); $serviceIntf = self::getClassForSerializedName($serviceIntfName); if (!Classes::classOf('RemoteService')->isAssignableFrom($serviceIntf)) { throw new IncompatibleRemoteServiceException('Blocked attempt to access interface "' . $serviceIntf->getName() . '" which does not extends RemoteService'); } $servicePhpName = $serviceIntf->getName(); $serviceObject = null; try { $serviceObject = new $servicePhpName(); } catch (Exception $e) { throw new IncompatibleRemoteServiceException('Could not locate requested service "' . $serviceIntfName . '"', $e); } $serviceMethodName = $streamReader->readString(); $paramCount = $streamReader->readInt(); $parameterTypes = array(); for ($i = 0; $i < $paramCount; $i++) { $paramClassName = $streamReader->readString(); try { $parameterTypes[] = self::getClassForSerializedName($paramClassName, $clientOracle); } catch (ClassNotFoundException $e) { throw new IncompatibleRemoteServiceException('Parameter ' . $i . ' of is of an unknown type ' . $paramClassName, $e); } } $method = $serviceIntf->getMethod($serviceMethodName); if ($method == null) { throw new IncompatibleRemoteServiceException('Cound not find the method ' . $serviceMethodName . ' in service ' . $serviceIntfName); } $parameterValues = array(); for ($i = 0; $i < $paramCount; $i++) { $parameterValues[] = Accessors::get($parameterTypes[$i])->readNext($streamReader); } return new RpcRequest($serviceObject, $method, $parameterValues); } catch (SerializationException $e) { throw new IncompatibleRemoteServiceException($e->getMessage(), $e); } }
if (!$this->clientOracle->isScript()) { $fieldDeclClassName = $this->readCommand('StringValueCommand')->getValue(); if ($fieldDeclClassName != null) { $clazz = $this->findClass($fieldDeclClassName); } } $fieldId = $this->readCommand('StringValueCommand')->getValue(); $data = $this->clientOracle->getFieldName($clazz, $fieldId); $value = $this->readCommand('ValueCommand'); $x->set($data->class, $data->fieldName, $value); } private function readSetters(Clazz $clazz, HasSetters $x) { $length = $this->readCommand('IntValueCommand')->getValue(); for ($i = 0; $i < $length; $i++) { $this->readSetter($clazz, $x); } } private function token() { $buffer = ''; $n = $this->next(); while ($n != RPC_SEPARATOR_CHAR) { $buffer .= $n; $n = $this->next(); } return $buffer; } } SimplePayloadDecoder::init();