static celix_status_t celix_dmComponent_calculateNewState()

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;
}