| 14 |
## $Id$ |
## $Id$ |
| 15 |
## -------------------------------------------------------------------------- |
## -------------------------------------------------------------------------- |
| 16 |
## $Log$ |
## $Log$ |
| 17 |
|
## Revision 1.3 2003/03/27 16:05:01 joko |
| 18 |
|
## enhanced 'function _call': debugging, tracing and autodisconnect now parametrized |
| 19 |
|
## |
| 20 |
## Revision 1.2 2003/03/05 23:16:48 joko |
## Revision 1.2 2003/03/05 23:16:48 joko |
| 21 |
## updated docu - phpDocumentor is very strict about its 'blocks'... |
## updated docu - phpDocumentor is very strict about its 'blocks'... |
| 22 |
## |
## |
| 112 |
} |
} |
| 113 |
$this->_save_meta(); |
$this->_save_meta(); |
| 114 |
|
|
| 115 |
if ($args['Host']) { $this->host = $args['Host']; } |
// merge args - V1 |
| 116 |
if ($args['Port']) { $this->port = $args['Port']; } |
//if ($args['Host']) { $this->HOST = $args['Host']; } |
| 117 |
|
//if ($args['Port']) { $this->PORT = $args['Port']; } |
| 118 |
|
|
| 119 |
|
// merge args - V2 |
| 120 |
|
// TODO: php::merge_to($this, $args); |
| 121 |
|
//php::merge_to($this, $args); |
| 122 |
|
//print Dumper($args); |
| 123 |
|
if (is_array($args)) { |
| 124 |
|
foreach ($args as $key => $val) { |
| 125 |
|
$key = strtoupper($key); |
| 126 |
|
$this->$key = $val; |
| 127 |
|
} |
| 128 |
|
} |
| 129 |
|
|
| 130 |
// check if host is valid |
// check if host is valid |
| 131 |
if (!$this->host) { |
if (!$this->HOST) { |
| 132 |
$this->_raiseException( "->constructor: attribute 'host' is empty, please check your settings"); |
$this->_raiseException( "->constructor: attribute 'host' is empty, please check your settings"); |
| 133 |
return; |
return; |
| 134 |
} |
} |
| 135 |
|
|
| 136 |
if (!$this->port) { |
if (!$this->PORT) { |
| 137 |
$this->_raiseException( "->constructor: attribute 'port' is empty, please check your settings"); |
$this->_raiseException( "->constructor: attribute 'port' is empty, please check your settings"); |
| 138 |
return; |
return; |
| 139 |
} |
} |
| 152 |
$this->log(get_class($this) . "->send: " . $command, PEAR_LOG_DEBUG); |
$this->log(get_class($this) . "->send: " . $command, PEAR_LOG_DEBUG); |
| 153 |
|
|
| 154 |
if (!$this->isConnected()) { |
if (!$this->isConnected()) { |
| 155 |
$this->_raiseException( "->send: not connected!"); |
$this->_raiseException( "->send[ command=$command ]: not connected while trying to send command!"); |
| 156 |
return; |
return; |
| 157 |
} |
} |
| 158 |
|
|
| 165 |
return $this->_call($command, $data, $options); |
return $this->_call($command, $data, $options); |
| 166 |
} |
} |
| 167 |
|
|
| 168 |
|
|
| 169 |
function _call($command, $data = "", $options = array() ) { |
function _call($command, $data = "", $options = array() ) { |
| 170 |
|
|
| 171 |
if (!$this->configured) { |
if (!$this->configured) { |
| 190 |
//print Dumper($this); |
//print Dumper($this); |
| 191 |
|
|
| 192 |
// data |
// data |
| 193 |
$data_enc = XML_RPC_encode($data); |
$data_enc = XML_RPC_encode($data); |
| 194 |
|
|
| 195 |
// message - request |
// message - request |
| 196 |
$msg = new XML_RPC_Message($command); |
$msg = new XML_RPC_Message($command); |
| 197 |
$msg->addParam($data_enc); |
$msg->addParam($data_enc); |
| 198 |
//print htmlentities($msg->serialize()); |
|
| 199 |
|
// ??? |
| 200 |
|
//print htmlentities($msg->serialize()); |
| 201 |
|
|
| 202 |
// remote procedure call |
// remote procedure call |
| 203 |
$rpc = new XML_RPC_Client("/", $this->host, $this->port); |
$rpc = new XML_RPC_Client("/", $this->HOST, $this->PORT); |
| 204 |
$rpc->setDebug(0); |
|
| 205 |
if ( !$msg_response = $rpc->send($msg) ) { |
// TODO: detect highlevel errors, raise proper exceptions on them (e.g. 'Unknown method', 'Method signature error(s)') |
| 206 |
// TODO: redirect this error elsewhere! |
// done: now possible to declare tracing at this point in configuration |
| 207 |
//print "RPC-error!<br>"; |
// Please look inside your {appname}/etc/hosts/{hostname}.php |
| 208 |
$this->_raiseException( "->_call: no response"); |
$rpc->setDebug($this->TRACE); |
| 209 |
return; |
|
| 210 |
} |
if ( !$msg_response = $rpc->send($msg) ) { |
| 211 |
|
// TODO: redirect this error elsewhere! |
| 212 |
|
//print "RPC-error!<br>"; |
| 213 |
|
$this->_raiseException( "->_call: no response"); |
| 214 |
|
return; |
| 215 |
|
} |
| 216 |
|
|
| 217 |
// message - response |
// message - response |
| 218 |
$response_enc = $msg_response->value(); |
$response_enc = $msg_response->value(); |
| 219 |
|
|
| 220 |
|
// error handling |
| 221 |
|
// Please look inside your {appname}/etc/hosts/{hostname}.php for toggling $this->DEBUG |
| 222 |
|
if ($this->DEBUG && $error_code = $msg_response->faultCode()) { |
| 223 |
|
//print $msg_response->faultString(); |
| 224 |
|
$this->_raiseException( "->_call: " . $msg_response->faultString() ); |
| 225 |
|
} |
| 226 |
|
|
| 227 |
|
// TODO: what's this? prematurely returning here should not be considered "stable".... |
| 228 |
|
return $this->decodeData($response_enc, $options); |
| 229 |
|
|
|
// TODO: what's this? prematurely returning here should not be considered "stable".... |
|
|
return $this->decodeData($response_enc, $options); |
|
| 230 |
} |
} |
| 231 |
|
|
| 232 |
|
|
| 233 |
function &decodeData(&$payload, $options = array() ) { |
function &decodeData(&$payload, $options = array() ) { |
| 234 |
//if (!is_object($payload)) { return; } |
//if (!is_object($payload)) { return; } |
| 235 |
if ($payload) { |
if ($payload) { |
| 254 |
} |
} |
| 255 |
|
|
| 256 |
function _raiseException($message) { |
function _raiseException($message) { |
| 257 |
$this->meta[connected] = 0; |
|
| 258 |
$this->_save_meta(); |
// spout out the error message of the raised exception |
| 259 |
$this->log(get_class($this) . $message, PEAR_LOG_ERR); |
$this->log(get_class($this) . $message, PEAR_LOG_ERR); |
| 260 |
|
|
| 261 |
|
// handle some stuff regarding more special behaviour (will this get a 'rule' sometimes?) |
| 262 |
|
if ($this->isConnected() && $this->DISCONNECT_ON_ERROR) { |
| 263 |
|
$message = '->_raiseException: [DISCONNECT_ON_ERROR] done transparently. Please reconnect manually.'; |
| 264 |
|
$this->log(get_class($this) . $message, PEAR_LOG_WARNING); |
| 265 |
|
$this->meta[connected] = 0; |
| 266 |
|
$this->_save_meta(); |
| 267 |
|
} |
| 268 |
} |
} |
| 269 |
|
|
| 270 |
function isConnected() { |
function isConnected() { |