Skip to content

Instantly share code, notes, and snippets.

@jfontan
Last active July 20, 2017 10:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jfontan/b405171fe3f1d01519e0405280f0095f to your computer and use it in GitHub Desktop.
Save jfontan/b405171fe3f1d01519e0405280f0095f to your computer and use it in GitHub Desktop.
crystal xmlrpc
require "xmlrpc"
env = LibXMLRPC::Env.new
penv = pointerof(env)
LibXMLRPC.env_init(penv)
puts env.inspect
LibXMLRPC.client_init2(
penv,
LibXMLRPC::CLIENT_NO_FLAGS,
"",
"",
0,
0)
puts env.inspect
array = LibXMLRPC.array_new(penv)
secret = LibXMLRPC.string_new(penv, "oneadmin:password")
user = LibXMLRPC.int_new(penv, 0)
LibXMLRPC.array_append_item(penv, array, secret)
LibXMLRPC.array_append_item(penv, array, user)
puts env.inspect
value = LibXMLRPC.client_call_params(penv,
"http://localhost:2644/RPC2",
"one.user.info",
array)
puts env.inspect
if env.fault_occurred != 0
str = String.new(env.fault_string)
puts str
end
error :: LibXMLRPC::Value
LibXMLRPC.array_read_item(penv, value, 0, pointerof(error))
bool = 0_i32
LibXMLRPC.read_bool(penv, error, pointerof(bool))
puts env.inspect
if env.fault_occurred != 0
str = String.new(env.fault_string)
puts str
end
puts error
puts bool
val :: LibXMLRPC::Value
LibXMLRPC.array_read_item(penv, value, 1, pointerof(val))
string :: UInt8*
LibXMLRPC.read_string(penv, val, pointerof(string))
puts String.new(string)
@[Link("xmlrpc_client")]
lib LibXMLRPC
CLIENT_NO_FLAGS = 0
TYPE_INT = 0
TYPE_BOOL = 1
TYPE_DOUBLE = 2
TYPE_DATETIME = 3
TYPE_STRING = 4
TYPE_BASE64 = 5
TYPE_ARRAY = 6
TYPE_STRUCT = 7
TYPE_C_PTR = 8
TYPE_NIL = 9
TYPE_I8 = 10
TYPE_DEAD = 0xDEAD
struct Env
fault_occurred : Int32
fault_code : Int32
fault_string : Pointer(UInt8)
end
type Value = Void*
fun env_init = xmlrpc_env_init(environment : Env*)
fun client_init = xmlrpc_client_init(flags : Int32,
appname : UInt8*,
appversion : UInt8*)
fun client_init2 =
xmlrpc_client_init2(env: Env*,
flags : Int32,
appname : UInt8*,
appversion : UInt8*,
clientparms : Int32,
parm_size : UInt32)
fun client_call_params =
xmlrpc_client_call_params(env : Env*,
server_url : UInt8*,
method_name : UInt8*,
param_array : Value) : Value
fun value_type = xmlrpc_value_type(value : Value) : UInt32
fun array_new =
xmlrpc_array_new(env : Env*) : Value
fun array_append_item =
xmlrpc_array_append_item(env : Env*,
array : Value,
value : Value) : Value
fun array_read_item =
xmlrpc_array_read_item(env : Env*,
array : Value,
index : UInt32,
value : Value*)
fun array_get_item =
xmlrpc_array_get_item(env : Env*,
array : Value,
index : UInt32) : Value
fun int_new =
xmlrpc_int_new(env : Env*, value : Int32) : Value
fun read_int =
xmlrpc_read_int(env : Env*,
value : Value,
int_value : Int32*)
fun string_new =
xmlrpc_string_new(env : Env*, string : UInt8*) : Value
fun read_string =
xmlrpc_read_string(env : Env*,
value : Value,
string_value : UInt8**)
fun read_bool =
xmlrpc_read_bool(env : Env*,
value : Value,
bool_value : Int32*)
end
class XMLRPC
def initialize(server)
@server = server
@env = LibXMLRPC::Env.new
@penv = pointerof(@env)
LibXMLRPC.client_init2(
@penv,
LibXMLRPC::CLIENT_NO_FLAGS,
"",
"",
0,
0)
end
def call(method, *params)
pary = LibXMLRPC.array_new(@penv)
params.each do |param|
case param
when String
val = LibXMLRPC.string_new(@penv, param)
when Int32
val = LibXMLRPC.int_new(@penv, param)
else
STDERR.puts "Type not implemented"
exit(-1)
end
LibXMLRPC.array_append_item(@penv, pary, val)
end
ret = LibXMLRPC.client_call_params(@penv, @server, method, pary)
return array_to_crystal(ret)
end
def array_to_crystal(ret)
ary = [] of Int32 | String
2.times do |i|
value :: LibXMLRPC::Value
LibXMLRPC.array_read_item(@penv, ret, i, pointerof(value))
type = LibXMLRPC.value_type(value)
case type
when LibXMLRPC::TYPE_INT
int = 0_i32
LibXMLRPC.read_int(@penv, value, pointerof(int))
val = int
when LibXMLRPC::TYPE_BOOL
bool = 0_i32
LibXMLRPC.read_bool(@penv, value, pointerof(bool))
val = bool
when LibXMLRPC::TYPE_STRING
string :: UInt8*
LibXMLRPC.read_string(@penv, value, pointerof(string))
val = String.new(string)
else
STDERR.puts "Type not implemented"
exit(-1)
end
ary << val
end
ary
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment