libs/framework/include/celix_dm_component.h (79 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_COMPONENT_H_ #define CELIX_COMPONENT_H_ #include <stdbool.h> #include "celix_types.h" #include "celix_errno.h" #include "celix_properties.h" #include "celix_array_list.h" #include "celix_dm_info.h" #include "celix_framework_export.h" #include "celix_cleanup.h" #ifdef __cplusplus extern "C" { #endif #define CELIX_DM_COMPONENT_UUID "component.uuid" typedef enum celix_dm_component_state_enum { CELIX_DM_CMP_STATE_INACTIVE = 1, CELIX_DM_CMP_STATE_WAITING_FOR_REQUIRED = 2, CELIX_DM_CMP_STATE_INITIALIZING = 3, CELIX_DM_CMP_STATE_DEINITIALIZING = 4, CELIX_DM_CMP_STATE_INITIALIZED_AND_WAITING_FOR_REQUIRED = 5, CELIX_DM_CMP_STATE_STARTING = 6, CELIX_DM_CMP_STATE_STOPPING = 7, CELIX_DM_CMP_STATE_TRACKING_OPTIONAL = 8, CELIX_DM_CMP_STATE_SUSPENDING = 9, CELIX_DM_CMP_STATE_SUSPENDED = 10, CELIX_DM_CMP_STATE_RESUMING = 11, /** * Note this dm state enums are deprecated, but for * now still supported. */ DM_CMP_STATE_INACTIVE = 1, DM_CMP_STATE_WAITING_FOR_REQUIRED = 2, DM_CMP_STATE_INSTANTIATED_AND_WAITING_FOR_REQUIRED = 5, DM_CMP_STATE_TRACKING_OPTIONAL = 8, } celix_dm_component_state_t; #define CELIX_DM_COMPONENT_MAX_ID_LENGTH 64 #define CELIX_DM_COMPONENT_MAX_NAME_LENGTH 128 typedef int (*celix_dm_cmp_lifecycle_fpt)(void *userData); typedef void (*celix_dm_cmp_impl_destroy_fpt)(void*); /** * Creates a DM Component with a random generated UUID. * Caller has ownership. */ CELIX_FRAMEWORK_EXPORT celix_dm_component_t* celix_dmComponent_create(celix_bundle_context_t *context, const char* name); /** * Creates a DM Component with a provided UUID. * Caller has ownership. */ CELIX_FRAMEWORK_EXPORT celix_dm_component_t* celix_dmComponent_createWithUUID(celix_bundle_context_t *context, const char* name, const char* UUID); /** * Get the UUID of the component. */ CELIX_FRAMEWORK_EXPORT const char* celix_dmComponent_getUUID(celix_dm_component_t* cmp); /** * Destroys a DM Component */ CELIX_FRAMEWORK_EXPORT void celix_dmComponent_destroy(celix_dm_component_t* cmp); CELIX_DEFINE_AUTOPTR_CLEANUP_FUNC(celix_dm_component_t, celix_dmComponent_destroy); /** * Destroys a DM Component on the event thread. * Will call doneCallback (if not NULL) when done. * */ CELIX_FRAMEWORK_EXPORT void celix_dmComponent_destroyAsync(celix_dm_component_t* cmp, void *doneData, void (*doneCallback)(void*)); /** * Specify if a default 'service.lang=C' should be added to the properties of interfaces if no 'service.lang' has been * provided. Default is false. Note that this should be set before using component_addInterface. */ CELIX_FRAMEWORK_DEPRECATED_EXPORT celix_status_t celix_dmComponent_setCLanguageProperty(celix_dm_component_t *component, bool setCLangProp); /** * Adds a C interface to provide as service to the Celix framework. * * @param serviceName the service name. * @param version The version of the interface (e.g. "1.0.0"), Can be a NULL pointer. * @param properties To (meta) properties to provide with the service. Can be a NULL pointer. */ CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmComponent_addInterface(celix_dm_component_t *component, const char* serviceName, const char* serviceVersion, const void* service, celix_properties_t *properties); /** * Removed a C interface from a component the Celix framework. * * @param serviceName the service name. * @return CELIX_SUCCESS when removed, CELIX_ILLEGAL_ARGUMENT when the component does not provide the interface */ CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmComponent_removeInterface(celix_dm_component_t *component, const void* service); /** * Sets the implementation of the component. e.g. the component handle/self/this pointer. */ CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmComponent_setImplementation(celix_dm_component_t *component, void* implementation); /** * Configures the destroy function for the component implementation. * * If a destroy function for the component implementation is configured, this will be used * when the component is removed from the dependency manager and component is successfully de-activated. * * The destroy function will not be called if the component implementation is not set. e.g. if the * celix_dmComponent_setImplementation is not called with a non NULL value. */ CELIX_FRAMEWORK_EXPORT void celix_dmComponent_setImplementationDestroyFunction(celix_dm_component_t* cmp, celix_dm_cmp_impl_destroy_fpt destroyFn); /** * Configures the destroy function for the component implementation using a MACRO for improving the type safety. */ #define CELIX_DM_COMPONENT_SET_IMPLEMENTATION_DESTROY_FUNCTION(dmCmp, type, destroy) \ do { \ void (*_destroyFunction)(type*) = (destroy); \ celix_dmComponent_setImplementationDestroyFunction((dmCmp), (void(*)(void*))_destroyFunction); \ } while(0) /** * Returns an arraylist of service names. The caller owns the arraylist and strings (char *) */ CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmComponent_getInterfaces(celix_dm_component_t *component, celix_array_list_t **servicesNames); /** * Adds a C service dependency to the component */ CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmComponent_addServiceDependency(celix_dm_component_t *component, celix_dm_service_dependency_t *dep); /** * Removes a C service dependency to the component */ CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmComponent_removeServiceDependency(celix_dm_component_t *component, celix_dm_service_dependency_t *dependency); /** * Returns the current state of the component. */ CELIX_FRAMEWORK_EXPORT celix_dm_component_state_t celix_dmComponent_currentState(celix_dm_component_t* cmp); /** * Returns the implementation of the component. e.g. the component handle/self/this pointer. */ CELIX_FRAMEWORK_EXPORT void * celix_dmComponent_getImplementation(celix_dm_component_t* cmp); /** * Returns the configured component implementation destroy function. */ CELIX_FRAMEWORK_EXPORT celix_dm_cmp_impl_destroy_fpt celix_dmComponent_getImplementationDestroyFunction(celix_dm_component_t* cmp); /** * Returns the DM component name. This is used when printing information about the component. */ CELIX_FRAMEWORK_EXPORT const char* celix_dmComponent_getName(celix_dm_component_t* cmp); /** * Returns bundle context for the bundle where this DM component is part of. */ CELIX_FRAMEWORK_EXPORT celix_bundle_context_t* celix_dmComponent_getBundleContext(celix_dm_component_t *component); /** * Set the component life cycle callbacks. * The first argument will be the component implementation (@see component_getImplementation) */ CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmComponent_setCallbacks(celix_dm_component_t *component, celix_dm_cmp_lifecycle_fpt init, celix_dm_cmp_lifecycle_fpt start, celix_dm_cmp_lifecycle_fpt stop, celix_dm_cmp_lifecycle_fpt deinit); /** * Set the component life cycle callbacks using a MACRO for improving the type safety. */ #define CELIX_DM_COMPONENT_SET_CALLBACKS(dmCmp, type, init, start, stop, deinit) \ do { \ int (*_tmp_init)(type*) = (init); \ int (*_tmp_start)(type*) = (start); \ int (*_tmp_stop)(type*) = (stop); \ int (*_tmp_deinit)(type*) = (deinit); \ celix_dmComponent_setCallbacks((dmCmp), (celix_dm_cmp_lifecycle_fpt)_tmp_init, (celix_dm_cmp_lifecycle_fpt)_tmp_start, (celix_dm_cmp_lifecycle_fpt)_tmp_stop, (celix_dm_cmp_lifecycle_fpt)_tmp_deinit); \ } while(0) CELIX_FRAMEWORK_EXPORT bool celix_dmComponent_isActive(celix_dm_component_t *component); /** * Returns the string value of a provided state */ CELIX_FRAMEWORK_EXPORT const char* celix_dmComponent_stateToString(celix_dm_component_state_t state); /** * Deprecated, use CELIX_DM_COMPONENT_SET_CALLBACKS instead. */ #define CELIX_DMCOMPONENT_SETCALLBACKS(dmCmp, type, init, start, stop, deinit) \ CELIX_DM_COMPONENT_SET_CALLBACKS(dmCmp, type*, init, start, stop, deinit) /** * Create a DM Component info struct. Containing information about the component. * Caller has ownership. */ CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmComponent_getComponentInfo(celix_dm_component_t *component, celix_dm_component_info_t** infoOut); /** * Print the component info to the provided stream. * @param info The component info to print. * @param printFullInfo Whether to print the full info or summary. * @param useAnsiColors Whether to use ansi colors when printing the component info. * @param stream The stream to print to (e..g stdout). */ CELIX_FRAMEWORK_EXPORT void celix_dmComponent_printComponentInfo(celix_dm_component_info_t* info, bool printFullInfo, bool useAnsiColors, FILE* stream); /** * Destroys a DM Component info struct. */ CELIX_FRAMEWORK_EXPORT void celix_dmComponent_destroyComponentInfo(dm_component_info_pt info); #ifdef __cplusplus } #endif #endif /* COMPONENT_H_ */