]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-9952: Add query & tests for blade extention to rpc messages
authorcolm <colm@freeswitch1>
Wed, 15 Feb 2017 00:47:00 +0000 (19:47 -0500)
committerMike Jerris <mike@jerris.com>
Wed, 22 Mar 2017 21:42:49 +0000 (17:42 -0400)
libs/libblade/src/blade_rpcproto.c
libs/libblade/src/include/blade_rpcproto.h
libs/libblade/test/testrpcproto.c

index e955fffb56e111774eb0d8dba50f78706f02774a..3123a771189e151d343eb643a5fc212d5da6e1b0 100644 (file)
@@ -812,6 +812,7 @@ KS_DECLARE(ks_rpcmessageid_t) blade_rpc_create_response(cJSON *request,
 }
 
 const char BLADE_JRPC_METHOD[] = "method";
+const char BLADE_JRPC_ID[]     = "id";
 const char BLADE_JRPC_FIELDS[] = "blade";
 const char BLADE_JRPC_TO[]     = "to";
 const char BLADE_JRPC_FROM[]   = "from";
@@ -822,15 +823,22 @@ KS_DECLARE(ks_status_t) blade_rpc_parse_message(cJSON *message,
                                                                                                        char **namespaceP,
                                                                                                        char **methodP,
                                                                                                        char **versionP,
+                                                                                                       uint32_t *idP,
                                                                                                        blade_rpc_fields_t **fieldsP)
 {
        const char *m = cJSON_GetObjectCstr(message, BLADE_JRPC_METHOD);
        cJSON *blade  = cJSON_GetObjectItem(message, BLADE_JRPC_FIELDS);
+       cJSON *jid    = cJSON_GetObjectItem(message, BLADE_JRPC_ID);
 
        *fieldsP    = NULL;
        *namespaceP = NULL;
        *versionP   = NULL;
        *methodP    = NULL;
+       *idP        = 0;
+
+       if (jid) {
+               *idP = jid->valueint; 
+       }
 
        if (!m || !blade) {
                const char *buffer = cJSON_PrintUnformatted(message);
@@ -839,20 +847,60 @@ KS_DECLARE(ks_status_t) blade_rpc_parse_message(cJSON *message,
                return KS_STATUS_FAIL;  
        }
 
+    cJSON *jto    = cJSON_GetObjectItem(blade, BLADE_JRPC_TO);
+    cJSON *jfrom  = cJSON_GetObjectItem(blade, BLADE_JRPC_FROM);
+    cJSON *jtoken = cJSON_GetObjectItem(blade, BLADE_JRPC_TOKEN);
+
+
        ks_size_t len = KS_RPCMESSAGE_COMMAND_LENGTH   + 1 + 
                                        KS_RPCMESSAGE_NAMESPACE_LENGTH + 1 +
                                        KS_RPCMESSAGE_VERSION_LENGTH   + 1 +
                                        sizeof(blade_rpc_fields_t) + 1;
 
+       uint32_t lento = 0;
+       uint32_t lenfrom = 0;
+       uint32_t lentoken = 0;
+
+       if (jto) {
+               lento = strlen(jto->valuestring) + 1;
+               len += lento;
+       }
+
+       if (jfrom) {
+               lenfrom += strlen(jfrom->valuestring) + 1;
+               len += lenfrom;
+       }
+
+       if (jtoken) {
+               lentoken += strlen(jtoken->valuestring) + 1;
+               len += lentoken;
+       }
+
        blade_rpc_fields_t *fields =  (blade_rpc_fields_t *)ks_pool_alloc(g_handle->pool, len);
+
+    char *namespace = (char*)fields + sizeof(blade_rpc_fields_t);
+    char *command   = namespace + KS_RPCMESSAGE_NAMESPACE_LENGTH + 1;
+    char *version   = command + KS_RPCMESSAGE_COMMAND_LENGTH + 1;
        
-       fields->to = cJSON_GetObjectCstr(blade, BLADE_JRPC_TO);
-       fields->from = cJSON_GetObjectCstr(blade, BLADE_JRPC_FROM);
-       fields->from = cJSON_GetObjectCstr(blade, BLADE_JRPC_TOKEN);
-       
-       char *namespace = (char*)fields + sizeof(blade_rpc_fields_t);
-       char *command   = namespace + KS_RPCMESSAGE_NAMESPACE_LENGTH + 1; 
-       char *version   = command + KS_RPCMESSAGE_COMMAND_LENGTH + 1;
+       char *ptr = version + KS_RPCMESSAGE_VERSION_LENGTH + 1;
+
+       if (jto) {
+               strcpy(ptr, jto->valuestring);
+               fields->to = ptr;
+               ptr += strlen(jto->valuestring) + 1;
+       }
+
+       if (jfrom) {
+               strcpy(ptr, jfrom->valuestring);
+               fields->from = ptr;
+               ptr += strlen(jfrom->valuestring) + 1;
+       }
+
+       if (jtoken) {
+               strcpy(ptr, jtoken->valuestring);
+               fields->token = ptr;
+               ptr += strlen(jtoken->valuestring) + 1;
+    }
 
     blade_rpc_parse_fqcommand(m, namespace, command);
        
@@ -861,6 +909,7 @@ KS_DECLARE(ks_status_t) blade_rpc_parse_message(cJSON *message,
        *fieldsP    = fields;   
        *namespaceP = namespace;
        *methodP    = command;
+       *versionP   = version;
 
        return KS_STATUS_SUCCESS;
 }
index 193c8604ab0b7229bf71f2daa9651fade5c6628f..3a8421c6da799e5d917c5944bd0f14aa3f35255e 100644 (file)
@@ -130,7 +130,8 @@ KS_DECLARE(ks_rpcmessageid_t) blade_rpc_create_response(cJSON *request,
 KS_DECLARE(ks_status_t) blade_rpc_parse_message(cJSON *message,
                                                                                                        char **namespace,
                                                                                                        char **method,
-                                                                                                       char **version, 
+                                                                                                       char **version,
+                                                                                                       uint32_t *idP,  
                                                                                                        blade_rpc_fields_t **fieldsP);
 
 /*
index 4679a7f27714d27cee2bdb2fb59d7fc87d955a2a..2b5f28252ff1e68dec7ae3b381e37379d8ec7655 100644 (file)
@@ -29,7 +29,8 @@ static enum jrpc_status_t  process_widget(cJSON *msg, cJSON **response)
     cJSON *resp = cJSON_CreateObject();
     cJSON_AddNumberToObject(resp, "code", 199);
 
-    ks_rpcmessageid_t msgid = ks_rpcmessage_create_response(msg, &resp, response);
+    //ks_rpcmessageid_t msgid = ks_rpcmessage_create_response(msg, &resp, response);
+       ks_rpcmessageid_t msgid = blade_rpc_create_response(msg, &resp, response);
 
     char *b1 = cJSON_PrintUnformatted(*response);   //(*response);
     printf("Response: msgid %d\n%s\n", msgid, b1);
@@ -75,10 +76,27 @@ static enum jrpc_status_t  process_wombat(cJSON *msg, cJSON **replyP)
                ks_pool_free(pool, &b1);
     }
     else {
-        printf("process_wombat_preresponse: unable to create response \n");
+        printf("process_wombat: unable to create response \n");
         return JRPC_ERROR;
     }
 
+       blade_rpc_fields_t *r_fields;
+
+       char *r_method;
+       char *r_namespace;
+       char *r_version;
+       uint32_t r_id;
+
+       ks_status_t s1 = blade_rpc_parse_message(msg, &r_namespace, &r_method, &r_version, &r_id, &r_fields);
+
+       if (s1 == KS_STATUS_FAIL) {
+               printf("process_wombat:  blade_rpc_parse_message failed\n");
+               return JRPC_ERROR;
+       }
+       
+       printf("\nprocess_wombat:  blade_rpc_parse_message namespace %s,  method %s, id %d,  version %s,  to %s, from %s,  token %s\n\n",
+                                                                                       r_namespace, r_method, r_id, r_version,
+                                                                                       r_fields->to, r_fields->from, r_fields->token);
 
        cJSON *parms2 = NULL;
 
@@ -92,7 +110,23 @@ static enum jrpc_status_t  process_wombat(cJSON *msg, cJSON **replyP)
     fields.token = token;
 
 //     msgid = ks_rpcmessage_create_request("app1", "widget", &parms2, replyP);
-       msgid = blade_rpc_create_request("app1", "widget", &fields, &parms2, replyP);
+       msgid = blade_rpc_create_request(r_namespace, r_method, &fields, NULL, replyP);
+
+       if (!msgid) {
+               printf("process wombat:  create of next request failed\n");
+               return  JRPC_ERROR;
+       }
+
+       b0 = cJSON_PrintUnformatted(*replyP);
+       
+       if (!b0) {      
+        printf("process wombat:  create of next request cannot be formatted\n");
+        return  JRPC_ERROR;
+    }
+
+
+       printf("\nprocess wombat: next request\n%s\n\n", b0);    
+       
 
     printf("\n\nexiting process_wombat with a reply to send\n");