in bundles/remote_services/discovery_zeroconf/src/discovery_zeroconf_activator.c [40:131]
celix_status_t discoveryZeroconfActivator_start(discovery_zeroconf_activator_t *act, celix_bundle_context_t *ctx) {
celix_status_t status = CELIX_SUCCESS;
const char *fwUuid = celix_bundleContext_getProperty(ctx, CELIX_FRAMEWORK_UUID, NULL);
if (fwUuid == NULL) {
return CELIX_BUNDLE_EXCEPTION;
}
celix_autoptr(celix_log_helper_t) logger = celix_logHelper_create(ctx, "celix_rsa_zeroconf_discovery");
if (logger == NULL) {
return CELIX_ENOMEM;
}
//init announcer
celix_autoptr(celix_dm_component_t) announcerCmp = celix_dmComponent_create(ctx, "DZC_ANNOUNCER_CMP");
if (announcerCmp == NULL) {
return CELIX_ENOMEM;
}
status = discoveryZeroconfAnnouncer_create(ctx, logger, &act->announcer);
if (status != CELIX_SUCCESS) {
return status;
}
celix_dmComponent_setImplementation(announcerCmp, act->announcer);
CELIX_DM_COMPONENT_SET_IMPLEMENTATION_DESTROY_FUNCTION(announcerCmp, discovery_zeroconf_announcer_t, discoveryZeroconfAnnouncer_destroy);
celix_autoptr(celix_properties_t) props = celix_properties_create();
if (props == NULL) {
return CELIX_ENOMEM;
}
char scope[256] = {0};
(void)snprintf(scope, sizeof(scope), "(&(%s=*)(%s=%s))", CELIX_FRAMEWORK_SERVICE_NAME,
CELIX_RSA_ENDPOINT_FRAMEWORK_UUID, fwUuid);
status = celix_properties_set(props, CELIX_RSA_ENDPOINT_LISTENER_SCOPE, scope);
if (status != CELIX_SUCCESS) {
return status;
}
celix_properties_set(props, "DISCOVERY", "true");//Only use to avoid the discovery calls to unnecessary endpoint listener service. Endpoint should be filtered by the scope.
status = celix_properties_set(props, CELIX_RSA_DISCOVERY_INTERFACE_SPECIFIC_ENDPOINTS_SUPPORT, "true");
if (status != CELIX_SUCCESS) {
return status;
}
act->endpointListener.handle = act->announcer;
act->endpointListener.endpointAdded = discoveryZeroconfAnnouncer_endpointAdded;
act->endpointListener.endpointRemoved = discoveryZeroconfAnnouncer_endpointRemoved;
celix_dmComponent_addInterface(announcerCmp, CELIX_RSA_ENDPOINT_LISTENER_SERVICE_NAME, NULL,
&act->endpointListener, celix_steal_ptr(props));
//init watcher
celix_autoptr(celix_dm_component_t) watcherCmp = celix_dmComponent_create(ctx, "DZC_WATCHER_CMP");
if (watcherCmp == NULL) {
return CELIX_ENOMEM;
}
status = discoveryZeroconfWatcher_create(ctx, logger, &act->watcher);
if (status != CELIX_SUCCESS) {
return status;
}
celix_dmComponent_setImplementation(watcherCmp, act->watcher);
CELIX_DM_COMPONENT_SET_IMPLEMENTATION_DESTROY_FUNCTION(watcherCmp, discovery_zeroconf_watcher_t, discoveryZeroconfWatcher_destroy);
{
celix_dm_service_dependency_t *discoveredEplDep = celix_dmServiceDependency_create();
if (discoveredEplDep == NULL) {
return CELIX_ENOMEM;
}
celix_dmServiceDependency_setService(discoveredEplDep, CELIX_RSA_ENDPOINT_LISTENER_SERVICE_NAME, NULL, "(!(DISCOVERY=true))");
celix_dm_service_dependency_callback_options_t opts = CELIX_EMPTY_DM_SERVICE_DEPENDENCY_CALLBACK_OPTIONS;
opts.addWithProps = discoveryZeroconfWatcher_addEPL;
opts.removeWithProps = discoveryZeroconfWatcher_removeEPL;
celix_dmServiceDependency_setCallbacksWithOptions(discoveredEplDep, &opts);
celix_dmServiceDependency_setStrategy(discoveredEplDep, DM_SERVICE_DEPENDENCY_STRATEGY_LOCKING);
celix_dmComponent_addServiceDependency(watcherCmp, discoveredEplDep);
}
{
celix_dm_service_dependency_t *rsaDep = celix_dmServiceDependency_create();
if (rsaDep == NULL) {
return CELIX_ENOMEM;
}
celix_dmServiceDependency_setService(rsaDep, CELIX_RSA_REMOTE_SERVICE_ADMIN,
NULL, "(remote.configs.supported=*)");
celix_dm_service_dependency_callback_options_t opts = CELIX_EMPTY_DM_SERVICE_DEPENDENCY_CALLBACK_OPTIONS;
opts.addWithProps = discoveryZeroConfWatcher_addRSA;
opts.removeWithProps = discoveryZeroConfWatcher_removeRSA;
celix_dmServiceDependency_setCallbacksWithOptions(rsaDep, &opts);
celix_dmServiceDependency_setStrategy(rsaDep, DM_SERVICE_DEPENDENCY_STRATEGY_LOCKING);
celix_dmComponent_addServiceDependency(watcherCmp, rsaDep);
}
celix_dependency_manager_t *mng = celix_bundleContext_getDependencyManager(ctx);
if (mng == NULL) {
return CELIX_ENOMEM;
}
celix_dependencyManager_addAsync(mng, celix_steal_ptr(announcerCmp));
celix_dependencyManager_addAsync(mng, celix_steal_ptr(watcherCmp));
act->logHelper = celix_steal_ptr(logger);
return CELIX_SUCCESS;
}