}
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";
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);
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);
*fieldsP = fields;
*namespaceP = namespace;
*methodP = command;
+ *versionP = version;
return KS_STATUS_SUCCESS;
}
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);
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;
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");