require "xmlrpc/parser"
require "xmlrpc/create"
require "xmlrpc/config"
require "xmlrpc/utils" # ParserWriterChooseMixin
module XMLRPC
class Create
# Avoids warnings
remove_method(:methodCall)
remove_method(:methodResponse)
##
# create a Method Call
# name:: [String] name of the method
# params:: [Array] params of the method as a array
def methodCall(name, *params)
name = name.to_s
if name !~ /[a-zA-Z0-9_.:\/]+/
raise ArgumentError, "Wrong XML-RPC method-name"
end
parameter = params.collect { |param|
@writer.ele("param", conv2value(param))
}
tree = @writer.document(
@writer.ele("methodCall",
@writer.tag("methodName", name),
@writer.ele("params", *parameter)
)
)
@writer.document_to_str(tree) + "\n"
end
##
# create a response to a method call
# is_ret:: [TrueClass] is this a return (true) or a error (false)
# params:: [Array] a array of params
def methodResponse(is_ret, *params)
if is_ret
begin
resp = params.collect do |param|
@writer.ele("param", conv2value(param))
end
resp = [@writer.ele("params", *resp)]
rescue Exception => e
error = XMLRPC::FaultException.new(XMLRPC::BasicServer::ERR_UNCAUGHT_EXCEPTION, "Uncaught exception '#{e.message}' serialising params into response")
resp = @writer.ele("fault", conv2value(error.to_h))
end
else
if params.size != 1 or params[0] === XMLRPC::FaultException
raise ArgumentError, "no valid fault-structure given"
end
resp = @writer.ele("fault", conv2value(params[0].to_h))
end
tree = @writer.document(@writer.ele("methodResponse", resp))
@writer.document_to_str(tree) + "\n"
end
end
end