CELIX-237: fixed handling of preAlloated char* output params

Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/343e53fa
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/343e53fa
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/343e53fa

Branch: refs/heads/feature/CELIX-269_depman
Commit: 343e53faf70f28e94a8328ae077b4a014e69ef46
Parents: e5dfdf5
Author: Bjoern Petri <bpe...@apache.org>
Authored: Tue Oct 27 16:30:15 2015 +0100
Committer: Bjoern Petri <bpe...@apache.org>
Committed: Tue Oct 27 16:30:15 2015 +0100

----------------------------------------------------------------------
 .../dynamic_function_interface/json_rpc.c       | 28 +++++++++-----
 .../json_rpc_tests.cpp                          | 40 ++++++++++++++++++++
 2 files changed, 58 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/343e53fa/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_rpc.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_rpc.c
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_rpc.c
index 1aa0d62..48f9ba5 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_rpc.c
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_rpc.c
@@ -268,21 +268,29 @@ int jsonRpc_handleReply(dyn_function_type *func, const 
char *reply, void *args[]
             dyn_type *argType = dynFunction_argumentTypeForIndex(func, i);
             enum dyn_function_argument_meta meta = 
dynFunction_argumentMetaForIndex(func, i);
             if (meta == DYN_FUNCTION_ARGUMENT_META__PRE_ALLOCATED_OUTPUT) {
-                //FIXME need a tmp because deserialize does always does a 
create (add option?)
-                dyn_type *subType = NULL;
-                dynType_typedPointer_getTypedType(argType, &subType);
                 void *tmp = NULL;
-                size_t size = dynType_size(subType);
-                status = jsonSerializer_deserializeJson(subType, result, &tmp);
-                void **out = (void **)args[i];
-                memcpy(*out, tmp, size);
-                dynType_free(subType, tmp);
+                void **out = (void **) args[i];
+
+                size_t size = 0;
+                dynType_typedPointer_getTypedType(argType, &argType);
+
+                if (dynType_descriptorType(argType) == 't') {
+                    status = jsonSerializer_deserializeJson(argType, result, 
&tmp);
+                    size = strnlen(((char *) *(char**) tmp), 1024 * 1024);
+                    memcpy(*out, *(void**) tmp, size);
+                } else {
+                    status = jsonSerializer_deserializeJson(argType, result, 
&tmp);
+                    size = dynType_size(argType);
+                    memcpy(*out, tmp, size);
+                }
+
+                dynType_free(argType, tmp);
             } else if (meta == DYN_FUNCTION_ARGUMENT_META__OUTPUT) {
                 dyn_type *subType = NULL;
                 dynType_typedPointer_getTypedType(argType, &subType);
                 dyn_type *subSubType = NULL;
                 dynType_typedPointer_getTypedType(subType, &subSubType);
-                void **out = (void **)args[i];
+                void **out = (void **) args[i];
                 status = jsonSerializer_deserializeJson(subSubType, result, 
*out);
             } else {
                 //skip
@@ -293,4 +301,4 @@ int jsonRpc_handleReply(dyn_function_type *func, const char 
*reply, void *args[]
     json_decref(replyJson);
 
     return status;
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/celix/blob/343e53fa/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/json_rpc_tests.cpp
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/json_rpc_tests.cpp
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/json_rpc_tests.cpp
index f49f9a5..c84ccd1 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/json_rpc_tests.cpp
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/json_rpc_tests.cpp
@@ -286,6 +286,42 @@ static void stdLog(void *handle, int level, const char 
*file, int line, const ch
         dynInterface_destroy(intf);
     }
 
+
+    void handleTestOutChar(void) {
+        dyn_interface_type *intf = NULL;
+        FILE *desc = fopen("descriptors/example4.descriptor", "r");
+        CHECK(desc != NULL);
+        int rc = dynInterface_parse(desc, &intf);
+        CHECK_EQUAL(0, rc);
+        fclose(desc);
+
+        struct methods_head *head;
+        dynInterface_methods(intf, &head);
+        dyn_function_type *func = NULL;
+        struct method_entry *entry = NULL;
+        TAILQ_FOREACH(entry, head, entries) {
+            if (strcmp(entry->name, "getName") == 0) {
+                func = entry->dynFunc;
+                break;
+            }
+        }
+        CHECK(func != NULL);
+
+        const char *reply = "{\"r\": \"this is an pre-allocated string\" }";
+        char *result = (char*) calloc(50, sizeof(*result));
+
+        void *args[2];
+        args[0] = NULL;
+        args[1] = &result;
+
+        rc = jsonRpc_handleReply(func, reply, args);
+
+        STRCMP_EQUAL("this is an pre-allocated string", result);
+
+        free(result);
+        dynInterface_destroy(intf);
+    }
+
 }
 
 TEST_GROUP(JsonRpcTests) {
@@ -326,4 +362,8 @@ TEST(JsonRpcTests, handleOutSeq) {
     handleTestOutputSequence();
 }
 
+TEST(JsonRpcTests, handleOutChar) {
+       handleTestOutChar();
+}
+
 

Reply via email to