in libs/framework/src/dm_component_impl.c [770:821]
static celix_status_t celix_dmComponent_calculateNewState(celix_dm_component_t *component, celix_dm_component_state_t currentState, celix_dm_component_state_t *newState) {
celix_status_t status = CELIX_SUCCESS;
bool allResolved = celix_dmComponent_areAllRequiredServiceDependenciesResolved(component);
if (currentState == CELIX_DM_CMP_STATE_INACTIVE) {
if (component->isEnabled) {
*newState = CELIX_DM_CMP_STATE_WAITING_FOR_REQUIRED;
} else {
*newState = currentState;
}
} else if (currentState == CELIX_DM_CMP_STATE_WAITING_FOR_REQUIRED) {
if (!component->isEnabled) {
*newState = CELIX_DM_CMP_STATE_INACTIVE;
} else {
if (allResolved) {
*newState = CELIX_DM_CMP_STATE_INITIALIZING;
} else {
*newState = currentState;
}
}
} else if (currentState == CELIX_DM_CMP_STATE_INITIALIZING) {
*newState = CELIX_DM_CMP_STATE_INITIALIZED_AND_WAITING_FOR_REQUIRED;
} else if (currentState == CELIX_DM_CMP_STATE_DEINITIALIZING) {
*newState = CELIX_DM_CMP_STATE_INACTIVE;
} else if (currentState == CELIX_DM_CMP_STATE_INITIALIZED_AND_WAITING_FOR_REQUIRED) {
if (!component->isEnabled) {
*newState = CELIX_DM_CMP_STATE_DEINITIALIZING;
} else {
if (allResolved) {
*newState = CELIX_DM_CMP_STATE_STARTING;
} else {
*newState = currentState;
}
}
} else if (currentState == CELIX_DM_CMP_STATE_STARTING) {
*newState = CELIX_DM_CMP_STATE_TRACKING_OPTIONAL;
} else if (currentState == CELIX_DM_CMP_STATE_STOPPING) {
*newState = CELIX_DM_CMP_STATE_INITIALIZED_AND_WAITING_FOR_REQUIRED;
} else if (currentState == CELIX_DM_CMP_STATE_TRACKING_OPTIONAL) {
if (component->isEnabled && allResolved) {
*newState = currentState;
} else {
*newState = CELIX_DM_CMP_STATE_STOPPING;
}
} else {
//should not reach
*newState = CELIX_DM_CMP_STATE_INACTIVE;
status = CELIX_BUNDLE_EXCEPTION;
}
return status;
}