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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (show annotations)
Fri Mar 28 06:56:52 2003 UTC (21 years, 5 months ago) by joko
Branch: MAIN
Changes since 1.4: +14 -6 lines
updated logging/debugging code

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

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