celix_status_t managedServiceTracker_notifyUpdated()

in misc/experimental/bundles/config_admin/service/private/src/managed_service_tracker.c [504:570]


celix_status_t managedServiceTracker_notifyUpdated(managed_service_tracker_pt tracker, configuration_pt configuration) {


    char *pid;

    service_reference_pt reference = NULL;
    bundle_pt bundle = NULL;
    properties_pt properties = NULL;

    managed_service_service_pt service = NULL;

    // (1) config.checkLocked
    if (configuration_checkLocked(configuration->handle) != CELIX_SUCCESS) { //TODO not yet implemented
        return CELIX_ILLEGAL_ARGUMENT;
    }

    // (2) config.getPid
    if (configuration_getPid(configuration->handle, &pid) != CELIX_SUCCESS) {
        return CELIX_ILLEGAL_ARGUMENT;
    }

    // (3) reference = getManagedServiceReference(pid)
    if (managedServiceTracker_getManagedServiceReference(tracker, pid, &reference) != CELIX_SUCCESS || reference == NULL) {
        printf("[ ERROR ]: Tracker - Notify (NULL Reference Service{PID=%s}) \n", pid);
        return CELIX_ILLEGAL_ARGUMENT; // Eclipse ignores, but according to Specs, callback is delayed
    }

    //  (4.1) reference.getBundle
    if (serviceReference_getBundle(reference, &bundle) != CELIX_SUCCESS || bundle == NULL) {
        printf("[ ERROR ]: Tracker - Notify (NULL Bundle Service{PID=%s}) \n", pid);
        return CELIX_ILLEGAL_ARGUMENT;
    }

    //	(4.2) config.bind(reference.getBundle)
    bool isBind;
    if (configuration_bind(configuration->handle, bundle, &isBind) != CELIX_SUCCESS || isBind == false) {
        printf("[ ERROR ]: Tracker - Notify (Service{PID=%s} Permission Error) \n", pid);
        return CELIX_ILLEGAL_STATE;
    }

    // (5) if (reference != null && config.bind(reference.getBundle()))

    // (5.1) properties = config.getProperties
    if (configuration_getProperties(configuration->handle, &properties) != CELIX_SUCCESS) {
        printf("[ ERROR ]: Tracker - Notify (Service{PID=%s} Wrong Properties) \n", pid);
        return CELIX_ILLEGAL_ARGUMENT;
    }

    // (5.2) modifyConfiguration
    if (configurationAdminFactory_modifyConfiguration(tracker->configurationAdminfactory, reference, properties) != CELIX_SUCCESS) {
        return CELIX_ILLEGAL_ARGUMENT; //TODO no yet implemented modifyConfiguration
    }

    // (5.3) service = getManagedService(pid)
    if (managedServiceTracker_getManagedService(tracker, pid, &service) != CELIX_SUCCESS) {
        printf("[ ERROR ]: Tracker - Notify (NULL Service{PID=%s}) \n", pid);
        return CELIX_ILLEGAL_ARGUMENT;
    }

    // (5.4) asynchUpdate(service,properties)
    if ((properties == NULL) || (properties != NULL && hashMap_size(properties) == 0)) {
        return managedServiceTracker_asynchUpdated(tracker, service, NULL);
    } else {
        return managedServiceTracker_asynchUpdated(tracker, service, properties);
    }
    return CELIX_ILLEGAL_ARGUMENT;
}