Constants
ERR_METHOD_MISSING |
= |
1 |
ERR_UNCAUGHT_EXCEPTION |
= |
2 |
ERR_MC_WRONG_PARAM |
= |
3 |
ERR_MC_MISSING_PARAMS |
= |
4 |
ERR_MC_MISSING_METHNAME |
= |
5 |
ERR_MC_RECURSIVE_CALL |
= |
6 |
ERR_MC_WRONG_PARAM_PARAMS |
= |
7 |
ERR_MC_EXPECTED_STRUCT |
= |
8 |
Included Modules
ParserWriterChooseMixin
ParseContentType
Public Class methods
[Source]
def initialize(class_delim=".")
@handler = []
@default_handler = nil
@service_hook = nil
@class_delim = class_delim
@create = nil
@parser = nil
add_multicall if Config::ENABLE_MULTICALL
add_introspection if Config::ENABLE_INTROSPECTION
end
Public Instance methods
[Source]
def add_handler(prefix, obj_or_signature=nil, help=nil, &block)
if block_given?
@handler << [prefix, block, obj_or_signature, help]
else
if prefix.kind_of? String
raise ArgumentError, "Expected non-nil value" if obj_or_signature.nil?
@handler << [prefix + @class_delim, obj_or_signature]
elsif prefix.kind_of? XMLRPC::Service::BasicInterface
@handler += prefix.get_methods(obj_or_signature, @class_delim)
else
raise ArgumentError, "Wrong type for parameter 'prefix'"
end
end
self
end
[Source]
def get_service_hook
@service_hook
end
[Source]
def set_service_hook(&handler)
@service_hook = handler
self
end
[Source]
def get_default_handler
@default_handler
end
[Source]
def set_default_handler (&handler)
@default_handler = handler
self
end
[Source]
def add_multicall
add_handler("system.multicall", %(array array), "Multicall Extension") do |arrStructs|
unless arrStructs.is_a? Array
raise XMLRPC::FaultException.new(ERR_MC_WRONG_PARAM, "system.multicall expects an array")
end
arrStructs.collect {|call|
if call.is_a? Hash
methodName = call["methodName"]
params = call["params"]
if params.nil?
multicall_fault(ERR_MC_MISSING_PARAMS, "Missing params")
elsif methodName.nil?
multicall_fault(ERR_MC_MISSING_METHNAME, "Missing methodName")
else
if methodName == "system.multicall"
multicall_fault(ERR_MC_RECURSIVE_CALL, "Recursive system.multicall forbidden")
else
unless params.is_a? Array
multicall_fault(ERR_MC_WRONG_PARAM_PARAMS, "Parameter params have to be an Array")
else
ok, val = call_method(methodName, *params)
if ok
[val]
else
multicall_fault(val.faultCode, val.faultString)
end
end
end
end
else
multicall_fault(ERR_MC_EXPECTED_STRUCT, "system.multicall expected struct")
end
}
end
self
end
[Source]
def add_introspection
add_handler("system.listMethods",%(array), "List methods available on this XML-RPC server") do
methods = []
@handler.each do |name, obj|
if obj.kind_of? Proc
methods << name
else
obj.methods.each {|meth| methods << name + meth}
end
end
methods
end
add_handler("system.methodSignature", %(array string), "Returns method signature") do |meth|
sigs = []
@handler.each do |name, obj, sig|
if obj.kind_of? Proc and sig != nil and name == meth
if sig[0].kind_of? Array
sig.each {|s| sigs << s}
else
sigs << sig
end
end
end
sigs.uniq! || sigs
end
add_handler("system.methodHelp", %(string string), "Returns help on using this method") do |meth|
help = nil
@handler.each do |name, obj, sig, hlp|
if obj.kind_of? Proc and name == meth
help = hlp
break
end
end
help || ""
end
self
end
[Source]
def process(data)
method, params = parser().parseMethodCall(data)
handle(method, *params)
end