celix_status_t exportRegistration_create()

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;
}