libs/framework/include/celix_dm_service_dependency.h (55 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef CELIX_DM_SERVICE_DEPENDENCY_H_
#define CELIX_DM_SERVICE_DEPENDENCY_H_
#include "celix_types.h"
#include "celix_errno.h"
#include "celix_threads.h"
#include "celix_dm_info.h"
#include "celix_framework_export.h"
#include "celix_cleanup.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef enum celix_dm_service_dependency_strategy_enum {
DM_SERVICE_DEPENDENCY_STRATEGY_LOCKING,
DM_SERVICE_DEPENDENCY_STRATEGY_SUSPEND
} celix_dm_service_dependency_strategy_t;
typedef int (*celix_dm_service_update_fp)(void *handle, void* service);
typedef int (*celix_dm_service_swap_fp)(void *handle, void* oldService, void* newService);
typedef int (*celix_dm_service_update_with_props_fp)(void *handle, void* service, const celix_properties_t *props);
typedef int (*celix_dm_service_swap_with_props_fp)(void *handle, void* oldService, void* newService, const celix_properties_t *newProps);
typedef struct celix_dm_service_dependency_callback_options {
celix_dm_service_update_fp set;
celix_dm_service_update_fp add;
celix_dm_service_update_fp remove;
celix_dm_service_swap_fp swap; //not used, deprecated
celix_dm_service_update_with_props_fp setWithProps;
celix_dm_service_update_with_props_fp addWithProps;
celix_dm_service_update_with_props_fp removeWithProps;
celix_dm_service_swap_with_props_fp swapWithProps; //not used, deprecated
} celix_dm_service_dependency_callback_options_t;
#define CELIX_EMPTY_DM_SERVICE_DEPENDENCY_CALLBACK_OPTIONS { .set = NULL, \
.add = NULL, \
.remove = NULL, \
.swap = NULL, \
.setWithProps = NULL, \
.addWithProps = NULL, \
.removeWithProps = NULL, \
.swapWithProps = NULL }
/**
* Create a service dependency.
* Caller has ownership.
*
* \warning The dmServiceDependency is not thread safe when constructing or modifying.
* The handling of service updates is thread safe.
*/
CELIX_FRAMEWORK_EXPORT celix_dm_service_dependency_t* celix_dmServiceDependency_create(void);
/**
* Destroys a service dependency.
* Will normally be done the by the DM Component.
*
* Can only be called if the serviceDependency is disabled (note that a service dependency not added to a
* component is disabled).
*/
CELIX_FRAMEWORK_EXPORT void celix_dmServiceDependency_destroy(celix_dm_service_dependency_t *dep);
CELIX_DEFINE_AUTOPTR_CLEANUP_FUNC(celix_dm_service_dependency_t, celix_dmServiceDependency_destroy);
/**
* Specify if the service dependency is required. default is false
*/
CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmServiceDependency_setRequired(celix_dm_service_dependency_t *dependency, bool required);
/**
* Specify if the service dependency update strategy.
*
* The DM_SERVICE_DEPENDENCY_STRATEGY_LOCKING strategy notifies the component in case the dependencies set
* changes (e.g. a dependency is added/removed): the component is responsible for protecting via locks
* the dependencies list and check (always under lock) if the service he's depending on is still available.
*
* The DM_SERVICE_DEPENDENCY_STRATEGY_SUSPEND (default when no strategy is explicitly set) reliefs the programmer
* from dealing with service dependencies' consistency issues: in case this strategy is adopted, the component
* is stopped and restarted (i.e. temporarily suspended) upon service dependencies' changes.
*
* Default strategy is DM_SERVICE_DEPENDENCY_STRATEGY_SUSPEND
*/
CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmServiceDependency_setStrategy(celix_dm_service_dependency_t *dependency, celix_dm_service_dependency_strategy_t strategy);
/**
* Return the service dependency update strategy.
*/
CELIX_FRAMEWORK_EXPORT celix_dm_service_dependency_strategy_t celix_dmServiceDependency_getStrategy(celix_dm_service_dependency_t *dependency);
/**
* Set the service name, version range and filter.
*
* @param serviceName The service name. Must have a value.
* @param serviceVersionRange The service version range, can be a NULL pointer.
* @param filter The (additional) filter to use (e.g. "(location=front)"). Can be a NULL pointer.
*/
CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmServiceDependency_setService(celix_dm_service_dependency_t *dependency, const char* serviceName, const char* serviceVersionRange, const char* filter);
/**
* Returns the service dependency filter.
*/
CELIX_FRAMEWORK_EXPORT const char* celix_dmServiceDependency_getFilter(celix_dm_service_dependency_t *dependency);
/**
* Set the set callbacks when services specified by the service dependency
* The first argument of the callbacks will be the component implement (@see component_getImplementation)
* The second the argument a pointer to an instance of a service struct of the specified service dependency.
*/
CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmServiceDependency_setCallback(celix_dm_service_dependency_t *dependency, celix_dm_service_update_fp set);
/**
* Set the set function callbacks when services specified by the service dependency
* The first argument of the callbacks will be the component implement (@see component_getImplementation)
* The second argument of th callbacks will be a pointer to an instance of a service struct of the specified service dependency.
* The third argument of th callbacks will be a pointer to a service properties of the a service instance of the specified service dependency.
*/
CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmServiceDependency_setCallbackWithProperties(celix_dm_service_dependency_t *dependency, celix_dm_service_update_with_props_fp set);
/**
* Set the set, add, change, remove and swap function callbacks when services specified by the service dependency
* are (respectively) set, added, changed, removed or swapped.
*
* The version with the WithProps suffix will be called with as third argument the service properties.
*/
CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmServiceDependency_setCallbacksWithOptions(celix_dm_service_dependency_t *dependency, const celix_dm_service_dependency_callback_options_t *opts);
/**
* Set the callback handle to be used in the callbacks. Note that this normally should not be set, because the
* result of component_getImplementation() is used
* This can be used in rare cases when the callbacks are actually interceptors. e.g. in the case of C++ support.
*/
CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmServiceDependency_setCallbackHandle(celix_dm_service_dependency_t *dependency, void* handle);
/**
* Creates a service dependency info. The service dependency info struct contains information about the service dependency.
* The caller is the owner
*/
CELIX_FRAMEWORK_EXPORT dm_service_dependency_info_t* celix_dmServiceDependency_createInfo(celix_dm_service_dependency_t* dep);
/**
* Destroy a provided service dependency info struct.
*/
CELIX_FRAMEWORK_EXPORT void celix_dmServiceDependency_destroyInfo(celix_dm_service_dependency_t *dep, dm_service_dependency_info_t *info);
#ifdef __cplusplus
}
#endif
#endif /* CELIX_DM_SERVICE_DEPENDENCY_H_ */