adopt CI-like patterns
[plcapi.git] / src / Encoder.php
index d352831..7ad2adb 100644 (file)
@@ -12,6 +12,35 @@ use PhpXmlRpc\Helper\XMLParser;
  */
 class Encoder
 {
+    protected static $logger;
+    protected static $parser;
+
+    public function getLogger()
+    {
+        if (self::$logger === null) {
+            self::$logger = Logger::instance();
+        }
+        return self::$logger;
+    }
+
+    public static function setLogger($logger)
+    {
+        self::$logger = $logger;
+    }
+
+    public function getParser()
+    {
+        if (self::$parser === null) {
+            self::$parser = new XMLParser();
+        }
+        return self::$parser;
+    }
+
+    public static function setParser($parser)
+    {
+        self::$parser = $parser;
+    }
+
     /**
      * Takes an xmlrpc value in object format and translates it into native PHP types.
      *
@@ -54,8 +83,17 @@ class Encoder
                                 'scalar' => $val
                             );
                             return (object)$xmlrpcVal;
+                        case 'string':
+                            if (isset($options['extension_api_encoding'])) {
+                                $dval = @iconv('UTF-8', $options['extension_api_encoding'], $val);
+                                if ($dval !== false) {
+                                    return $dval;
+                                }
+                            }
+                            //return $val;
+                            // break through voluntarily
                         default:
-                            return $xmlrpcVal->scalarval();
+                            return $val;
                     }
                 }
                 if (in_array('dates_as_objects', $options) && $xmlrpcVal->scalartyp() == 'dateTime.iso8601') {
@@ -271,7 +309,7 @@ class Encoder
                     if (extension_loaded('mbstring')) {
                         $xmlVal = mb_convert_encoding($xmlVal, 'UTF-8', $valEncoding);
                     } else {
-                        Logger::instance()->errorLog('XML-RPC: ' . __METHOD__ . ': invalid charset encoding of xml text: ' . $valEncoding);
+                        $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': invalid charset encoding of xml text: ' . $valEncoding);
                     }
                 }
             }
@@ -279,18 +317,24 @@ class Encoder
 
         // What if internal encoding is not in one of the 3 allowed? We use the broadest one, ie. utf8!
         if (!in_array(PhpXmlRpc::$xmlrpc_internalencoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) {
+            /// @todo emit a warning
             $parserOptions = array(XML_OPTION_TARGET_ENCODING => 'UTF-8');
         } else {
             $parserOptions = array(XML_OPTION_TARGET_ENCODING => PhpXmlRpc::$xmlrpc_internalencoding);
         }
 
-        $xmlRpcParser = new XMLParser($parserOptions);
-        $xmlRpcParser->parse($xmlVal, XMLParser::RETURN_XMLRPCVALS, XMLParser::ACCEPT_REQUEST | XMLParser::ACCEPT_RESPONSE | XMLParser::ACCEPT_VALUE | XMLParser::ACCEPT_FAULT);
+        $xmlRpcParser = $this->getParser();
+        $xmlRpcParser->parse(
+            $xmlVal,
+            XMLParser::RETURN_XMLRPCVALS,
+            XMLParser::ACCEPT_REQUEST | XMLParser::ACCEPT_RESPONSE | XMLParser::ACCEPT_VALUE | XMLParser::ACCEPT_FAULT,
+            $parserOptions
+        );
 
         if ($xmlRpcParser->_xh['isf'] > 1) {
             // test that $xmlrpc->_xh['value'] is an obj, too???
 
-            Logger::instance()->errorLog($xmlRpcParser->_xh['isf_reason']);
+            $this->getLogger()->errorLog($xmlRpcParser->_xh['isf_reason']);
 
             return false;
         }