Skip to content

Commit

Permalink
Added support for Countable and IteratorAggregate interfaces
Browse files Browse the repository at this point in the history
  • Loading branch information
gggeek committed Jun 7, 2015
1 parent 5b7db05 commit 751f9c9
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 28 deletions.
2 changes: 2 additions & 0 deletions NEWS
Expand Up @@ -25,6 +25,8 @@ PLEASE READ CAREFULLY THE NOTES BELOW to insure a smooth upgrade.
* improved: no need to call anymore $client->setSSLVerifyHost(2) to silence a curl warning when using https
with recent curl builds

* improved: the xmlrpcval class now supports the interfaces Countable and IteratorAggregate

* improved: a specific option allows users to decide the version of SSL to use for https calls.
This is useful f.e. for the testing suite, when the server target of calls has no proper ssl certificate,
and the cURL extension has been compiled with GnuTLS (such as on Travis VMs)
Expand Down
13 changes: 13 additions & 0 deletions doc/api_changes_v4.md
Expand Up @@ -45,6 +45,19 @@ Conversion table:
| xmlrpcval | PhpXmlRpc\Value | Removed methods: serializeval, getval |


New class methods
-----------------

In case you had extended the classes of the library and added methods to the subclasses, you might find that your
implementation clashes with the new one if you implemented:


| Class | Method | Notes |
| --------- | ----------- | -------------------------------------- |
| xmlrpcval | count | implements interface Countable |
| xmlrpcval | getIterator | implements interface IteratorAggregate |


Global variables cleanup
------------------------

Expand Down
69 changes: 41 additions & 28 deletions src/Value.php
Expand Up @@ -4,7 +4,7 @@

use PhpXmlRpc\Helper\Charset;

class Value
class Value implements \Countable, \IteratorAggregate
{
public static $xmlrpcI4 = "i4";
public static $xmlrpcInt = "int";
Expand Down Expand Up @@ -37,7 +37,8 @@ class Value
public $_php_class = null;

/**
* Build an xmlrpc value
* Build an xmlrpc value.
* When no value or type is passed in, the value is left uninitialized, and the value can be added later
*
* @param mixed $val
* @param string $type any valid xmlrpc type name (lowercase). If null, 'string' is assumed
Expand All @@ -47,7 +48,6 @@ public function __construct($val = -1, $type = '')
// optimization creep - do not call addXX, do it all inline.
// downside: booleans will not be coerced anymore
if ($val !== -1 || $type != '') {
// optimization creep: inlined all work done by constructor
switch ($type) {
case '':
$this->mytype = 1;
Expand Down Expand Up @@ -75,28 +75,11 @@ public function __construct($val = -1, $type = '')
default:
error_log("XML-RPC: " . __METHOD__ . ": not a known type ($type)");
}
/* was:
if($type=='')
{
$type='string';
}
if(static::$xmlrpcTypes[$type]==1)
{
$this->addScalar($val,$type);
}
elseif(static::$xmlrpcTypes[$type]==2)
{
$this->addArray($val);
}
elseif(static::$xmlrpcTypes[$type]==3)
{
$this->addStruct($val);
}*/
}
}

/**
* Add a single php value to an (unitialized) xmlrpc value.
* Add a single php value to an (uninitialized) xmlrpc value.
*
* @param mixed $val
* @param string $type
Expand All @@ -112,7 +95,6 @@ public function addScalar($val, $type = 'string')

if ($typeOf !== 1) {
error_log("XML-RPC: " . __METHOD__ . ": not a scalar type ($type)");

return 0;
}

Expand All @@ -130,11 +112,9 @@ public function addScalar($val, $type = 'string')
switch ($this->mytype) {
case 1:
error_log('XML-RPC: ' . __METHOD__ . ': scalar xmlrpc value can have only one value');

return 0;
case 3:
error_log('XML-RPC: ' . __METHOD__ . ': cannot add anonymous scalar to struct xmlrpc value');

return 0;
case 2:
// we're adding a scalar value to an array here
Expand Down Expand Up @@ -173,7 +153,6 @@ public function addArray($values)
return 1;
} else {
error_log('XML-RPC: ' . __METHOD__ . ': already initialized as a [' . $this->kindOf() . ']');

return 0;
}
}
Expand Down Expand Up @@ -201,13 +180,12 @@ public function addStruct($values)
return 1;
} else {
error_log('XML-RPC: ' . __METHOD__ . ': already initialized as a [' . $this->kindOf() . ']');

return 0;
}
}

/**
* Returns a string containing "struct", "array" or "scalar" describing the base type of the value.
* Returns a string containing "struct", "array", "scalar" or "undef" describing the base type of the value.
*
* @return string
*/
Expand Down Expand Up @@ -428,6 +406,8 @@ public function arraymem($key)
* Returns the number of members in an xmlrpc value of array type.
*
* @return integer
*
* @deprecated use count() instead
*/
public function arraysize()
{
Expand All @@ -438,9 +418,42 @@ public function arraysize()
* Returns the number of members in an xmlrpc value of struct type.
*
* @return integer
*
* @deprecateduse count() instead
*/
public function structsize()
{
return count($this->me['struct']);
}
}

/**
* Returns the number of members in an xmlrpc value:
* - 0 for uninitialized values
* - 1 for scalars
* - the number of elements for structs and arrays
*
* @return integer
*/
public function count()
{
switch ($this->mytype) {
case 3:
count($this->me['struct']);
case 2:
return count($this->me['array']);
case 1:
return 1;
default:
return 0;
}
}

/**
* Implements the IteratorAggregate interface
*
* @return ArrayIterator
*/
public function getIterator() {
return new \ArrayIterator($this->me);
}
}

0 comments on commit 751f9c9

Please sign in to comment.