Hoa central
Message.php
Go to the documentation of this file.
1 <?php
2 
38 
39 use Hoa\Core;
40 
50 class Message
51 {
57  const VALUE = 0;
58 
64  const TYPE = 1;
65 
71  const TYPE_ARRAY = 2;
72 
78  const TYPE_BASE64 = 3;
79 
85  const TYPE_BOOLEAN = 4;
86 
92  const TYPE_DATETIME = 5;
93 
99  const TYPE_FLOAT = 6;
100 
106  const TYPE_INTEGER = 7;
107 
113  const TYPE_STRING = 8;
114 
120  const TYPE_STRUCTURE = 9;
121 
127  const TYPE_NULL = 10;
128 
134  const IS_SCALAR = 11;
135 
141  const IS_ARRAY = 12;
142 
148  const IS_STRUCTURE = 13;
149 
155  protected $_values = [];
156 
162  protected $_parent = null;
163 
169  protected $_name = 'undefined';
170 
176  protected $_is = self::IS_SCALAR;
177 
178 
179 
189  public function __construct($is = self::IS_SCALAR, $parent = null)
190  {
191  $this->_is = $is;
192  $this->setParent($parent);
193 
194  return;
195  }
196 
204  protected function _with($value, $type)
205  {
206  if (self::IS_STRUCTURE == $this->_is) {
207  $this->_values[$this->_name] = [$value, $type];
208  } else {
209  $this->_values[] = [$value, $type];
210  }
211 
212  return $this;
213  }
214 
220  public function withArray()
221  {
222  $self = __CLASS__;
223 
224  return new $self(self::IS_ARRAY, $this);
225  }
226 
232  public function endArray()
233  {
234  $parent = $this->getParent();
235  $parent->_with($this->getValues(), self::TYPE_ARRAY);
236 
237  return $parent;
238  }
239 
246  public function withBase64($data)
247  {
248  return $this->_with($data, self::TYPE_BASE64);
249  }
250 
257  public function withBoolean($data)
258  {
259  return $this->_with((boolean) $data, self::TYPE_BOOLEAN);
260  }
261 
268  public function withDateTime($timestamp)
269  {
270  return $this->_with($timestamp, self::TYPE_DATETIME);
271  }
272 
279  public function withFloat($float)
280  {
281  return $this->_with((float) $float, self::TYPE_FLOAT);
282  }
283 
290  public function withInteger($integer)
291  {
292  return $this->_with((int) $integer, self::TYPE_INTEGER);
293  }
294 
301  public function withString($string)
302  {
303  return $this->_with((string) $string, self::TYPE_STRING);
304  }
305 
312  public function withStructure()
313  {
314  $self = __CLASS__;
315 
316  return new $self(self::IS_STRUCTURE, $this);
317  }
318 
325  public function withName($name)
326  {
327  if (self::IS_STRUCTURE !== $this->_is) {
328  return $this;
329  }
330 
331  $this->_name = $name;
332 
333  return $this;
334  }
335 
341  public function endStructure()
342  {
343  $parent = $this->getParent();
344  $parent->_with($this->getValues(), self::TYPE_STRUCTURE);
345 
346  return $parent;
347  }
348 
355  public function withNull()
356  {
357  return $this->_with(null, self::TYPE_NULL);
358  }
359 
366  protected function setParent($parent)
367  {
368  $old = $this->_parent;
369  $this->_parent = $parent;
370 
371  return $old;
372  }
373 
379  public function getParent()
380  {
381  return $this->_parent;
382  }
383 
389  public function getValues()
390  {
391  return $this->_values;
392  }
393 
401  public function getValueAsString($value, $type)
402  {
403  switch ($type) {
404  case self::TYPE_ARRAY:
405  $out = '<array>' . "\n" . ' <data>' . "\n";
406 
407  foreach ($value as $v) {
408  $out .=
409  ' <value>' . $this->getValueAsString(
410  $v[self::VALUE],
411  $v[self::TYPE]
412  ) . '</value>' . "\n";
413  }
414 
415  return $out . ' </data>' . "\n" . '</array>';
416 
417  case self::TYPE_BASE64:
418  return '<base64>' . base64_encode($value) . '</base64>';
419 
420  case self::TYPE_BOOLEAN:
421  return '<boolean>' . (true == $value ? '1' : '0') . '</boolean>';
422 
423  case self::TYPE_DATETIME:
424  return '<dateTime.iso8601>' . date('c', $value) . '</dateTime.iso8601>';
425 
426  case self::TYPE_FLOAT:
427  return '<double>' . $value . '</double>';
428 
429  case self::TYPE_INTEGER:
430  return '<i4>' . $value . '</i4>';
431 
432  case self::TYPE_STRING:
433  return '<string>' . htmlspecialchars($value) . '</string>';
434 
435  case self::TYPE_STRUCTURE:
436  $out = '<struct>' . "\n";
437 
438  foreach ($value as $name => $v) {
439  $out .=
440  ' <member>' . "\n" .
441  ' <name>' . $name . '</name>' . "\n" .
442  ' <value>' . $this->getValueAsString(
443  $v[self::VALUE],
444  $v[self::TYPE]
445  ) . '</value>' . "\n" .
446  ' </member>' . "\n";
447  }
448 
449  return $out . '</struct>';
450 
451  case self::TYPE_NULL:
452  return '<nil />';
453  }
454  }
455 
461  public function getFormattedValues()
462  {
463  return $this->_getFormattedValues($this->getValues());
464  }
465 
471  protected function _getFormattedValues($values)
472  {
473  if (!is_array($values)) {
474  return $values;
475  }
476 
477  $formatted = [];
478 
479  foreach ($values as $key => $value) {
480  $formatted[$key] = $this->_getFormattedValues($value[self::VALUE]);
481  }
482 
483  return $formatted;
484  }
485 
493  protected function computeValues($values, $self = null)
494  {
495  if (null === $self) {
496  $self = $this;
497  }
498 
499  if (!is_array($values)) {
500  $values = [$values];
501  }
502 
503  foreach ($values as $value) {
504  switch (strtolower($value->getName())) {
505  case 'array':
506  $self = $self->withArray();
507 
508  foreach ($value->data as $data) {
509  $this->computeValues($data->xpath('./value/*'), $self);
510  }
511 
512  $self = $self->endArray();
513 
514  break;
515 
516  case 'base64':
517  $self->withBase64(base64_decode($value->readAll()));
518 
519  break;
520 
521  case 'boolean':
522  $self->withBoolean((boolean) (int) $value->readAll());
523 
524  break;
525 
526  case 'datetime.iso8601':
527  $self->withDateTime(strtotime($value->readAll()));
528 
529  break;
530 
531  case 'double':
532  $self->withFloat((float) $value->readAll());
533 
534  break;
535 
536  case 'i4':
537  case 'int':
538  $self->withInteger((int) $value->readAll());
539 
540  break;
541 
542  case 'string':
543  $self->withString(htmlspecialchars_decode($value->readAll()));
544 
545  break;
546 
547  case 'struct':
548  $self = $self->withStructure();
549 
550  foreach ($value->member as $member) {
551  $self->withName($member->name->readAll());
552  $this->computeValues($member->xpath('./value/*'), $self);
553  }
554 
555  $self = $self->endStructure();
556 
557  break;
558 
559  case 'nil':
560  $self->withNull();
561 
562  break;
563  }
564  }
565 
566  return;
567  }
568 }
569 
573 Core\Consistency::flexEntity('Hoa\XmlRpc\Message\Message');
_with($value, $type)
Definition: Message.php:204
__construct($is=self::IS_SCALAR, $parent=null)
Definition: Message.php:189
getValueAsString($value, $type)
Definition: Message.php:401
computeValues($values, $self=null)
Definition: Message.php:493
withDateTime($timestamp)
Definition: Message.php:268