diff --git a/demo/Makefile.am b/demo/Makefile.am index 11e9f63..35b2183 100644 --- a/demo/Makefile.am +++ b/demo/Makefile.am @@ -1,12 +1,19 @@ +generated_sources = searpc-signature.h searpc-marshal.h + AM_CFLAGS = @GLIB_CFLAGS@ \ - -I${top_srcdir}/lib + -I${top_srcdir}/lib \ + -I${top_srcdir}/json-glib + +# we need to generate the first +BUILT_SOURCES = gensource noinst_PROGRAMS = searpc-demo-server searpc-demo-client searpc-async-client searpc_demo_server_SOURCES = searpc-demo-server.c searpc-demo-packet.h searpc_demo_server_LDADD = ${top_builddir}/lib/libsearpc.la @LIB_WS32@ \ - @GLIB_CFLAGS@ + @GLIB_CFLAGS@ \ + ${top_builddir}/json-glib/json-glib/libsearpc-json-glib.la searpc_demo_client_SOURCES = searpc-demo-client.c searpc-demo-packet.h @@ -18,3 +25,15 @@ searpc_async_client_SOURCES = demo-async-client.c searpc-demo-packet.h searpc_async_client_LDADD = ${top_builddir}/lib/libsearpc.la @LIB_WS32@ \ @GLIB_CFLAGS@ +EXTRA_DIST = rpc_table.py + +gensource: ${generated_sources} + +${generated_sources}: rpc_table.py + @echo "[libsearpc]: generating rpc header files" + python ${top_srcdir}/lib/searpc-codegen.py rpc_table.py + @echo "[libsearpc]: done" + +clean-local: + -rm ${generated_sources} + diff --git a/demo/demo-async-client.c b/demo/demo-async-client.c index 8c1c35f..4887d5c 100644 --- a/demo/demo-async-client.c +++ b/demo/demo-async-client.c @@ -2,12 +2,11 @@ #include #include #include - #include - #include -#include "searpc-client.h" +#include + #include "searpc-demo-packet.h" #ifdef WIN32 diff --git a/demo/rpc_table.py b/demo/rpc_table.py new file mode 100644 index 0000000..2f5d5a5 --- /dev/null +++ b/demo/rpc_table.py @@ -0,0 +1,8 @@ +""" +Define RPC functions needed to generate +""" + +# [ , [] ] +func_table = [ + [ "int", ["string"] ], +] diff --git a/demo/searpc-demo-client.c b/demo/searpc-demo-client.c index 9fb44f7..1195f91 100644 --- a/demo/searpc-demo-client.c +++ b/demo/searpc-demo-client.c @@ -8,7 +8,8 @@ #include -#include "searpc-client.h" +#include + #include "searpc-demo-packet.h" #define BUFLEN 256 diff --git a/demo/searpc-demo-server.c b/demo/searpc-demo-server.c index 1254e9e..caa99dd 100644 --- a/demo/searpc-demo-server.c +++ b/demo/searpc-demo-server.c @@ -7,7 +7,8 @@ #include #include -#include "searpc-server.h" +#include + #include "searpc-demo-packet.h" #define BUFLEN 256 @@ -31,10 +32,13 @@ searpc_strlen(const char *str) return strlen(str); } +#include "searpc-signature.h" +#include "searpc-marshal.h" + static void start_rpc_service(void) { - searpc_server_init(); + searpc_server_init(register_marshals); searpc_create_service("searpc-demo"); /* The first parameter is the implementation function. diff --git a/lib/Makefile.am b/lib/Makefile.am index 1688dfa..9f1b35e 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -4,30 +4,20 @@ # Used in server: # # * searpc-signature.h: contains functions like `searpc_signature_int__string()`. -# * marshal.h: contains functions like `marshal_int__string()` +# * searpc-marshal.h: contains functions like `marshal_int__string()` # -generated_sources = searpc-signature.h marshal.h - -# rpc_headers = fcall-impr.h searpc-fcall.h searpc-dfun.h searpc-signature.h searpc-marshal.h - AM_CFLAGS = @GLIB_CFLAGS@ \ -I${top_builddir}/lib \ -I${top_srcdir}/json-glib \ -I${top_srcdir}/lib \ -DG_LOG_DOMAIN=\"Searpc\" -# we need to generate the first -BUILT_SOURCES = gensource - lib_LTLIBRARIES = libsearpc.la -include_HEADERS = searpc-client.h \ - searpc-server.h searpc-signature.h searpc-utils.h +include_HEADERS = searpc-client.h searpc-server.h searpc-utils.h searpc.h -noinst_HEADERS = searpc-utils.h marshal.h - -libsearpc_la_SOURCES = searpc-client.c searpc-server.c $(generated_sources) +libsearpc_la_SOURCES = searpc-client.c searpc-server.c libsearpc_la_LDFLAGS = -version-info 1:2:0 -no-undefined @@ -35,14 +25,3 @@ libsearpc_la_LIBADD = @GLIB_LIBS@ \ ${top_builddir}/json-glib/json-glib/libsearpc-json-glib.la dist_bin_SCRIPTS = searpc-codegen.py - -EXTRA_DIST = rpc_table.py - -gensource: ${generated_sources} - -${generated_sources}: searpc-codegen.py rpc_table.py - @echo "[libsearpc]: generating rpc header files" - python searpc-codegen.py rpc_table.py - @echo "[libsearpc]: done" - -DISTCLEANFILES = ${generated_sources} diff --git a/lib/rpc_table.py b/lib/rpc_table.py deleted file mode 100644 index de63659..0000000 --- a/lib/rpc_table.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -Define RPC functions needed to generate -""" - -# [ , [] ] -func_table = [ - [ "int", [] ], - [ "int", ["int"] ], - [ "int", ["int", "int"] ], - [ "int", ["int", "string"] ], - [ "int", ["int", "string", "string"] ], - [ "int", ["int", "string", "int"] ], - [ "int", ["int", "string", "int", "int"] ], - [ "int", ["string"] ], - [ "int", ["string", "int"] ], - [ "int", ["string", "int", "string"] ], - [ "int", ["string", "int", "string", "string"] ], - [ "int", ["string", "string"] ], - [ "int", ["string", "string", "string"] ], - [ "int", ["string", "string", "int", "int"] ], - [ "int", ["string", "string", "string", "string"] ], - [ "int", ["string", "string", "string", "string", "string"] ], - [ "int64", [] ], - [ "int64", ["string"] ], - [ "string", [] ], - [ "string", ["int"] ], - [ "string", ["string"] ], - [ "string", ["string", "int"] ], - [ "string", ["string", "string"] ], - [ "string", ["string", "string", "string"] ], - [ "string", ["string", "string", "string", "string"] ], - [ "string", ["string", "string", "string", "string", "int"] ], - [ "string", ["string", "string", "string", "string", "string"] ], - [ "string", ["string", "string", "string", "string", "string", "string"] ], - [ "string", ["string", "string", "string", "string", "string", "int"] ], - [ "objlist", [] ], - [ "objlist", ["int"] ], - [ "objlist", ["int", "int"] ], - [ "objlist", ["int", "int", "int"] ], - [ "objlist", ["string"] ], - [ "objlist", ["string", "int"] ], - [ "objlist", ["string", "int", "int"] ], - [ "objlist", ["string", "string"] ], - [ "objlist", ["string", "string", "string"] ], - [ "objlist", ["string", "string", "int"] ], - [ "objlist", ["string", "string", "int", "int"] ], - [ "object", [] ], - [ "object", ["int"] ], - [ "object", ["string"] ], - [ "object", ["string", "string"] ], -] diff --git a/lib/searpc-codegen.py b/lib/searpc-codegen.py index 85aa4aa..7e41cfe 100644 --- a/lib/searpc-codegen.py +++ b/lib/searpc-codegen.py @@ -6,6 +6,7 @@ Generate function define macros. import string import sys +import os # type -> (, , @@ -17,31 +18,31 @@ type_table = { "string": ("const gchar*", "gchar*", "json_array_get_string_or_null_element", - "set_string_to_ret_object", + "searpc_set_string_to_ret_object", "json_array_add_string_or_null_element", "NULL"), "int": ("int", "int", "json_array_get_int_element", - "set_int_to_ret_object", + "searpc_set_int_to_ret_object", "json_array_add_int_element", "-1"), "int64": ("gint64", "gint64", "json_array_get_int_element", - "set_int_to_ret_object", + "searpc_set_int_to_ret_object", "json_array_add_int_element", "-1"), "object": ("GObject*", "GObject*", "", - "set_object_to_ret_object", + "searpc_set_object_to_ret_object", "", "NULL"), "objlist": ("GList*", "GList*", "", - "set_objlist_to_ret_object", + "searpc_set_objlist_to_ret_object", "", "NULL"), } @@ -56,7 +57,7 @@ ${get_parameters} JsonObject *object = json_object_new (); ${convert_ret} - return marshal_set_ret_common (object, ret_len, error); + return searpc_marshal_set_ret_common (object, ret_len, error); } """ @@ -101,7 +102,7 @@ def generate_marshal(ret_type, arg_types): def gen_marshal_functions(): from rpc_table import func_table - f = open('marshal.h', 'w') + f = open('searpc-marshal.h', 'w') for item in func_table: print >>f, generate_marshal(item[0], item[1]) f.close() @@ -131,7 +132,7 @@ def generate_marshal_register_item(ret_type, arg_types): def gen_marshal_register_function(): from rpc_table import func_table - f = open('marshal.h', 'a') + f = open('searpc-marshal.h', 'a') print >>f, "static void register_marshals()""" print >>f, "{" for item in func_table: @@ -173,6 +174,7 @@ def gen_signature_list(): if __name__ == "__main__": + sys.path.append(os.getcwd()) gen_marshal_functions() gen_marshal_register_function() gen_signature_list() diff --git a/lib/searpc-server.c b/lib/searpc-server.c index 0626a12..cbafb0d 100644 --- a/lib/searpc-server.c +++ b/lib/searpc-server.c @@ -5,8 +5,6 @@ #include #include -#include "json-glib/json-glib.h" - #include "searpc-server.h" #include "searpc-utils.h" @@ -87,8 +85,8 @@ searpc_remove_service (const char *svc_name) } /* Marshal functions */ -static inline void -set_string_to_ret_object (JsonObject *object, gchar *ret) +void +searpc_set_string_to_ret_object (JsonObject *object, gchar *ret) { if (ret == NULL) json_object_set_null_member (object, "ret"); @@ -98,14 +96,14 @@ set_string_to_ret_object (JsonObject *object, gchar *ret) } } -static inline void -set_int_to_ret_object (JsonObject *object, gint64 ret) +void +searpc_set_int_to_ret_object (JsonObject *object, gint64 ret) { json_object_set_int_member (object, "ret", ret); } -static inline void -set_object_to_ret_object (JsonObject *object, GObject *ret) +void +searpc_set_object_to_ret_object (JsonObject *object, GObject *ret) { if (ret == NULL) json_object_set_null_member (object, "ret"); @@ -115,8 +113,8 @@ set_object_to_ret_object (JsonObject *object, GObject *ret) } } -static inline void -set_objlist_to_ret_object (JsonObject *object, GList *ret) +void +searpc_set_objlist_to_ret_object (JsonObject *object, GList *ret) { GList *ptr; @@ -134,8 +132,8 @@ set_objlist_to_ret_object (JsonObject *object, GList *ret) } } -static gchar * -marshal_set_ret_common (JsonObject *object, gsize *len, GError *error) +gchar * +searpc_marshal_set_ret_common (JsonObject *object, gsize *len, GError *error) { JsonNode *root = json_node_new (JSON_NODE_OBJECT); JsonGenerator *generator = json_generator_new (); @@ -158,7 +156,7 @@ marshal_set_ret_common (JsonObject *object, gsize *len, GError *error) return data; } -static gchar * +gchar * error_to_json (int code, const char *msg, gsize *len) { JsonObject *object = json_object_new (); @@ -181,19 +179,15 @@ error_to_json (int code, const char *msg, gsize *len) return data; } -/* include the generated marshal functions */ -#include "marshal.h" - void -searpc_server_init () +searpc_server_init (RegisterMarshalFunc register_func) { marshal_table = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify)marshal_item_free); service_table = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify)service_free); - /* register buildin marshal functions */ - register_marshals(); + register_func (); } void diff --git a/lib/searpc-server.h b/lib/searpc-server.h index 66438fc..45d2932 100644 --- a/lib/searpc-server.h +++ b/lib/searpc-server.h @@ -2,6 +2,7 @@ #define SEARPC_SERVER_H #include +#include #ifndef DFT_DOMAIN #define DFT_DOMAIN g_quark_from_string(G_LOG_DOMAIN) @@ -10,13 +11,20 @@ struct _JsonArray; typedef gchar* (*SearpcMarshalFunc) (void *func, struct _JsonArray *param_array, gsize *ret_len); +typedef void (*RegisterMarshalFunc) (void); + +void searpc_set_string_to_ret_object (JsonObject *object, gchar *ret); +void searpc_set_int_to_ret_object (JsonObject *object, gint64 ret); +void searpc_set_object_to_ret_object (JsonObject *object, GObject *ret); +void searpc_set_objlist_to_ret_object (JsonObject *object, GList *ret); +gchar *searpc_marshal_set_ret_common (JsonObject *object, gsize *len, GError *error); /** * searpc_server_init: * * Inititalize searpc server. */ -void searpc_server_init (); +void searpc_server_init (RegisterMarshalFunc register_func); /** * searpc_server_final: @@ -89,7 +97,4 @@ gchar *searpc_server_call_function (const char *service, */ char* searpc_compute_signature (gchar *ret_type, int pnum, ...); -/* Signatures */ -#include - #endif diff --git a/lib/searpc.h b/lib/searpc.h new file mode 100644 index 0000000..c029ceb --- /dev/null +++ b/lib/searpc.h @@ -0,0 +1,10 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ + +#ifndef SEARPC_H +#define SEARPC_H + +#include +#include +#include + +#endif