]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-9952: Update ks json-rpc api
authorcolm <colm@freeswitch1>
Tue, 7 Feb 2017 00:23:09 +0000 (19:23 -0500)
committerMike Jerris <mike@jerris.com>
Wed, 22 Mar 2017 21:42:49 +0000 (17:42 -0400)
libs/libks/src/include/ks_rpcmessage.h
libs/libks/src/ks_rpcmessage.c
libs/libks/test/testmessages.c

index c897f06a82af63af87cffb93b6ee725b8f1d779e..832a6f32175af7960e1ad06a094c492b7bd0e21b 100644 (file)
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-/* 
- * Usage notes 
- *
- *   ks_rpcmessaging_handle_t *handle;
- *
- *   ks_rpcmessage_init(pool, &handle);
- *   
- *   ks_rpcmessage_version(handle, version);
- *   ks_rpcmessage_namespace(handle, application_namespace);
- *   ks_rpcmessage_register_function(handle, "invite", handle_invite_message);
- *   ks_rpcmessage_register_function(handle, "media",  handle_media_message);
- *
- *   ...
- *   cJSON* request = NULL;
- *   cJSON* parms   = NULL;
- *   cJSON* response  = NULL;
- *
- *   request  = ks_rpcmessage_create_request(h, "invite", &parms, &request);
- *   cJSON_AddStringToObject(parms, "hello", "cruel world");
- *   ... and send
- *   
- *   
- * static ks_status_t  handle_..._message(ks_rpcmessaging_handle_t* handle, cJSON *msg, cJSON **response)
- * {
- *       cJSON *respvalue = cJSON_CreateNumber(1);
- *       cJSON *x  = *response = ks_rpcmessage_create_response(h, msg, &respvalue, response);
- *       if ( x == NULL) { 
- *           return KS_STATUS_FAIL;
- *        } 
- *        ...
- *        return KS_STATUS_SUCCESS;
- * }
-
- *
- *
- *     
- *   
- *
- *
- *   ...
- *   ks_rpcmessage_deinit(&handle);
- *
- */            
-
-
-
 
 #ifndef _KS_RPCMESSAGE_H_
 #define _KS_RPCMESSAGE_H_
 
 KS_BEGIN_EXTERN_C
 
+#define KS_RPCMESSAGE_NAMESPACE_LENGTH 16
+#define KS_RPCMESSAGE_COMMAND_LENGTH  238
+#define KS_RPCMESSAGE_FQCOMMAND_LENGTH  (KS_RPCMESSAGE_NAMESPACE_LENGTH+KS_RPCMESSAGE_COMMAND_LENGTH+1)
+#define KS_RPCMESSAGE_VERSION_LENGTH 9
 
 
-
-
-typedef struct ks_rpcmessaging_handle_s ks_rpcmessaging_handle_t;
 typedef uint32_t ks_rpcmessage_id;
 
 
-typedef  ks_status_t (*jrpc_func_t)(ks_rpcmessaging_handle_t* handle, cJSON *request, cJSON **responseP);
-typedef  ks_status_t (*jrpc_resp_func_t)(ks_rpcmessaging_handle_t* handle, cJSON *response);
-
+KS_DECLARE(void) ks_rpcmessage_init(ks_pool_t *pool);
 
+KS_DECLARE(void*) ks_json_pool_alloc(ks_size_t size);
+KS_DECLARE(void) ks_json_pool_free(void *ptr);
 
-KS_DECLARE(ks_rpcmessaging_handle_t *) ks_rpcmessage_init(ks_pool_t* pool, ks_rpcmessaging_handle_t** handleP);
-KS_DECLARE(void)                    ks_rpcmessage_deinit(ks_rpcmessaging_handle_t** handleP);
 
-KS_DECLARE(ks_status_t)ks_rpcmessage_namespace(ks_rpcmessaging_handle_t* handle, const char* namespace, const char* version);
-
-KS_DECLARE(ks_rpcmessage_id)ks_rpcmessage_create_request(ks_rpcmessaging_handle_t* handle, 
-                                                                                       const char *method
+KS_DECLARE(ks_rpcmessage_id) ks_rpcmessage_create_request(char *namespace, 
+                                                                                       char *method,
+                                                                                       char *sessionid,
+                                                                                       char *version
                                                                                        cJSON **parmsP,
                                                                                        cJSON **requestP);
-KS_DECLARE(ks_rpcmessage_id)ks_rpcmessage_create_response(ks_rpcmessaging_handle_t* handle, 
+
+KS_DECLARE(ks_size_t) ks_rpc_create_buffer(char *namespace,
+                                            char *method,
+                                                                                       char *sessionid,
+                                                                                       char *version,
+                                            cJSON **parmsP,
+                                            ks_buffer_t *buffer);
+
+KS_DECLARE(ks_rpcmessage_id) ks_rpcmessage_create_response( 
                                                                                        const cJSON *request, 
                                                                                        cJSON **resultP, 
                                                                                        cJSON **responseP);
-KS_DECLARE(ks_rpcmessage_id)ks_rpcmessage_create_errorresponse(ks_rpcmessaging_handle_t* handle,
+
+KS_DECLARE(ks_rpcmessage_id) ks_rpcmessage_create_errorresponse(
                                             const cJSON *request,
                                             cJSON **errorP,
                                             cJSON **responseP);
 
-KS_DECLARE(ks_status_t)ks_rpcmessage_register_function(ks_rpcmessaging_handle_t* handle, 
-                                                                                               const char *command, 
-                                                                                               jrpc_func_t func,
-                                                                                               jrpc_resp_func_t respfunc);
-
-KS_DECLARE(jrpc_func_t) ks_rpcmessage_find_function(ks_rpcmessaging_handle_t* handle, const char *command);
-KS_DECLARE(jrpc_resp_func_t) ks_rpcmessage_find_response_function(ks_rpcmessaging_handle_t* handle, const char *command);
-
-KS_DECLARE(ks_status_t) ks_rpcmessage_process_message(ks_rpcmessaging_handle_t* handle, 
-                                                                                                               uint8_t *data, 
-                                                                                                               ks_size_t size, 
-                                                                                                               cJSON **responseP);
-KS_DECLARE(ks_status_t) ks_rpcmessage_process_jsonmessage(ks_rpcmessaging_handle_t* handle, cJSON *request, cJSON **responseP);
+KS_DECLARE(ks_bool_t) ks_rpcmessage_isrequest(cJSON *msg);
 
+KS_DECLARE(ks_bool_t) ks_rpcmessage_isrpc(cJSON *msg);
 
 KS_END_EXTERN_C
 
index 4712c7bd13cb8c410f07b7bd5db615e186180e9a..41e327bcc88a109a966d437510748e13d3d3b8ba 100644 (file)
 
 #include <ks.h>
 #include <ks_rpcmessage.h>
+#include <ks_buffer.h>
 
-#define KS_RPCMESSAGE_NAMESPACE_LENGTH 16
-#define KS_PRCMESSAGE_COMMAND_LENGTH  238
-#define KS_PRCMESSAGE_FQCOMMAND_LENGTH KS_RPCMESSAGE_NAMESPACE_LENGTH + 1 + KS_PRCMESSAGE_COMMAND_LENGTH
-#define KS_RPCMESSAGE_VERSION_LENGTH 9
-
-struct ks_rpcmessaging_handle_s
+struct 
 {
-       ks_hash_t  *method_hash;
-
-       ks_mutex_t *id_mutex;
-       uint32_t   message_id;
-       
-       ks_pool_t  *pool;
 
-       char namespace[KS_RPCMESSAGE_NAMESPACE_LENGTH+2];
-    char version[KS_RPCMESSAGE_VERSION_LENGTH+1];   /* nnn.nn.nn */
-};
+    ks_mutex_t *id_mutex;
+    uint32_t   message_id;
 
-typedef struct ks_rpcmessage_callbackpair_s 
-{
-       jrpc_func_t          request_func;
-       jrpc_resp_func_t response_func;
-       uint16_t         command_length;
-       char             command[1]; 
-} ks_rpcmessage_callbackpair_t;
+    ks_pool_t  *pool;
 
+} handle = {NULL, 0, NULL};
 
-static uint32_t ks_rpcmessage_next_id(ks_rpcmessaging_handle_t* handle)
+KS_DECLARE(void*) ks_json_pool_alloc(ks_size_t size)
 {
-    uint32_t message_id;
+       return ks_pool_alloc(handle.pool, size);
+}
 
-    ks_mutex_lock(handle->id_mutex);
+KS_DECLARE(void) ks_json_pool_free(void *ptr)
+{
+    ks_pool_free(handle.pool, &ptr);
+}
 
-    ++handle->message_id;
 
-    if (!handle->message_id) {
-                ++handle->message_id;
+KS_DECLARE(void) ks_rpcmessage_init(ks_pool_t* pool)
+{
+       if (!handle.id_mutex) {
+               ks_mutex_create(&handle.id_mutex, KS_MUTEX_FLAG_DEFAULT, pool);
+           handle.pool = pool;
+
+               cJSON_Hooks hooks;
+               hooks.malloc_fn = ks_json_pool_alloc;
+               hooks.free_fn   = ks_json_pool_free;
+               cJSON_InitHooks(&hooks);
        }
-
-       message_id = handle->message_id;
-
-    ks_mutex_unlock(handle->id_mutex);
-
-    return message_id;
+       return;
 }
 
-
-KS_DECLARE(ks_rpcmessaging_handle_t*) ks_rpcmessage_init(ks_pool_t* pool, ks_rpcmessaging_handle_t** handleP)
+static uint32_t ks_rpcmessage_next_id()
 {
-       ks_rpcmessaging_handle_t *handle = (ks_rpcmessaging_handle_t *)ks_pool_alloc(pool, sizeof(ks_rpcmessaging_handle_t));
-       *handleP = handle;
+    uint32_t message_id;
 
-       ks_hash_create(&handle->method_hash, 
-                                       KS_HASH_MODE_CASE_SENSITIVE, 
-                                       KS_HASH_FLAG_RWLOCK + KS_HASH_FLAG_DUP_CHECK + KS_HASH_FLAG_FREE_VALUE,
-                                       pool);
+    ks_mutex_lock(handle.id_mutex);
 
-    ks_mutex_create(&handle->id_mutex, KS_MUTEX_FLAG_DEFAULT, pool);
+    ++handle.message_id;
 
-       strcpy(handle->namespace, "global.");
+    if (!handle.message_id) {
+                ++handle.message_id;
+       }
 
-       handle->pool = pool;
-       return handle;
-}
+       message_id = handle.message_id;
 
+    ks_mutex_unlock(handle.id_mutex);
 
-KS_DECLARE(void) ks_rpcmessage_deinit(ks_rpcmessaging_handle_t** handleP)
-{
-       ks_rpcmessaging_handle_t *handle = *handleP;
-       ks_hash_destroy(&handle->method_hash);
-    ks_pool_free(handle->pool, handleP);
-    return;
+    return message_id;
 }
 
+
 static cJSON *ks_rpcmessage_new(uint32_t id)
 {
     cJSON *obj = cJSON_CreateObject();
@@ -135,9 +117,8 @@ static cJSON *ks_rpcmessage_dup(cJSON *msgid)
     return obj;
 }
 
-static ks_bool_t ks_rpcmessage_isrequest(cJSON *msg)
+KS_DECLARE(ks_bool_t) ks_rpcmessage_isrequest(cJSON *msg)
 {
-       //cJSON *params = cJSON_GetObjectItem(msg, "param");
     cJSON *result = cJSON_GetObjectItem(msg, "result");
     cJSON *error  = cJSON_GetObjectItem(msg, "error");
 
@@ -148,47 +129,79 @@ static ks_bool_t ks_rpcmessage_isrequest(cJSON *msg)
     return KS_TRUE;
 }
 
+KS_DECLARE(ks_bool_t) ks_rpcmessage_isrpc(cJSON *msg)
+{
+    cJSON *rpc = cJSON_GetObjectItem(msg, "json-rpc");
+
+    if (rpc) {
+        return  KS_FALSE;
+    }
 
+    return KS_TRUE;
+}
 
-KS_DECLARE(ks_rpcmessage_id) ks_rpcmessage_create_request(ks_rpcmessaging_handle_t* handle, 
-                                                                                               const char *command,
+
+
+
+KS_DECLARE(ks_rpcmessage_id) ks_rpcmessage_create_request(char *namespace,
+                                                                                               char *command,
+                                                                                               char *sessionid,
+                                                                                               char *version,
                                                                                                cJSON **paramsP,
                                                                                                cJSON **requestP)
 {
     cJSON *msg, *params = NULL;
        *requestP = NULL;
 
-       if (!ks_rpcmessage_find_function(handle, command)) {
-               ks_log(KS_LOG_ERROR, "Attempt to create unknown message type : %s, namespace %s\n", command, handle->namespace);
-               return 0;
-       }
-
-       ks_rpcmessage_id msgid = ks_rpcmessage_next_id(handle);
+       ks_rpcmessage_id msgid = ks_rpcmessage_next_id();
     msg = ks_rpcmessage_new(msgid);
 
-    if (paramsP && *paramsP) {
-        params = *paramsP;
+    if (paramsP && *paramsP) {   /* parameters have been passed */
+
+               cJSON *p = *paramsP;
+               
+               if (p->type != cJSON_Object) {    /* need to wrap this in a param field */
+                       params = cJSON_CreateObject();
+                       cJSON_AddItemToObject(params, "param", p);
+               }
+               else {
+                       params = *paramsP;
+               }
+
+               cJSON *v = cJSON_GetObjectItem(params, "version");
+
+               if (!v) {                /* add version if needed  */
+                        cJSON_AddStringToObject(params, "version", version);
+               }
+               else {
+                       cJSON_AddStringToObject(params, "version", "0");
+               }
     }
 
     if (!params) {
         params = cJSON_CreateObject();
-    }
 
-    char fqcommand[KS_PRCMESSAGE_FQCOMMAND_LENGTH];
-    memset(fqcommand, 0, sizeof(fqcommand));
+               if (version && version[0] != 0) {               
+                       cJSON_AddStringToObject(params, "version", version);
+               }
+               else {
+                       cJSON_AddStringToObject(params, "version", "0");
+               }
 
-    if (handle->namespace[0] != 0) {
-        strcpy(fqcommand, handle->namespace);
     }
 
-    strcat(fqcommand, command);
+    char fqcommand[KS_RPCMESSAGE_FQCOMMAND_LENGTH];
+    memset(fqcommand, 0, sizeof(fqcommand));
+
+       sprintf(fqcommand, "%s.%s", namespace, command);
 
     cJSON_AddItemToObject(msg, "method", cJSON_CreateString(fqcommand));
-    cJSON_AddItemToObject(msg, "params", params);
 
-    if (handle->version[0] != 0) {
-        cJSON_AddItemToObject(msg, "version", cJSON_CreateString(handle->version));
-    }
+       if (sessionid && sessionid[0] != 0) {
+               cJSON_AddStringToObject(params, "sessionid", sessionid);
+       }
+
+    cJSON_AddItemToObject(msg, "params", params);
 
     if (paramsP) {
         *paramsP = params;
@@ -198,6 +211,31 @@ KS_DECLARE(ks_rpcmessage_id) ks_rpcmessage_create_request(ks_rpcmessaging_handle
     return msgid;
 }
 
+KS_DECLARE(ks_size_t) ks_rpc_create_buffer(char *namespace,
+                                            char *method,
+                                                                                       char *sessionid,
+                                                                                       char *version,
+                                            cJSON **parms,
+                                            ks_buffer_t *buffer)
+{
+       cJSON *message;
+
+       ks_rpcmessage_id msgid = ks_rpcmessage_create_request(namespace, method, sessionid, version, parms, &message);
+
+       if (!msgid) {
+               return 0;
+       }
+
+       const char* b = cJSON_PrintUnformatted(message);
+       ks_size_t size = strlen(b);
+
+       ks_buffer_write(buffer, b, size);
+       cJSON_Delete(message);
+
+       return size;    
+}
+
+
 static ks_rpcmessage_id ks_rpcmessage_get_messageid(const cJSON *msg, cJSON **cmsgidP)
 {
        uint32_t msgid = 0;
@@ -214,14 +252,22 @@ static ks_rpcmessage_id ks_rpcmessage_get_messageid(const cJSON *msg, cJSON **cm
 } 
 
 
-static ks_rpcmessage_id ks_rpcmessage_new_response(ks_rpcmessaging_handle_t* handle,
+static ks_rpcmessage_id ks_rpcmessage_new_response(
                                                 const cJSON *request,
                                                 cJSON *result,
                                                 cJSON **pmsg)
 {
     cJSON *respmsg = NULL;
     cJSON *cmsgid  = NULL;
+       cJSON *version = NULL;
+       cJSON *sessionid = NULL;
+
     cJSON *command = cJSON_GetObjectItem(request, "method");
+       cJSON *params =  cJSON_GetObjectItem(request, "params");
+
+       if (params) {
+               version = cJSON_GetObjectItem(request, "version");
+       }
 
        ks_rpcmessage_id msgid = ks_rpcmessage_get_messageid(request, &cmsgid );
 
@@ -233,11 +279,25 @@ static ks_rpcmessage_id ks_rpcmessage_new_response(ks_rpcmessaging_handle_t* han
 
     cJSON_AddItemToObject(respmsg, "method", cJSON_Duplicate(command, 0));
 
-    if (handle->version[0] != 0) {
-        cJSON_AddItemToObject(respmsg, "version", cJSON_CreateString(handle->version));
-    }
-
     if (result) {
+
+           cJSON *params =  cJSON_GetObjectItem(request, "params");
+
+               if (params) {
+                       version = cJSON_GetObjectItem(params, "version");
+
+                       if (version) {
+                               cJSON_AddItemToObject(result, "version", cJSON_Duplicate(version, 0));
+                       }
+               
+                       sessionid = cJSON_GetObjectItem(params, "sessionid");
+
+            if (sessionid) {
+                cJSON_AddItemToObject(result, "sessionid", cJSON_Duplicate(sessionid, 0));
+            }
+
+               }
+               
         cJSON_AddItemToObject(respmsg, "result", result);
     }
 
@@ -245,31 +305,56 @@ static ks_rpcmessage_id ks_rpcmessage_new_response(ks_rpcmessaging_handle_t* han
 }
 
 
-KS_DECLARE(ks_rpcmessage_id) ks_rpcmessage_create_response(ks_rpcmessaging_handle_t* handle,
+KS_DECLARE(ks_rpcmessage_id) ks_rpcmessage_create_response(
                                                                                                const cJSON *request,
                                                                                                cJSON **resultP,
                                                                                                cJSON **responseP)
 {
-       ks_rpcmessage_id msgid = ks_rpcmessage_new_response(handle, request, *resultP, responseP);
+       ks_rpcmessage_id msgid = ks_rpcmessage_new_response(request, *resultP, responseP);
+
        cJSON *respmsg = *responseP;
 
     if (msgid) {
 
                if (*resultP == NULL) {
                        *resultP = cJSON_CreateObject();
-                       cJSON_AddItemToObject(respmsg, "result", *resultP);
+                       cJSON *result = *resultP;
+
+                   cJSON *params =  cJSON_GetObjectItem(request, "params");
+
+                       if (params) {
+                               cJSON *version = cJSON_GetObjectItem(request, "version");
+                               cJSON *sessionid = cJSON_GetObjectItem(request, "sessionid");
+
+                               if (version) {
+                                       cJSON_AddItemToObject(result, "version", cJSON_Duplicate(version, 0));
+                               }
+                               else {
+                                       cJSON_AddStringToObject(result, "version", "0");
+                               }
+
+                               if (sessionid) {
+                                       cJSON_AddItemToObject(result, "sessionid", cJSON_Duplicate(sessionid, 0));
+                               }
+                               
+                       }
+                       else {
+                               cJSON_AddStringToObject(result, "version", "0");
+                       }
+
+                       cJSON_AddItemToObject(respmsg, "result", result);
                }
        }
 
     return msgid;
 }
 
-KS_DECLARE(ks_rpcmessage_id) ks_rpcmessage_create_errorresponse(ks_rpcmessaging_handle_t* handle, 
+KS_DECLARE(ks_rpcmessage_id) ks_rpcmessage_create_errorresponse( 
                                                                                                const cJSON *request, 
                                                                                                cJSON **errorP, 
                                                                                                cJSON **responseP)
 {
-       ks_rpcmessage_id msgid = ks_rpcmessage_new_response(handle, request, *errorP, responseP);
+       ks_rpcmessage_id msgid = ks_rpcmessage_new_response(request, *errorP, responseP);
        cJSON *respmsg = *responseP;
 
        if (msgid) { 
@@ -283,180 +368,6 @@ KS_DECLARE(ks_rpcmessage_id) ks_rpcmessage_create_errorresponse(ks_rpcmessaging_
     return msgid;
 }
 
-KS_DECLARE(ks_status_t) ks_rpcmessage_namespace(ks_rpcmessaging_handle_t* handle, const char* namespace, const char* version)
-{
-       memset(handle->namespace, 0, sizeof(handle->namespace));
-    memset(handle->version, 0, sizeof(handle->version)); 
-
-       strncpy(handle->namespace, namespace, KS_RPCMESSAGE_NAMESPACE_LENGTH);
-    strncpy(handle->version, version, KS_RPCMESSAGE_VERSION_LENGTH);
-       handle->namespace[sizeof(handle->namespace) - 1] = 0;
-       handle->version[sizeof(handle->version) -1] = 0;
-
-    ks_log(KS_LOG_DEBUG, "Setting message namespace value %s, version %s", handle->namespace, handle->version);
-       strcat( handle->namespace, ".");
-
-    return KS_STATUS_SUCCESS;
-}
-
-KS_DECLARE(ks_status_t) ks_rpcmessage_register_function(ks_rpcmessaging_handle_t* handle, 
-                                                                                               const char *command, 
-                                                                                               jrpc_func_t func,
-                                                                                               jrpc_resp_func_t respfunc)
-{
-       if (!func && !respfunc) {
-               return KS_STATUS_FAIL;
-       }
-
-       char fqcommand[KS_PRCMESSAGE_FQCOMMAND_LENGTH];
-    memset(fqcommand, 0, sizeof(fqcommand));
-
-       if (handle->namespace[0] != 0) {
-               strcpy(fqcommand, handle->namespace);
-       }       
-       strcat(fqcommand, command);
-
-       int lkey = strlen(fqcommand)+1;
-
-       if (lkey < 16) {
-               lkey = 16;
-       }       
-
-       ks_rpcmessage_callbackpair_t* callbacks =
-                       (ks_rpcmessage_callbackpair_t*)ks_pool_alloc(handle->pool, lkey + sizeof(ks_rpcmessage_callbackpair_t));
-
-       strcpy(callbacks->command, fqcommand);
-       callbacks->command_length = lkey;
-       callbacks->request_func = func;
-       callbacks->response_func = respfunc;
-
-       ks_hash_write_lock(handle->method_hash);
-       ks_hash_insert(handle->method_hash, callbacks->command, (void *) callbacks);
-
-       ks_hash_write_unlock(handle->method_hash);
-
-       ks_log(KS_LOG_DEBUG, "Message %s registered (%s)\n", command, fqcommand);
-
-       return KS_STATUS_SUCCESS;
-}
-
-static ks_rpcmessage_callbackpair_t* ks_rpcmessage_find_function_ex(ks_rpcmessaging_handle_t* handle, char *command)
-{
-       ks_hash_read_lock(handle->method_hash);
-
-        ks_rpcmessage_callbackpair_t* callbacks = ks_hash_search(handle->method_hash, command, KS_UNLOCKED);
-
-       ks_hash_read_unlock(handle->method_hash);
-
-       return callbacks;
-}
-
-KS_DECLARE(jrpc_func_t) ks_rpcmessage_find_function(ks_rpcmessaging_handle_t* handle, const char *command)
-{
-    char fqcommand[KS_PRCMESSAGE_FQCOMMAND_LENGTH];
-    memset(fqcommand, 0, sizeof(fqcommand));
-
-    if (handle->namespace[0] != 0) {
-        strcpy(fqcommand, handle->namespace);
-               strcat(fqcommand, command);
-    }
-       else {
-               strcpy(fqcommand, command);
-       }
-       
-
-    ks_rpcmessage_callbackpair_t* callbacks = ks_rpcmessage_find_function_ex(handle, (char *)fqcommand);
-
-       if (!callbacks) {
-               return NULL;
-       }
-
-       return callbacks->request_func;
-}
-
-KS_DECLARE(jrpc_resp_func_t) ks_rpcmessage_find_response_function(ks_rpcmessaging_handle_t* handle, const char *command)
-{
-    char fqcommand[KS_PRCMESSAGE_FQCOMMAND_LENGTH];
-    memset(fqcommand, 0, sizeof(fqcommand));
-
-    if (handle->namespace[0] != 0) {
-        strcpy(fqcommand, handle->namespace);
-        strcat(fqcommand, command);
-    }
-    else {
-        strcpy(fqcommand, command);
-    }
-
-    ks_rpcmessage_callbackpair_t* callbacks = ks_rpcmessage_find_function_ex(handle, (char *)fqcommand);
-
-    return callbacks->response_func;
-}
-
-
-KS_DECLARE(ks_status_t) ks_rpcmessage_process_jsonmessage(ks_rpcmessaging_handle_t* handle, cJSON *request, cJSON **responseP)
-{
-       const char *command = cJSON_GetObjectCstr(request, "method");
-       cJSON *error = NULL;
-       cJSON *response = NULL;
-       *responseP = NULL;
-
-       if (!command) {
-               error = cJSON_CreateString("Command not found");
-       }
-
-       //todo - add more checks ? 
-
-       if (error) {
-               ks_rpcmessage_create_request(handle, 0, &error, &response);
-               return KS_STATUS_FAIL;
-       }
-
-       
-       ks_rpcmessage_callbackpair_t* callbacks = ks_rpcmessage_find_function_ex(handle, (char *)command);
-
-       if (!callbacks) {
-               error = cJSON_CreateString("Command not supported");
-               return  KS_STATUS_FAIL;
-       }
-
-       ks_bool_t isrequest = ks_rpcmessage_isrequest(request);
-
-       if (isrequest && callbacks->request_func) {
-               return callbacks->request_func(handle, request, responseP);
-       }
-    else if (!isrequest && callbacks->response_func) {
-               return callbacks->response_func(handle, request);
-       }
-
-       return KS_STATUS_FAIL;
-}
-
-
-
-KS_DECLARE(ks_status_t) ks_rpcmessage_process_message(ks_rpcmessaging_handle_t* handle, 
-                                                                                                               uint8_t *data, 
-                                                                                                               ks_size_t size, 
-                                                                                                               cJSON **responseP)
-{
-       cJSON *response = NULL;
-       cJSON *error = NULL;
-
-       cJSON *request = cJSON_Parse((char*)data);
-
-       if (!request) {
-               error = cJSON_CreateString("Invalid json format");
-               ks_rpcmessage_create_request(handle, 0, &error, &response);
-               return  KS_STATUS_FAIL; 
-       }
-
-       ks_status_t status = ks_rpcmessage_process_jsonmessage(handle, request, responseP);
-
-       cJSON_Delete(request);
-
-       return status;
-}
-
-
 
 /* For Emacs:
  * Local Variables:
index 689173f44da7800e6c152dc3b210d5f07b468669..1849a58494ed08f2923dc95ae5391e3872270751 100644 (file)
 
 
 ks_pool_t *pool;
-ks_thread_pool_t *tpool;
-
-ks_rpcmessaging_handle_t *h;
-
-static ks_thread_t *threads[10];
-
-static char idbuffer[51];
-
-
-static ks_status_t  process_wombat_response(ks_rpcmessaging_handle_t* handle, cJSON *msg)
-{
-          printf("entering process_wombat_response\n");
-          printf("exiting process_wombat_response\n");
-               return KS_STATUS_FAIL;
-}
-
-static ks_status_t  process_wombat(ks_rpcmessaging_handle_t* handle, cJSON *msg, cJSON **response)
-{
-       printf("entering process_wombat\n");
-       
-       char *b0 = cJSON_Print(msg);
-       printf("Request: %s\n", b0);
-       free(b0);
-
-       cJSON *msg_id = cJSON_GetObjectItem(msg, "id");
-       if (msg_id) {
-               if (msg_id->type == cJSON_Number) {
-                       printf("Number int %d double %f\n", msg_id->valueint, msg_id->valuedouble);
-               }
-       }
-       
-       cJSON *respvalue = cJSON_CreateNumber(1);
-
-       ks_rpcmessage_id msgid = ks_rpcmessage_create_response(h, msg, &respvalue, response);
-
-    char *b1 = cJSON_Print(*response);   //(*response);
-    printf("Response: msgid %d\n%s\n", msgid, b1);
-    free(b1);
-
-    printf("exiting process_wombat\n");
-
-       return KS_STATUS_SUCCESS; 
-}
-
-static ks_status_t  process_badbunny(ks_rpcmessaging_handle_t* handle, cJSON *msg, cJSON **response)
-{
-    printf("entering process_badbunny\n");
-
-    char *b0 = cJSON_Print(msg);
-    printf("Request: %s\n", b0);
-    free(b0);
-
-    cJSON *msg_id = cJSON_GetObjectItem(msg, "id");
-    if (msg_id) {
-        if (msg_id->type == cJSON_Number) {
-            printf("Number int %d double %f\n", msg_id->valueint, msg_id->valuedouble);
-        }
-    }
-
-    cJSON *respvalue;
-
-    ks_rpcmessage_id msgid = ks_rpcmessage_create_errorresponse(h, msg, &respvalue, response);
-
-    char *b2 = cJSON_Print(*response);
-    printf("Request: msgid %d\n%s\n", msgid, b2);
-    free(b2);
-
-       //cJSON *respvalue = cJSON_CreateNumber(1);
-       
-
-    char *b1 = cJSON_Print(*response);   //(*response);
-    printf("Response: %s\n", b1);
-    free(b1);
-
-    printf("exiting process_badbunny\n");
-
-
-    return KS_STATUS_SUCCESS;
-}
 
 
 void test01()
 {
-       printf("**** testrpcmessages - test01 start\n"); fflush(stdout);
+       printf("**** testrpcmessages - test01 start\n\n"); fflush(stdout);
 
-       ks_rpcmessage_register_function(h, "wombat", process_wombat, process_wombat_response); 
-    ks_rpcmessage_register_function(h, "badbunny", process_badbunny, NULL);
-    ks_rpcmessage_register_function(h, "onewaywombat", NULL, process_wombat_response);
+       cJSON* request1  = NULL;
+       cJSON* parms1    = NULL;
+    cJSON* response1 = NULL;
 
-       cJSON* request = NULL;
-       cJSON* parms   = NULL;
-    cJSON* response  = NULL;
-
-       /* try an invalid message */
-
-       ks_rpcmessage_id msgid = ks_rpcmessage_create_request(h, "colm", &parms, &request);
-       if (msgid != 0) {
-               printf("invalid message created %d\n", msgid);
-               printf("request:\n%s\n", cJSON_Print(request));
+                                                                                                                /*namespace, method, sessionid, version, params, **request */  
+       ks_rpcmessage_id msgid = ks_rpcmessage_create_request("app1",     "func1", "s001",   "1.0",   &parms1, &request1);
+       if (msgid == 0) {
+               printf("message create failed %d\n", msgid);
        }       
        
-       /* try a basic message */
-
-    msgid = ks_rpcmessage_create_request(h, "wombat", &parms, &request); 
-       if (msgid == 0) {
-               printf("failed to create a wombat\n");
-               return;
-       }
-
-       cJSON_AddStringToObject(parms, "hello", "cruel world");
-       char* data = cJSON_PrintUnformatted(request);   
+       cJSON_AddStringToObject(parms1, "hello", "cruel world");
+       char* data = cJSON_PrintUnformatted(request1);  
        
-       printf("\ntest01 request: %d\n%s\n\n", msgid, data);
+       printf("test01 request1: %d\n%s\n\n", msgid, data);
+    ks_json_pool_free(data);
 
-       /* process message */
-       
-       ks_size_t size = strlen(data);
-       ks_status_t status = ks_rpcmessage_process_message(h, (uint8_t*)data, size, &response);
 
-       char* data1 = cJSON_Print(response);
-       ks_size_t size1 = strlen(data1);
-    printf("\ntest01i response: %d\n%s\n\n", msgid, data1);
-       
-       /* process response */
+       /* convert to buffer */
+       cJSON* parms2  = NULL;
+       ks_buffer_t *buffer;
 
-       ks_status_t status1 = ks_rpcmessage_process_message(h, (uint8_t*)data1, size1, &response);
+       ks_buffer_create(&buffer, 256, 256, 1024);
 
-       free(data);
-       free(data1);
-       cJSON_Delete(request);
+    ks_size_t n = ks_rpc_create_buffer("app2", "func2", "s002", "1.1", &parms2, buffer);
 
-       /* create message 2 */
+       ks_size_t size =  ks_buffer_len(buffer);
+       char *b = (char *)ks_pool_alloc(pool, size+1);
+       ks_buffer_read(buffer, b, size); 
+       
+       printf("test01 request2: %d %d  from ks_buffer\n%s\n\n\n", n, size, b); 
        
-       cJSON *parms1 = cJSON_CreateNumber(1);
-    cJSON *request1  = NULL;
 
-    msgid = ks_rpcmessage_create_request(h, "badbunny", &parms1, &request1);
+       /* create message 3 */
+       
+       cJSON *parms3 = cJSON_CreateNumber(1);
+    cJSON *request3  = NULL;
 
-       data = cJSON_PrintUnformatted(request1);
+    msgid = ks_rpcmessage_create_request("app1", "badbunny",  "s002",   "1.1",  &parms3, &request3);
+       data = cJSON_PrintUnformatted(request3);
        printf("\ntest01i request: %d\n%s\n\n", msgid, data);
 
-       /* process message 2 */
-
-       size = strlen(data);
-       status = ks_rpcmessage_process_message(h, (uint8_t*)data, size, &response);
-       data1 = cJSON_PrintUnformatted(response);
-    printf("\ntest01 response: %d\n%s\n\n", msgid, data1);
-       /* process response 2 - no handler so this should fail */
+       cJSON *response3 = NULL;
+       cJSON *reply3 = NULL;
 
-    size1 = strlen(data1);
-               
-       status = ks_rpcmessage_process_message(h, (uint8_t*)data1, size1, &response);
-       
-       if (status != KS_STATUS_FAIL) {
-               printf("badbunny found a response handler ?\n");
-       }
+       ks_rpcmessage_create_response(request3,  &reply3, &response3);  
 
-    free(data);
-    free(data1);
-    cJSON_Delete(request1);
+       data = cJSON_PrintUnformatted(response3);
+    printf("\ntest01 response3: %d\n%s\n\n", msgid, data);
+    ks_json_pool_free(data);
+    cJSON_Delete(request3);
+    cJSON_Delete(response3);
        
-
        printf("**** testrpcmessages - test01 complete\n\n\n"); fflush(stdout);
 }
 
@@ -186,54 +81,13 @@ void test02()
 
 
 
-
-/* test06  */
-/* ------  */
-
-static void *testnodelocking_ex1(ks_thread_t *thread, void *data)
-{
-       return NULL;
-}
-
-static void *testnodelocking_ex2(ks_thread_t *thread, void *data)
-{
-       return NULL;
-}
-
-
-void test06()
-{
-       printf("**** testmessages - test06 start\n"); fflush(stdout);
-
-       ks_thread_t *t0;
-       ks_thread_create(&t0, testnodelocking_ex1, NULL, pool);
-
-       ks_thread_t *t1;
-       ks_thread_create(&t1, testnodelocking_ex2, NULL, pool);
-
-       ks_thread_join(t1);
-       ks_thread_join(t0);
-
-       printf("\n\n* **testmessages - test06 -- threads complete\n\n"); fflush(stdout);
-
-       printf("**** testmessages - test06 start\n"); fflush(stdout);
-
-       return;
-}
-
-
-
 int main(int argc, char *argv[]) {
 
        printf("testmessages - start\n");
 
        int tests[100];
-       if (argc == 0) {
+       if (argc == 1) {
                tests[0] = 1;
-               tests[1] = 2;
-               tests[2] = 3;
-               tests[3] = 4;
-               tests[4] = 5;
        }
        else {
                for(int tix=1; tix<100 && tix<argc; ++tix) {
@@ -254,16 +108,14 @@ int main(int argc, char *argv[]) {
        for (int tix=0; tix<argc; ++tix) {
 
                if (tests[tix] == 1) {
-                       ks_rpcmessage_init(pool, &h);
+                       ks_rpcmessage_init(pool);
                        test01();
-                       ks_rpcmessage_deinit(&h);
                        continue;
                }
 
                if (tests[tix] == 2) {
-                       ks_rpcmessage_init(pool, &h);
+                       ks_rpcmessage_init(pool);
                        test02();
-                       ks_rpcmessage_deinit(&h);
                        continue;
                }