You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2015/11/03 16:09:55 UTC
[29/50] [abbrv] celix git commit: CELIX-273: Added sring handling for
output parameters
CELIX-273: Added sring handling for output parameters
Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/57991e92
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/57991e92
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/57991e92
Branch: refs/heads/master
Commit: 57991e923c13c49575d33b32591a4acafe6f5d42
Parents: 1006790
Author: Bjoern Petri <bp...@apache.org>
Authored: Wed Oct 28 19:24:32 2015 +0100
Committer: Bjoern Petri <bp...@apache.org>
Committed: Wed Oct 28 19:24:32 2015 +0100
----------------------------------------------------------------------
.../dynamic_function_interface/json_rpc.c | 40 +++++++++-----
.../descriptors/example4.descriptor | 2 +-
.../json_rpc_tests.cpp | 56 +++++++++++++++++---
3 files changed, 78 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/celix/blob/57991e92/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 48f9ba5..14967a5 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
@@ -145,22 +145,26 @@ int jsonRpc_call(dyn_interface_type *intf, void *service, const char *request, c
dynType_free(argType, args[i]);
} else if (meta == DYN_FUNCTION_ARGUMENT_META__OUTPUT) {
if (ptr != NULL) {
-
dyn_type *typedType = NULL;
if (status == OK) {
status = dynType_typedPointer_getTypedType(argType, &typedType);
}
-
- dyn_type *typedTypedType = NULL;
- if (status == OK) {
- status = dynType_typedPointer_getTypedType(typedType, &typedTypedType);
+ if (dynType_descriptorType(typedType) == 't') {
+ status = jsonSerializer_serializeJson(typedType, (void*) &ptr, &jsonResult);
}
+ else {
+ dyn_type *typedTypedType = NULL;
+ if (status == OK) {
+ status = dynType_typedPointer_getTypedType(typedType, &typedTypedType);
+ }
- status = jsonSerializer_serializeJson(typedTypedType, ptr, &jsonResult);
+ status = jsonSerializer_serializeJson(typedTypedType, ptr, &jsonResult);
- if (status == OK) {
- dynType_free(typedTypedType, ptr);
+ if (status == OK) {
+ dynType_free(typedTypedType, ptr);
+ }
}
+
} else {
LOG_DEBUG("Output ptr is null");
}
@@ -272,13 +276,13 @@ int jsonRpc_handleReply(dyn_function_type *func, const char *reply, void *args[]
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 {
+ dynType_typedPointer_getTypedType(argType, &argType);
status = jsonSerializer_deserializeJson(argType, result, &tmp);
size = dynType_size(argType);
memcpy(*out, tmp, size);
@@ -287,11 +291,21 @@ int jsonRpc_handleReply(dyn_function_type *func, const char *reply, void *args[]
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];
- status = jsonSerializer_deserializeJson(subSubType, result, *out);
+
+ if (dynType_descriptorType(subType) == 't') {
+ void* tmp = NULL;
+ status = jsonSerializer_deserializeJson(subType, result, &tmp);
+ void ***out = (void ***) args[i];
+ **out = * (void**) tmp;
+ }
+ else {
+ dyn_type *subSubType = NULL;
+ dynType_typedPointer_getTypedType(subType, &subSubType);
+ void **out = (void **) args[i];
+ status = jsonSerializer_deserializeJson(subSubType, result, *out);
+ }
} else {
//skip
}
http://git-wip-us.apache.org/repos/asf/celix/blob/57991e92/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/descriptors/example4.descriptor
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/descriptors/example4.descriptor b/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/descriptors/example4.descriptor
index 542d21b..4c959c4 100644
--- a/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/descriptors/example4.descriptor
+++ b/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/descriptors/example4.descriptor
@@ -5,4 +5,4 @@ version=1.0.0
:annotations
:types
:methods
-getName(V)t=getName(#am=handle;P#am=pre;*t)N
+getName(V)t=getName(#am=handle;P#am=out;*t)N
http://git-wip-us.apache.org/repos/asf/celix/blob/57991e92/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 c84ccd1..0a7d297 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
@@ -81,6 +81,11 @@ static void stdLog(void *handle, int level, const char *file, int line, const ch
return 0;
}
+ int getName_example4(void *handle, char** result) {
+ *result = strdup("allocatedInFunction");
+ return 0;
+ }
+
struct tst_seq {
uint32_t cap;
uint32_t len;
@@ -150,6 +155,11 @@ static void stdLog(void *handle, int level, const char *file, int line, const ch
int (*stats)(void *, struct tst_seq, struct tst_StatsResult **);
};
+ struct tst_serv_example4 {
+ void *handle;
+ int (*getName_example4)(void *, char** name);
+ };
+
void callTestPreAllocated(void) {
dyn_interface_type *intf = NULL;
FILE *desc = fopen("descriptors/example1.descriptor", "r");
@@ -287,6 +297,32 @@ static void stdLog(void *handle, int level, const char *file, int line, const ch
}
+
+
+ void callTestOutChar(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);
+
+ char *result = NULL;
+
+ struct tst_serv_example4 serv;
+ serv.handle = NULL;
+ serv.getName_example4 = getName_example4;
+
+ rc = jsonRpc_call(intf, &serv, "{\"m\":\"getName(V)t\", \"a\": []}", &result);
+ CHECK_EQUAL(0, rc);
+
+ STRCMP_CONTAINS("allocatedInFunction", result);
+
+ free(result);
+ dynInterface_destroy(intf);
+ }
+
+
void handleTestOutChar(void) {
dyn_interface_type *intf = NULL;
FILE *desc = fopen("descriptors/example4.descriptor", "r");
@@ -305,23 +341,26 @@ static void stdLog(void *handle, int level, const char *file, int line, const ch
break;
}
}
+
CHECK(func != NULL);
- const char *reply = "{\"r\": \"this is an pre-allocated string\" }";
- char *result = (char*) calloc(50, sizeof(*result));
+ const char *reply = "{\"r\": \"this is a test string\" }";
+ char *result = NULL;
+ void *out = &result;
void *args[2];
args[0] = NULL;
- args[1] = &result;
+ args[1] = &out;
rc = jsonRpc_handleReply(func, reply, args);
- STRCMP_EQUAL("this is an pre-allocated string", result);
+ STRCMP_EQUAL("this is a test string", result);
free(result);
dynInterface_destroy(intf);
}
+
}
TEST_GROUP(JsonRpcTests) {
@@ -362,8 +401,13 @@ TEST(JsonRpcTests, handleOutSeq) {
handleTestOutputSequence();
}
-TEST(JsonRpcTests, handleOutChar) {
- handleTestOutChar();
+
+
+TEST(JsonRpcTests, callTestOutChar) {
+ callTestOutChar();
}
+TEST(JsonRpcTests, handleOutChar) {
+ handleTestOutChar();
+}