X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2FXMLRPC.pm;h=73ce13f7a1c17d4bb0eb80870d35cad56c739496;hp=d7ba75a233dcf1edf5ffc9b5a689430dd9211f96;hb=90393980e5f2859ee1e186fa461f48f5129e803e;hpb=a18e0aadb62be9f96c0aa42b3a6464dc933477dc diff --git a/FS/FS/XMLRPC.pm b/FS/FS/XMLRPC.pm index d7ba75a23..73ce13f7a 100644 --- a/FS/FS/XMLRPC.pm +++ b/FS/FS/XMLRPC.pm @@ -1,18 +1,21 @@ -package FS::XMLRPC; + package FS::XMLRPC; use strict; -use vars qw( @ISA $DEBUG ); +use vars qw( $DEBUG ); use Frontier::RPC2; # Instead of 'use'ing freeside modules on the fly below, just preload them now. use FS; use FS::CGI; +use FS::Conf; use FS::Record; use FS::cust_main; -@ISA = qw( ); +use FS::Maestro; -$DEBUG = 1; +use Data::Dumper; + +$DEBUG = 0; =head1 NAME @@ -83,7 +86,6 @@ sub _serve { #Subroutine, not method my ($method_name, $params) = (shift, shift); - use Data::Dumper; #die 'Called _serve without parameters' unless ref($params) eq 'ARRAY'; $params = [] unless (ref($params) eq 'ARRAY'); @@ -96,28 +98,42 @@ sub _serve { #Subroutine, not method warn "fssub: ${fssub}" if $DEBUG; warn "params: " . Dumper($params) if $DEBUG; - unless (UNIVERSAL::can("FS::${class}", $sub)) { - warn "FS::XMLRPC: Can't call undefined subroutine '${fssub}'"; - # Should we encode an error in the response, - # or just break silently to the remote caller and complain locally? - return []; - } - my @result; - eval { - no strict 'refs'; - my $fssub = "FS::${class}::${sub}"; - @result = (&$fssub(@$params)); - }; - - if ($@) { - warn "FS::XMLRPC: Error while calling '${fssub}': $@"; - return []; - } - warn Dumper(@result); + if ($class eq 'Conf') { #Special case for FS::Conf because we need an obj. + + if ($sub eq 'config') { + my $conf = new FS::Conf; + @result = ($conf->config(@$params)); + } else { + warn "FS::XMLRPC: Can't call undefined subroutine '${fssub}'"; + } + + } else { + + unless (UNIVERSAL::can("FS::${class}", $sub)) { + warn "FS::XMLRPC: Can't call undefined subroutine '${fssub}'"; + # Should we encode an error in the response, + # or just break silently to the remote caller and complain locally? + return []; + } + + eval { + no strict 'refs'; + my $fssub = "FS::${class}::${sub}"; + @result = (&$fssub(@$params)); + }; + + if ($@) { + warn "FS::XMLRPC: Error while calling '${fssub}': $@"; + return []; + } + + } - if (grep { UNIVERSAL::can($_, 'hashref') ? 0 : 1 } @result) { + if ( scalar(@result) == 1 && ref($result[0]) eq 'HASH' ) { + return $result[0]; + } elsif (grep { UNIVERSAL::can($_, 'hashref') ? 0 : 1 } @result) { #warn "FS::XMLRPC: One or more objects returned from '${fssub}' doesn't " . # "support the 'hashref' method."; @@ -131,8 +147,8 @@ sub _serve { #Subroutine, not method return [ $FS::VERSION ]; } # else... - warn "Unhandle XMLRPC request '${method_name}'"; - return []; + warn "Unhandled XMLRPC request '${method_name}'"; + return {}; }