celix_status_t celix_eventAdminActivator_start()

in bundles/event_admin/event_admin/src/celix_event_admin_activator.c [37:155]


celix_status_t celix_eventAdminActivator_start(celix_event_admin_activator_t *act, celix_bundle_context_t *ctx) {
    assert(act != NULL);
    assert(ctx != NULL);
    celix_status_t status = CELIX_SUCCESS;
    celix_autoptr(celix_dm_component_t) adminCmp = celix_dmComponent_create(ctx, "EVENT_ADMIN_CMP");
    if (adminCmp == NULL) {
        return CELIX_ENOMEM;
    }

    act->eventAdmin = celix_eventAdmin_create(ctx);
    if (act->eventAdmin == NULL) {
        return CELIX_BUNDLE_EXCEPTION;
    }
    celix_dmComponent_setImplementation(adminCmp, act->eventAdmin);
    CELIX_DM_COMPONENT_SET_CALLBACKS(adminCmp, celix_event_admin_t, NULL, celix_eventAdmin_start, celix_eventAdmin_stop, NULL);
    CELIX_DM_COMPONENT_SET_IMPLEMENTATION_DESTROY_FUNCTION(adminCmp, celix_event_admin_t, celix_eventAdmin_destroy);

    {
        celix_autoptr(celix_dm_service_dependency_t) eventHandlerDep = celix_dmServiceDependency_create();
        if (eventHandlerDep == NULL) {
            return CELIX_ENOMEM;
        }
        status = celix_dmServiceDependency_setService(eventHandlerDep, CELIX_EVENT_HANDLER_SERVICE_NAME, CELIX_EVENT_HANDLER_SERVICE_USE_RANGE, "("CELIX_EVENT_TOPIC"=*)");//Event Handlers which have not specified the EVENT_TOPIC service property must not receive events.
        if (status != CELIX_SUCCESS) {
            return status;
        }
        celix_dmServiceDependency_setStrategy(eventHandlerDep, DM_SERVICE_DEPENDENCY_STRATEGY_LOCKING);
        celix_dm_service_dependency_callback_options_t opts = CELIX_EMPTY_DM_SERVICE_DEPENDENCY_CALLBACK_OPTIONS;
        opts.addWithProps = celix_eventAdmin_addEventHandlerWithProperties;
        opts.removeWithProps = celix_eventAdmin_removeEventHandlerWithProperties;
        celix_dmServiceDependency_setCallbacksWithOptions(eventHandlerDep, &opts);
        status = celix_dmComponent_addServiceDependency(adminCmp, eventHandlerDep);
        if (status != CELIX_SUCCESS) {
            return status;
        }
        celix_steal_ptr(eventHandlerDep);
    }

    {
        celix_autoptr(celix_dm_service_dependency_t) remoteProviderDep = celix_dmServiceDependency_create();
        if (remoteProviderDep == NULL) {
            return CELIX_ENOMEM;
        }
        status = celix_dmServiceDependency_setService(remoteProviderDep, CELIX_EVENT_REMOTE_PROVIDER_SERVICE_NAME, CELIX_EVENT_REMOTE_PROVIDER_SERVICE_USE_RANGE, NULL);
        if (status != CELIX_SUCCESS) {
            return status;
        }
        celix_dmServiceDependency_setStrategy(remoteProviderDep, DM_SERVICE_DEPENDENCY_STRATEGY_LOCKING);
        celix_dm_service_dependency_callback_options_t opts = CELIX_EMPTY_DM_SERVICE_DEPENDENCY_CALLBACK_OPTIONS;
        opts.addWithProps = celix_eventAdmin_addRemoteProviderService;
        opts.removeWithProps = celix_eventAdmin_removeRemoteProviderService;
        celix_dmServiceDependency_setCallbacksWithOptions(remoteProviderDep, &opts);
        status = celix_dmComponent_addServiceDependency(adminCmp, remoteProviderDep);
        if (status != CELIX_SUCCESS) {
            return status;
        }
        celix_steal_ptr(remoteProviderDep);
    }

    act->eventAdminService.handle = act->eventAdmin;
    act->eventAdminService.postEvent = celix_eventAdmin_postEvent;
    act->eventAdminService.sendEvent = celix_eventAdmin_sendEvent;
    status = celix_dmComponent_addInterface(adminCmp, CELIX_EVENT_ADMIN_SERVICE_NAME, CELIX_EVENT_ADMIN_SERVICE_VERSION, &act->eventAdminService, NULL);
    if (status != CELIX_SUCCESS) {
        return status;
    }

    celix_autoptr(celix_dm_component_t) adapterCmp = celix_dmComponent_create(ctx, "EVENT_ADAPTER_CMP");
    if (adapterCmp == NULL) {
        return CELIX_ENOMEM;
    }
    act->eventAdapter = celix_eventAdapter_create(ctx);
    if (act->eventAdapter == NULL) {
        return CELIX_ENOMEM;
    }
    celix_dmComponent_setImplementation(adapterCmp, act->eventAdapter);
    CELIX_DM_COMPONENT_SET_CALLBACKS(adapterCmp, celix_event_adapter_t, NULL, celix_eventAdapter_start, celix_eventAdapter_stop, NULL);
    CELIX_DM_COMPONENT_SET_IMPLEMENTATION_DESTROY_FUNCTION(adapterCmp, celix_event_adapter_t, celix_eventAdapter_destroy);

    {
        celix_autoptr(celix_dm_service_dependency_t) eventAdminDep = celix_dmServiceDependency_create();
        if (eventAdminDep == NULL) {
            return CELIX_ENOMEM;
        }
        status = celix_dmServiceDependency_setService(eventAdminDep, CELIX_EVENT_ADMIN_SERVICE_NAME, CELIX_EVENT_ADMIN_SERVICE_USE_RANGE, NULL);
        if (status != CELIX_SUCCESS) {
            return status;
        }
        celix_dmServiceDependency_setRequired(eventAdminDep, true);
        celix_dmServiceDependency_setStrategy(eventAdminDep, DM_SERVICE_DEPENDENCY_STRATEGY_LOCKING);
        celix_dm_service_dependency_callback_options_t opts2 = CELIX_EMPTY_DM_SERVICE_DEPENDENCY_CALLBACK_OPTIONS;
        opts2.set = celix_eventAdapter_setEventAdminService;
        celix_dmServiceDependency_setCallbacksWithOptions(eventAdminDep, &opts2);
        status = celix_dmComponent_addServiceDependency(adapterCmp, eventAdminDep);
        if (status != CELIX_SUCCESS) {
            return status;
        }
        celix_steal_ptr(eventAdminDep);
    }

    celix_dependency_manager_t *mng = celix_bundleContext_getDependencyManager(ctx);
    if (mng == NULL) {
        return CELIX_ENOMEM;
    }

    status = celix_dependencyManager_addAsync(mng, adapterCmp);
    if (status != CELIX_SUCCESS) {
        return status;
    }
    status = celix_dependencyManager_addAsync(mng, adminCmp);
    if (status != CELIX_SUCCESS) {
        celix_dependencyManager_removeAsync(mng, celix_steal_ptr(adapterCmp), NULL, NULL);
        return status;
    }
    celix_steal_ptr(adapterCmp);
    celix_steal_ptr(adminCmp);

    return status;
}