Last active
July 20, 2017 10:33
-
-
Save jfontan/b405171fe3f1d01519e0405280f0095f to your computer and use it in GitHub Desktop.
crystal xmlrpc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@[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