in bundles/remote_services/remote_service_admin_dfi/src/import_registration_dfi.c [314:384]
static void importRegistration_proxyFunc(void *userData, void *args[], void *returnVal) {
int status = CELIX_SUCCESS;
struct method_entry *entry = userData;
import_registration_t *import = *((void **)args[0]);
*(int *) returnVal = CELIX_SUCCESS;
if (import == NULL || import->send == NULL) {
status = CELIX_ILLEGAL_ARGUMENT;
}
char *invokeRequest = NULL;
if (status == CELIX_SUCCESS) {
int rc = jsonRpc_prepareInvokeRequest(entry->dynFunc, entry->id, args, &invokeRequest);
status = (rc != 0) ? CELIX_BUNDLE_EXCEPTION : CELIX_SUCCESS;
//printf("Need to send following json '%s'\n", invokeRequest);
}
if (status == CELIX_SUCCESS) {
char *reply = NULL;
//printf("sending request\n");
celix_properties_t *metadata = NULL;
bool cont = remoteInterceptorHandler_invokePreProxyCall(import->interceptorsHandler, import->endpoint->properties,
dynFunction_getName(entry->dynFunc), &metadata);
if (cont) {
status = import->send(import->sendHandle, import->endpoint, invokeRequest, metadata, &reply);
//printf("request sended. got reply '%s' with status %i\n", reply, rc);
if (status == CELIX_SUCCESS && dynFunction_hasReturn(entry->dynFunc)) {
//fjprintf("Handling reply '%s'\n", reply);
int rsErrno = CELIX_SUCCESS;
int retVal = jsonRpc_handleReply(entry->dynFunc, reply, args, &rsErrno);
if(retVal != 0) {
status = CELIX_BUNDLE_EXCEPTION;
} else if (rsErrno != CELIX_SUCCESS) {
//return the invocation error of remote service function
*(int *) returnVal = rsErrno;
}
}
remoteInterceptorHandler_invokePostProxyCall(import->interceptorsHandler, import->endpoint->properties,
dynFunction_getName(entry->dynFunc), metadata);
} else {
*(int *) returnVal = CELIX_INTERCEPTOR_EXCEPTION;
}
//free metadata
if(metadata != NULL) {
celix_properties_destroy(metadata);
}
if (import->logFile != NULL) {
static int callCount = 0;
const char *url = importRegistration_getUrl(import);
const char *svcName = importRegistration_getServiceName(import);
fprintf(import->logFile, "REMOTE CALL NR %i\n\turl=%s\n\tservice=%s\n\tpayload=%s\n\treturn_code=%i\n\treply=%s\n",
callCount, url, svcName, invokeRequest, status, reply == NULL ? "null" : reply);
fflush(import->logFile);
callCount += 1;
}
free(invokeRequest); //Allocated by json_dumps in jsonRpc_prepareInvokeRequest
free(reply); //Allocated by json_dumps in remoteServiceAdmin_send through curl call
}
if (status != CELIX_SUCCESS) {
//TODO log error
*(int *) returnVal = status;
}
}