/[cvs]/nfo/php/libs/org.netfrag.glib/DataSource/Proxy/XMLRPC.php
ViewVC logotype

Annotation of /nfo/php/libs/org.netfrag.glib/DataSource/Proxy/XMLRPC.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (hide annotations)
Thu Mar 27 16:05:01 2003 UTC (21 years, 5 months ago) by joko
Branch: MAIN
Changes since 1.2: +65 -23 lines
enhanced 'function _call': debugging, tracing and autodisconnect now parametrized

1 joko 1.1 <?
2 joko 1.2 /**
3     * This file contains the DataSource::Proxy::XMLRPC module.
4     *
5     * @author Andreas Motl <andreas.motl@ilo.de>
6     * @package org.netfrag.glib
7     * @name DataSource::Proxy::XMLRPC
8     *
9     */
10    
11    
12 joko 1.1 /*
13     ## --------------------------------------------------------------------------
14 joko 1.3 ## $Id: XMLRPC.php,v 1.2 2003/03/05 23:16:48 joko Exp $
15 joko 1.1 ## --------------------------------------------------------------------------
16 joko 1.2 ## $Log: XMLRPC.php,v $
17 joko 1.3 ## Revision 1.2 2003/03/05 23:16:48 joko
18     ## updated docu - phpDocumentor is very strict about its 'blocks'...
19     ##
20 joko 1.2 ## Revision 1.1 2003/03/03 21:53:52 joko
21     ## refactored from Data::Driver::RPC::Remote
22     ##
23 joko 1.1 ## Revision 1.4 2003/02/20 21:42:43 joko
24     ## + fix: always converting from utf8 into latin here (for now)
25     ##
26     ## Revision 1.3 2003/02/13 21:51:29 joko
27     ## + now can remember its connection-state
28     ## + sub ping
29     ##
30     ## Revision 1.2 2003/02/13 00:42:44 joko
31     ## +- renamed modules
32     ##
33     ## Revision 1.1 2003/02/09 17:25:38 joko
34     ## + refactored from flib/Application/RPC/Remote.php
35     ##
36     ## Revision 1.6 2003/02/03 03:37:45 jonen
37     ## - removed unused argument '$decode' at function '_call()'
38     ## + added argument '$options=array()' at function '_call()'
39     ## which will be passed to function '&decodeData()' for e.g. utf8 decoding
40     ## + added '$encoder->toISO()' at '&decodeData()', (re)moved from 'ProxyObject.php'
41     ##
42     ## Revision 1.5 2002/12/22 13:24:09 jonen
43     ## + added utf8 encoding at 'send()' toggled by option
44     ##
45     ## Revision 1.4 2002/12/19 02:02:25 jonen
46     ## + minor changes
47     ##
48     ## Revision 1.3 2002/12/19 01:59:37 jonen
49     ## + minor changes: coment debug prints
50     ##
51     ## Revision 1.2 2002/12/05 21:45:31 joko
52     ## + debugging
53     ##
54     ## Revision 1.1 2002/12/01 17:23:58 joko
55     ## + initial check-in
56     ##
57     ## Revision 1.3 2002/12/01 06:22:57 cvsjoko
58     ## + minor update: now can use config defaults or given args
59     ##
60     ## Revision 1.2 2002/10/29 19:14:45 cvsjoko
61     ## - bugfix: dont' do utf8-encoding here
62     ##
63     ## Revision 1.1 2002/10/09 00:51:39 cvsjoko
64     ## + new
65     ##
66     ##
67     ## -------------------------------------------------------------------------
68     */
69    
70    
71     // V1: normal require
72     //require_once 'XML/RPC/RPC.php';
73    
74     // V2: first time load of foreign module (PEAR::XML::RPC)
75     //require_once 'XML/RPC/RPC.php';
76     loadModule('XML::RPC::RPC');
77    
78     loadModule('Class::Logger');
79    
80 joko 1.2
81     /**
82     * This is the DataSource::Proxy::XMLRPC module.
83     *
84     * @author Andreas Motl <andreas.motl@ilo.de>
85     * @package org.netfrag.glib
86     * @subpackage DataSource
87     * @name DataSource::Proxy::XMLRPC
88     *
89     * @todo SOAP?
90     *
91     */
92 joko 1.1 class DataSource_Proxy_XMLRPC extends Class_Logger {
93    
94     var $configured;
95     var $meta;
96    
97     function DataSource_Proxy_XMLRPC($args = array()) {
98    
99     parent::constructor();
100    
101     //print Dumper($this, $args);
102    
103     global $Data_Driver_RPC_Remote_meta;
104     session_register_safe("Data_Driver_RPC_Remote_meta");
105     $this->meta = $Data_Driver_RPC_Remote_meta;
106    
107     if (!isset($this->meta[connected]) || $args[connect]) {
108     $this->meta[connected] = 1;
109     }
110     $this->_save_meta();
111    
112 joko 1.3 // merge args - V1
113     //if ($args['Host']) { $this->HOST = $args['Host']; }
114     //if ($args['Port']) { $this->PORT = $args['Port']; }
115    
116     // merge args - V2
117     // TODO: php::merge_to($this, $args);
118     //php::merge_to($this, $args);
119     //print Dumper($args);
120     if (is_array($args)) {
121     foreach ($args as $key => $val) {
122     $key = strtoupper($key);
123     $this->$key = $val;
124     }
125     }
126 joko 1.1
127     // check if host is valid
128 joko 1.3 if (!$this->HOST) {
129 joko 1.1 $this->_raiseException( "->constructor: attribute 'host' is empty, please check your settings");
130     return;
131     }
132    
133 joko 1.3 if (!$this->PORT) {
134 joko 1.1 $this->_raiseException( "->constructor: attribute 'port' is empty, please check your settings");
135     return;
136     }
137    
138     $this->configured = 1;
139    
140     }
141    
142     function _save_meta() {
143     global $Data_Driver_RPC_Remote_meta;
144     $Data_Driver_RPC_Remote_meta = $this->meta;
145     }
146    
147     function send($command, $data = "", $options = array()) {
148    
149     $this->log(get_class($this) . "->send: " . $command, PEAR_LOG_DEBUG);
150    
151     if (!$this->isConnected()) {
152 joko 1.3 $this->_raiseException( "->send[ command=$command ]: not connected while trying to send command!");
153 joko 1.1 return;
154     }
155    
156     // do 'encode' here and ...
157     if ($options[utf8]) {
158     $encoder = new Data_Encode($data);
159     $encoder->toUTF8();
160     }
161     // call '_call' with 'decode'
162     return $this->_call($command, $data, $options);
163     }
164    
165 joko 1.3
166 joko 1.1 function _call($command, $data = "", $options = array() ) {
167    
168     if (!$this->configured) {
169     $this->_raiseException( "->_call: class not configured properly");
170     return;
171     }
172    
173     // populate options list - mostly for debugging purposes
174     $options_list = array();
175     foreach ($options as $key => $value) {
176     array_push($options_list, "$key=$value");
177     }
178    
179     $data_debug = $data;
180     if (is_array($data_debug)) { $data_debug = join(", ", $data_debug); }
181     $options_debug = join(", ", $options_list);
182     $this->log(get_class($this) . ": " . $command . "(" . $data_debug . ") [" . $options_debug . "]", PEAR_LOG_DEBUG);
183    
184     // trace
185     //print "call: $command<hr>";
186     //print Dumper($data);
187     //print Dumper($this);
188    
189     // data
190 joko 1.3 $data_enc = XML_RPC_encode($data);
191 joko 1.1
192     // message - request
193 joko 1.3 $msg = new XML_RPC_Message($command);
194     $msg->addParam($data_enc);
195    
196     // ???
197     //print htmlentities($msg->serialize());
198    
199 joko 1.1 // remote procedure call
200 joko 1.3 $rpc = new XML_RPC_Client("/", $this->HOST, $this->PORT);
201    
202     // TODO: detect highlevel errors, raise proper exceptions on them (e.g. 'Unknown method', 'Method signature error(s)')
203     // done: now possible to declare tracing at this point in configuration
204     // Please look inside your {appname}/etc/hosts/{hostname}.php
205     $rpc->setDebug($this->TRACE);
206    
207     if ( !$msg_response = $rpc->send($msg) ) {
208     // TODO: redirect this error elsewhere!
209     //print "RPC-error!<br>";
210     $this->_raiseException( "->_call: no response");
211     return;
212     }
213    
214 joko 1.1 // message - response
215 joko 1.3 $response_enc = $msg_response->value();
216    
217     // error handling
218     // Please look inside your {appname}/etc/hosts/{hostname}.php for toggling $this->DEBUG
219     if ($this->DEBUG && $error_code = $msg_response->faultCode()) {
220     //print $msg_response->faultString();
221     $this->_raiseException( "->_call: " . $msg_response->faultString() );
222     }
223    
224     // TODO: what's this? prematurely returning here should not be considered "stable"....
225     return $this->decodeData($response_enc, $options);
226 joko 1.1
227     }
228    
229 joko 1.3
230 joko 1.1 function &decodeData(&$payload, $options = array() ) {
231     //if (!is_object($payload)) { return; }
232     if ($payload) {
233     // data
234     $data = XML_RPC_decode($payload);
235     //print "data: " . dumpVar($response);
236    
237     // decode UTF8 to ISO if wanted
238     //if ($options[to_latin]) {
239     $encoder = new Data_Encode($data);
240     $encoder->toISO();
241     //}
242    
243     $this->meta[connected] = 1;
244     $this->_save_meta();
245    
246     return $data;
247     } else {
248     //print "ERROR!<br>";
249     return 0;
250     }
251     }
252    
253     function _raiseException($message) {
254 joko 1.3
255     // spout out the error message of the raised exception
256 joko 1.1 $this->log(get_class($this) . $message, PEAR_LOG_ERR);
257 joko 1.3
258     // handle some stuff regarding more special behaviour (will this get a 'rule' sometimes?)
259     if ($this->isConnected() && $this->DISCONNECT_ON_ERROR) {
260     $message = '->_raiseException: [DISCONNECT_ON_ERROR] done transparently. Please reconnect manually.';
261     $this->log(get_class($this) . $message, PEAR_LOG_WARNING);
262     $this->meta[connected] = 0;
263     $this->_save_meta();
264     }
265 joko 1.1 }
266    
267     function isConnected() {
268     return $this->meta[connected];
269     }
270    
271     function ping() {
272     $this->_call('ping');
273     }
274    
275     }
276    
277     ?>

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed