aboutsummaryrefslogtreecommitdiffstats
path: root/actionwebservice/lib/action_web_service/vendor/ws/encoding/xmlrpc_encoding.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionwebservice/lib/action_web_service/vendor/ws/encoding/xmlrpc_encoding.rb')
-rw-r--r--actionwebservice/lib/action_web_service/vendor/ws/encoding/xmlrpc_encoding.rb53
1 files changed, 53 insertions, 0 deletions
diff --git a/actionwebservice/lib/action_web_service/vendor/ws/encoding/xmlrpc_encoding.rb b/actionwebservice/lib/action_web_service/vendor/ws/encoding/xmlrpc_encoding.rb
new file mode 100644
index 0000000000..b38ae81abf
--- /dev/null
+++ b/actionwebservice/lib/action_web_service/vendor/ws/encoding/xmlrpc_encoding.rb
@@ -0,0 +1,53 @@
+require 'xmlrpc/marshal'
+
+module WS
+ module Encoding
+ class XmlRpcError < WSError
+ end
+
+ class XmlRpcEncoding < AbstractEncoding
+ def encode_rpc_call(method_name, params)
+ XMLRPC::Marshal.dump_call(method_name, *params)
+ end
+
+ def decode_rpc_call(obj)
+ method_name, params = XMLRPC::Marshal.load_call(obj) rescue nil
+ unless method_name && params
+ raise(XmlRpcError, "Malformed XML-RPC request")
+ end
+ i = 0
+ params = params.map do |value|
+ param = XmlRpcDecodedParam.new("param#{i}", value)
+ i += 1
+ param
+ end
+ [method_name, params]
+ end
+
+ def encode_rpc_response(method_name, return_value)
+ if return_value.nil?
+ XMLRPC::Marshal.dump_response(true)
+ else
+ XMLRPC::Marshal.dump_response(return_value)
+ end
+ end
+
+ def decode_rpc_response(obj)
+ return_value = XMLRPC::Marshal.load_response(obj) rescue nil
+ if return_value.nil?
+ raise(XmlRpcError, "Malformed XML-RPC response")
+ end
+ [nil, XmlRpcDecodedParam.new('return', return_value)]
+ end
+ end
+
+ class XmlRpcDecodedParam
+ attr :param
+
+ def initialize(name, value)
+ info = ParamInfo.new(name, value.class)
+ @param = Param.new(value, info)
+ end
+ end
+ end
+end