in bundles/remote_services/remote_service_admin_shm_v2/rsa_shm/src/rsa_shm_export_registration.c [71:144]
celix_status_t exportRegistration_create(celix_bundle_context_t *context,
celix_log_helper_t *logHelper, service_reference_pt reference,
endpoint_description_t *endpointDesc, export_registration_t **exportOut) {
celix_status_t status = CELIX_SUCCESS;
if (context == NULL || logHelper == NULL || reference == NULL
|| endpointDescription_isInvalid(endpointDesc) || exportOut == NULL) {
return CELIX_ILLEGAL_ARGUMENT;
}
celix_autofree export_registration_t *export = calloc(1, sizeof(*export));
if (export == NULL) {
celix_logHelper_error(logHelper,"RSA export reg: Failed to alloc registration.");
return CELIX_ENOMEM;
}
celix_ref_init(&export->ref);
export->context = context;
export->logHelper = logHelper;
celix_autoptr(endpoint_description_t) epDesc = endpointDescription_clone(endpointDesc);
if (epDesc == NULL) {
celix_logHelper_error(logHelper,"RSA export reg: Error cloning endpoint desc.");
return CELIX_ENOMEM;
}
export->endpointDesc = epDesc;
export->rpcFac = NULL;
export->reqHandlerSvcTrkId = -1;
export->reqHandlerSvcId = -1;
export->reqHandlerSvcEntry = NULL;
export->reference = reference;
status = bundleContext_retainServiceReference(context, reference);
if (status != CELIX_SUCCESS) {
celix_logHelper_error(logHelper,"RSA export reg: Retain refrence for %s failed. %d.", endpointDesc->serviceName, status);
return status;
}
celix_auto(celix_service_ref_guard_t) ref = celix_ServiceRefGuard_init(context, reference);
celix_autoptr(export_request_handler_service_entry_t) reqHandlerSvcEntry = exportRegistration_createReqHandlerSvcEntry();
if (reqHandlerSvcEntry == NULL) {
celix_logHelper_error(export->logHelper,"RSA export reg: Error creating endpoint svc entry.");
return CELIX_ENOMEM;
}
export->reqHandlerSvcEntry = reqHandlerSvcEntry;
const char *rsaShmRpcType = celix_properties_get(endpointDesc->properties, RSA_SHM_RPC_TYPE_KEY, NULL);
if (rsaShmRpcType == NULL) {
celix_logHelper_error(logHelper,"RSA export reg: %s property is not exist.", RSA_SHM_RPC_TYPE_KEY);
return CELIX_ILLEGAL_ARGUMENT;
}
char filter[128] = {0};
int bytes = snprintf(filter, sizeof(filter), "(%s=%s)", CELIX_RSA_RPC_TYPE_KEY, rsaShmRpcType);
if (bytes >= sizeof(filter)) {
celix_logHelper_error(logHelper, "RSA export reg: The value(%s) of %s is too long.", rsaShmRpcType, CELIX_RSA_RPC_TYPE_KEY);
return CELIX_ILLEGAL_ARGUMENT;
}
celix_service_tracking_options_t opts = CELIX_EMPTY_SERVICE_TRACKING_OPTIONS;
opts.filter.filter = filter;
opts.filter.serviceName = CELIX_RSA_RPC_FACTORY_NAME;
opts.filter.versionRange = CELIX_RSA_RPC_FACTORY_USE_RANGE;
opts.callbackHandle = export;
opts.add = exportRegistration_addRpcFac;
opts.remove = exportRegistration_removeRpcFac;
export->rpcSvcTrkId = celix_bundleContext_trackServicesWithOptionsAsync(context, &opts);
if (export->rpcSvcTrkId < 0) {
celix_logHelper_error(logHelper, "RSA export reg: Error Tracking service for %s.", CELIX_RSA_RPC_FACTORY_NAME);
return CELIX_SERVICE_EXCEPTION;
}
celix_steal_ptr(reqHandlerSvcEntry);
celix_steal_ptr(ref.reference);
celix_steal_ptr(epDesc);
*exportOut = celix_steal_ptr(export);
return CELIX_SUCCESS;
}