Completed
Push — master ( ac735c...42c180 )
by Gaetano
02:46
created

xmlrpcval::serializeval()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 1
dl 0
loc 12
rs 9.4285
c 0
b 0
f 0
1
<?php
2
// by Edd Dumbill (C) 1999-2002
3
// <[email protected]>
4
5
// Copyright (c) 1999,2000,2002 Edd Dumbill.
6
// All rights reserved.
7
//
8
// Redistribution and use in source and binary forms, with or without
9
// modification, are permitted provided that the following conditions
10
// are met:
11
//
12
//    * Redistributions of source code must retain the above copyright
13
//      notice, this list of conditions and the following disclaimer.
14
//
15
//    * Redistributions in binary form must reproduce the above
16
//      copyright notice, this list of conditions and the following
17
//      disclaimer in the documentation and/or other materials provided
18
//      with the distribution.
19
//
20
//    * Neither the name of the "XML-RPC for PHP" nor the names of its
21
//      contributors may be used to endorse or promote products derived
22
//      from this software without specific prior written permission.
23
//
24
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28
// REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
33
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
35
// OF THE POSSIBILITY OF SUCH DAMAGE.
36
37
/******************************************************************************
38
 *
39
 * *** DEPRECATED ***
40
 *
41
 * This file is only used to insure backwards compatibility
42
 * with the API of the library <= rev. 3
43
 *
44
 * If it is included, the library will work without any further autoloading
45
 *****************************************************************************/
46
47
include_once(__DIR__.'/../src/PhpXmlRpc.php');
48
include_once(__DIR__.'/../src/Value.php');
49
include_once(__DIR__.'/../src/Request.php');
50
include_once(__DIR__.'/../src/Response.php');
51
include_once(__DIR__.'/../src/Client.php');
52
include_once(__DIR__.'/../src/Encoder.php');
53
include_once(__DIR__.'/../src/Helper/Charset.php');
54
include_once(__DIR__.'/../src/Helper/Date.php');
55
include_once(__DIR__.'/../src/Helper/Http.php');
56
include_once(__DIR__.'/../src/Helper/Logger.php');
57
include_once(__DIR__.'/../src/Helper/XMLParser.php');
58
59
60
/* Expose the global variables which used to be defined */
61
PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding = 'ISO-8859-1'; // old default
62
PhpXmlRpc\PhpXmlRpc::exportGlobals();
63
64
/* some stuff deprecated enough that we do not want to put it in the new lib version */
65
66
/// @deprecated
67
$GLOBALS['xmlEntities'] = array(
68
    'amp'  => '&',
69
    'quot' => '"',
70
    'lt'   => '<',
71
    'gt'   => '>',
72
    'apos' => "'"
73
);
74
75
// formulate backslashes for escaping regexp
76
// Not in use anymore since 2.0. Shall we remove it?
77
/// @deprecated
78
$GLOBALS['xmlrpc_backslash'] = chr(92).chr(92);
79
80
/* Expose with the old names the classes which have been namespaced */
81
82
class xmlrpcval extends PhpXmlRpc\Value
83
{
84
    /**
85
     * @deprecated
86
     * @param xmlrpcval $o
87
     * @return string
88
     */
89
    public function serializeval($o)
90
    {
91
        // add check? slower, but helps to avoid recursion in serializing broken xmlrpcvals...
92
        //if (is_object($o) && (get_class($o) == 'xmlrpcval' || is_subclass_of($o, 'xmlrpcval')))
93
        //{
94
        $ar = $o->me;
95
        $val = reset($ar);
96
        $typ = key($ar);
97
98
        return '<value>' . $this->serializedata($typ, $val) . "</value>\n";
99
        //}
100
    }
101
102
    /**
103
     * @deprecated this code looks like it is very fragile and has not been fixed
104
     * for a long long time. Shall we remove it for 2.0?
105
     */
106
    public function getval()
107
    {
108
        // UNSTABLE
109
        $b = reset($this->me);
110
        $a = key($this->me);
0 ignored issues
show
Unused Code introduced by
$a is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
111
        // contributed by I Sofer, 2001-03-24
112
        // add support for nested arrays to scalarval
113
        // i've created a new method here, so as to
114
        // preserve back compatibility
115
116
        if (is_array($b)) {
117
            foreach($b as $id => $cont) {
118
                $b[$id] = $cont->scalarval();
119
            }
120
        }
121
122
        // add support for structures directly encoding php objects
123
        if (is_object($b)) {
124
            $t = get_object_vars($b);
125
            foreach($t as $id => $cont) {
126
                $t[$id] = $cont->scalarval();
127
            }
128
            foreach($t as $id => $cont) {
129
                @$b->$id = $cont;
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
130
            }
131
        }
132
        // end contrib
133
        return $b;
134
    }
135
136
    /// reset functionality added by parent class: same as it would happen if no interface was declared
137
    public function count()
138
    {
139
        return 1;
140
    }
141
142
    /// reset functionality added by parent class: same as it would happen if no interface was declared
143
    public function getIterator() {
144
        return new ArrayIterator($this);
0 ignored issues
show
Bug Best Practice introduced by
The return type of return new \ArrayIterator($this); (ArrayIterator) is incompatible with the return type of the parent method PhpXmlRpc\Value::getIterator of type PhpXmlRpc\ArrayIterator.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
145
    }
146
}
147
148
class xmlrpcmsg extends PhpXmlRpc\Request
149
{
150
}
151
152
class xmlrpcresp extends PhpXmlRpc\Response
153
{
154
}
155
156
class xmlrpc_client extends PhpXmlRpc\Client
157
{
158
}
159
160
/* Expose as global functions the ones which are now class methods */
161
162
/// Wrong speling, but we are adamant on backwards compatibility!
163
function xmlrpc_encode_entitites($data, $srcEncoding='', $destEncoding='')
164
{
165
    return PhpXmlRpc\Helper\Charset::instance()->encodeEntitites($data, $srcEncoding, $destEncoding);
0 ignored issues
show
Bug introduced by
The method encodeEntitites() does not exist on PhpXmlRpc\Helper\Charset. Did you maybe mean encodeEntities()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
166
}
167
168
function iso8601_encode($timeT, $utc=0)
169
{
170
    return PhpXmlRpc\Helper\Date::iso8601Encode($timeT, $utc);
171
}
172
173
function iso8601_decode($iDate, $utc=0)
174
{
175
    return PhpXmlRpc\Helper\Date::iso8601Decode($iDate, $utc);
176
}
177
178
function decode_chunked($buffer)
179
{
180
    return PhpXmlRpc\Helper\Http::decodeChunked($buffer);
181
}
182
183
function php_xmlrpc_decode($xmlrpcVal, $options=array())
184
{
185
    $encoder = new PhpXmlRpc\Encoder();
186
    return $encoder->decode($xmlrpcVal, $options);
187
}
188
189
function php_xmlrpc_encode($phpVal, $options=array())
190
{
191
    $encoder = new PhpXmlRpc\Encoder();
192
    return $encoder->encode($phpVal, $options);
193
}
194
195
function php_xmlrpc_decode_xml($xmlVal, $options=array())
196
{
197
    $encoder = new PhpXmlRpc\Encoder();
198
    return $encoder->decodeXml($xmlVal, $options);
199
}
200
201
function guess_encoding($httpHeader='', $xmlChunk='', $encodingPrefs=null)
202
{
203
    return PhpXmlRpc\Helper\XMLParser::guessEncoding($httpHeader, $xmlChunk, $encodingPrefs);
204
}
205
206
function has_encoding($xmlChunk)
207
{
208
    return PhpXmlRpc\Helper\XMLParser::hasEncoding($xmlChunk);
209
}
210
211
function is_valid_charset($encoding, $validList)
212
{
213
    return PhpXmlRpc\Helper\Charset::instance()->isValidCharset($encoding, $validList);
214
}
215