blob: 4625fa5d6e08f65d3198589ba92994c03bce36de [file] [log] [blame]
/*
* 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_DEPENDENCY_MANAGER_H_
#define CELIX_DEPENDENCY_MANAGER_H_
#include "celix_types.h"
#include "celix_errno.h"
#include "celix_array_list.h"
#include "celix_dm_info.h"
#include "celix_framework_export.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @file celix_dependency_manager.h
*
* The `celix_dependencyManager_add`, `celix_dependencyManager_remove` and `celix_dependencyManager_removeAllComponents`
* funcions for celix_dependency_manager_t should be called outside the Celix event thread.
* Note that bundle activators are started and stopped outside the Celix event thread and thus these
* functions can be used in bundle activators.
*
* Inside the Celix event thread - i.e. during a useService callback or add/rem/set call from a service tracker -
* the async versions should be used. After a async function has returned, service registration and opening
* service trackers are (possibly) still in progress.
*/
/**
* @brief Add a DM component to the dependency manager
*
* After this call the components will be build and if the components can be started, they
* will be started and the services will be registered.
*
* After this call the dependency manager has ownership of the component and the dependency manager will also
* de-active and destroy the component when the dependency manager is destroyed.
*
* Should not be called from the Celix event thread.
*/
CELIX_FRAMEWORK_EXPORT celix_status_t celix_dependencyManager_add(celix_dependency_manager_t *manager, celix_dm_component_t *component);
/**
* @brief Same as celix_dependencyManager_add, but this call will not wait until all service registrations and
* tracker are registered/opened on the Celix event thread.
* Can be called on the Celix event thread.
*/
CELIX_FRAMEWORK_EXPORT celix_status_t celix_dependencyManager_addAsync(celix_dependency_manager_t *manager, celix_dm_component_t *component);
/**
* @brief Remove a DM component from the dependency manager and destroys it
*
* After this call - and if the component was found - the component will be destroyed and if the component was started,
* the component will have been stopped and de-initialized.
*
* Should not be called from the Celix event thread.
*/
CELIX_FRAMEWORK_EXPORT celix_status_t celix_dependencyManager_remove(celix_dependency_manager_t *manager, celix_dm_component_t *component);
/**
* @brief Same as celix_dependencyManager_remove, but this call will not wait until component is deactivated.
* Can be called on the Celix event thread.
*
* The doneCallback will be called (if not NULL) with doneData as argument when the component is removed
* and destroyed.
*
*/
CELIX_FRAMEWORK_EXPORT celix_status_t celix_dependencyManager_removeAsync(
celix_dependency_manager_t *manager,
celix_dm_component_t *component,
void* doneData,
void (*doneCallback)(void* data));
/**
* @brief Remove all DM components from the dependency manager.
*
* Should not be called from the Celix event thread.
*/
CELIX_FRAMEWORK_EXPORT celix_status_t celix_dependencyManager_removeAllComponents(celix_dependency_manager_t *manager);
/**
* @brief Same as celix_dependencyManager_removeAllComponents, but this call will not wait til all
* service registration and service trackers are unregistered/closed.
*
* The doneCallback will be called (if not NULL) with doneData as argument when the all component are removed
* and destroyed.
*
* Can be called on the Celix event thread.
*/
CELIX_FRAMEWORK_EXPORT celix_status_t celix_dependencyManager_removeAllComponentsAsync(celix_dependency_manager_t *manager, void *doneData, void (*doneCallback)(void *data));
/**
* @brief Check if all components for the bundle of the dependency manager are active (all required dependencies resolved).
*/
CELIX_FRAMEWORK_EXPORT bool celix_dependencyManager_areComponentsActive(celix_dependency_manager_t *manager);
/**
* @brief Check if all components - for all bundles - are active (all required dependencies resolved).
*/
CELIX_FRAMEWORK_EXPORT bool celix_dependencyManager_allComponentsActive(celix_dependency_manager_t *manager);
/**
* @brief Return the nr of components for this dependency manager
*/
CELIX_FRAMEWORK_EXPORT size_t celix_dependencyManager_nrOfComponents(celix_dependency_manager_t *manager);
/**
* @brief Wait for an empty Celix event queue.
*
* Should not be called on the Celix event queue thread.
*
* Can be used to ensure that all created/updated components are completely processed (services registered
* and/or service trackers are created).
*/
CELIX_FRAMEWORK_EXPORT void celix_dependencyManager_wait(celix_dependency_manager_t* manager);
/**
* @brief Create and returns a dependency manager info struct for the specified bundle.
*
* The dependency manager info contains information about the state of the dependency manager components
*
* Caller has ownership of the return value (use celix_dependencyManager_destroyInfo to free the memory).
*
* @param manager The dependency manager
* @param bndId The bundle id to get the info from.
* @returns The dependency manager info for the provided bundle id or NULL if the bundle id is invalid or the bundle of
* the provided bundle id is not started.
*/
CELIX_FRAMEWORK_EXPORT celix_dependency_manager_info_t* celix_dependencyManager_createInfo(celix_dependency_manager_t *manager, long bndId);
/**
* @brief Create and returns a dependency manager info struct for all started bundles.
*
* The dependency manager info contains information about the state of the dependency manager components
*
* Caller has ownership of the return values (use celix_arrayList_destroy to free the memory).
*
* @param manager The dependency manager
* @returns A Celix array of dependency manager infos (celix_dependency_manager_info_t*)
*/
CELIX_FRAMEWORK_EXPORT celix_array_list_t * /*celix_dependency_manager_info_t* entries*/ celix_dependencyManager_createInfos(celix_dependency_manager_t *manager);
/**
* @brief Destroy a DM info struct.
*/
CELIX_FRAMEWORK_EXPORT void celix_dependencyManager_destroyInfo(celix_dependency_manager_t *manager, celix_dependency_manager_info_t *info);
/**
* @brief Destroy a celix array list of DM info structs.
* @deprecated use celix_arrayList_destroy instead.
*/
CELIX_FRAMEWORK_EXPORT void celix_dependencyManager_destroyInfos(celix_dependency_manager_t *manager, celix_array_list_t * infos /*entries celix_dependency_manager_info_t*/);
/**
* @brief Print the dependency manager info for all bundles to the provided output stream.
*
* @param manager The dependency manager.
* @param fullInfo Whether to print the full info or summary.
* @param useAnsiColors Whether to use ansi colors when printing info.
* @param stream The output stream (e.g. stdout)
*/
CELIX_FRAMEWORK_EXPORT void celix_dependencyManager_printInfo(celix_dependency_manager_t* manager, bool fullInfo, bool useAnsiColors, FILE* stream);
/**
* @brief Print the dependency manager info for the provided bundle id to the provided output stream.
*
* @param manager The dependency manager.
* @param fullInfo whether to print the full info or summary.
* @param useAnsiColors Whether to use ansi colors when printing info.
* @param bundleId The bundle id for which the dependency manager info should be printed.
* @param stream The output stream (e.g. stdout)
*/
CELIX_FRAMEWORK_EXPORT void celix_dependencyManager_printInfoForBundle(celix_dependency_manager_t* manager, bool fullInfo, bool useAnsiColors, long bundleId, FILE* stream);
#ifdef __cplusplus
}
#endif
#endif /* CELIX_DEPENDENCY_MANAGER_H_ */