Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 707AF200D53 for ; Mon, 20 Nov 2017 21:33:06 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 6F63C160BE1; Mon, 20 Nov 2017 20:33:06 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 067EC160C25 for ; Mon, 20 Nov 2017 21:33:02 +0100 (CET) Received: (qmail 61389 invoked by uid 500); 20 Nov 2017 20:33:02 -0000 Mailing-List: contact commits-help@celix.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@celix.apache.org Delivered-To: mailing list commits@celix.apache.org Received: (qmail 59888 invoked by uid 99); 20 Nov 2017 20:32:59 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 20 Nov 2017 20:32:59 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 27CFDF5F76; Mon, 20 Nov 2017 20:32:59 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: pnoltes@apache.org To: commits@celix.apache.org Date: Mon, 20 Nov 2017 20:33:33 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [36/46] celix git commit: CELIX-417: Initial refactoring for CMake usage archived-at: Mon, 20 Nov 2017 20:33:06 -0000 http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/device_access/public/include/device.h ---------------------------------------------------------------------- diff --git a/device_access/device_access/public/include/device.h b/device_access/device_access/public/include/device.h deleted file mode 100644 index 28032ba..0000000 --- a/device_access/device_access/public/include/device.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - *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. - */ -/* - * device.h - * - * \date Jun 20, 2011 - * \author Apache Celix Project Team - * \copyright Apache License, Version 2.0 - */ -#ifndef DEVICE_H_ -#define DEVICE_H_ - -#include "celix_errno.h" - -#define OSGI_DEVICEACCESS_DEVICE_CATEGORY "DEVICE_CATEGORY" -#define OSGI_DEVICEACCESS_DEVICE_SERIAL "DEVICE_SERIAL" - -#define OSGI_DEVICEACCESS_DEVICE_SERVICE_NAME "device" - -static const int OSGI_DEVICEACCESS_DEVICE_MATCH_NONE = 0; - -typedef struct device * device_pt; - -struct device_service { - device_pt device; - celix_status_t (*noDriverFound)(device_pt device); -}; - -typedef struct device_service * device_service_pt; - -#endif /* DEVICE_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/device_access/public/include/driver.h ---------------------------------------------------------------------- diff --git a/device_access/device_access/public/include/driver.h b/device_access/device_access/public/include/driver.h deleted file mode 100644 index 7e70e06..0000000 --- a/device_access/device_access/public/include/driver.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - *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. - */ -/* - * driver.h - * - * \date Jun 20, 2011 - * \author Apache Celix Project Team - * \copyright Apache License, Version 2.0 - */ -#ifndef DRIVER_H_ -#define DRIVER_H_ - -#include "celix_errno.h" -#include "service_reference.h" - -#define OSGI_DEVICEACCESS_DRIVER_SERVICE_NAME "driver" - -#define OSGI_DEVICEACCESS_DRIVER_ID "DRIVER_ID" - -struct driver_service { - void *driver; - celix_status_t (*attach)(void *driver, service_reference_pt reference, char **result); - celix_status_t (*match)(void *driver, service_reference_pt reference, int *value); -}; - -typedef struct driver_service *driver_service_pt; - - -#endif /* DRIVER_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/device_access/public/include/driver_locator.h ---------------------------------------------------------------------- diff --git a/device_access/device_access/public/include/driver_locator.h b/device_access/device_access/public/include/driver_locator.h deleted file mode 100644 index 405e33a..0000000 --- a/device_access/device_access/public/include/driver_locator.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - *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. - */ -/* - * driver_locator.h - * - * \date Jun 20, 2011 - * \author Apache Celix Project Team - * \copyright Apache License, Version 2.0 - */ -#ifndef DRIVER_LOCATOR_H_ -#define DRIVER_LOCATOR_H_ - -#include "celix_errno.h" -#include "properties.h" -#include "array_list.h" - -#define OSGI_DEVICEACCESS_DRIVER_LOCATOR_SERVICE_NAME "driver_locator" - -typedef struct driver_locator *driver_locator_pt; - -struct driver_locator_service { - driver_locator_pt locator; - celix_status_t(*findDrivers)(driver_locator_pt loc, properties_pt props, array_list_pt *drivers); - celix_status_t(*loadDriver)(driver_locator_pt loc, char *id, char **driver); -}; - -typedef struct driver_locator_service *driver_locator_service_pt; - - -#endif /* DRIVER_LOCATOR_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/device_access/public/include/driver_selector.h ---------------------------------------------------------------------- diff --git a/device_access/device_access/public/include/driver_selector.h b/device_access/device_access/public/include/driver_selector.h deleted file mode 100644 index a088d05..0000000 --- a/device_access/device_access/public/include/driver_selector.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - *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. - */ -/* - * driver_selector.h - * - * \date Jun 20, 2011 - * \author Apache Celix Project Team - * \copyright Apache License, Version 2.0 - */ -#ifndef DRIVER_SELECTOR_H_ -#define DRIVER_SELECTOR_H_ - -#define OSGI_DEVICEACCESS_DRIVER_SELECTOR_SERVICE_NAME "driver_selector" - -typedef struct driver_selector *driver_selector_pt; - -struct driver_selector_service { - driver_selector_pt selector; - celix_status_t (*driverSelector_select)(driver_selector_pt selector, service_reference_pt reference, array_list_pt matches, int *select); -}; - -typedef struct driver_selector_service *driver_selector_service_pt; - - -#endif /* DRIVER_SELECTOR_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/device_access/public/include/match.h ---------------------------------------------------------------------- diff --git a/device_access/device_access/public/include/match.h b/device_access/device_access/public/include/match.h deleted file mode 100644 index dd8906d..0000000 --- a/device_access/device_access/public/include/match.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - *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. - */ -/* - * match.h - * - * \date Jun 20, 2011 - * \author Apache Celix Project Team - * \copyright Apache License, Version 2.0 - */ -#ifndef MATCH_H_ -#define MATCH_H_ - -#include - -struct match { - service_reference_pt reference; - int matchValue; -}; - -typedef struct match *match_pt; - -#endif /* MATCH_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/device_access/src/activator.c ---------------------------------------------------------------------- diff --git a/device_access/device_access/src/activator.c b/device_access/device_access/src/activator.c new file mode 100755 index 0000000..007e725 --- /dev/null +++ b/device_access/device_access/src/activator.c @@ -0,0 +1,194 @@ +/** + *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. + */ +/* + * activator.c + * + * \date Jun 20, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ +#include + +#include +#include +#include +#include + +#include "driver_locator.h" +#include "device_manager.h" +#include "log_service.h" +#include "log_helper.h" + +struct device_manager_bundle_instance { + log_helper_pt loghelper; + bundle_context_pt context; + device_manager_pt deviceManager; + service_tracker_pt driverLocatorTracker; + service_tracker_pt driverTracker; + service_tracker_pt deviceTracker; +}; + +typedef struct device_manager_bundle_instance *device_manager_bundle_instance_pt; + +static celix_status_t deviceManagerBundle_createDriverLocatorTracker(device_manager_bundle_instance_pt bundleData); +static celix_status_t deviceManagerBundle_createDriverTracker(device_manager_bundle_instance_pt bundleData); +static celix_status_t deviceManagerBundle_createDeviceTracker(device_manager_bundle_instance_pt bundleData); + +celix_status_t addingService_dummy_func(void * handle, service_reference_pt reference, void **service) { + celix_status_t status = CELIX_SUCCESS; + device_manager_pt dm = handle; + bundle_context_pt context = NULL; + status = deviceManager_getBundleContext(dm, &context); + if (status == CELIX_SUCCESS) { + status = bundleContext_getService(context, reference, service); + } + return status; +} + +celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) { + celix_status_t status = CELIX_SUCCESS; + device_manager_bundle_instance_pt bi = calloc(1, sizeof(struct device_manager_bundle_instance)); + if (bi == NULL) { + status = CELIX_ENOMEM; + } else { + (*userData) = bi; + bi->context = context; + + logHelper_create(context, &bi->loghelper); + logHelper_start(bi->loghelper); + + status = deviceManager_create(context, bi->loghelper, &bi->deviceManager); + } + return status; +} + +celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) { + celix_status_t status = CELIX_SUCCESS; + device_manager_bundle_instance_pt bundleData = userData; + + status = deviceManagerBundle_createDriverLocatorTracker(bundleData); + if (status == CELIX_SUCCESS) { + status = deviceManagerBundle_createDriverTracker(bundleData); + if (status == CELIX_SUCCESS) { + status = deviceManagerBundle_createDeviceTracker(bundleData); + if (status == CELIX_SUCCESS) { + status = serviceTracker_open(bundleData->driverLocatorTracker); + if (status == CELIX_SUCCESS) { + status = serviceTracker_open(bundleData->driverTracker); + if (status == CELIX_SUCCESS) { + status = serviceTracker_open(bundleData->deviceTracker); + } + } + } + } + } + + if (status != CELIX_SUCCESS) { + logHelper_log(bundleData->loghelper, OSGI_LOGSERVICE_ERROR, "DEVICE_MANAGER: Error while starting bundle got error num %d", status); + } + + logHelper_log(bundleData->loghelper, OSGI_LOGSERVICE_INFO, "DEVICE_MANAGER: Started"); + + return status; +} + +static celix_status_t deviceManagerBundle_createDriverLocatorTracker(device_manager_bundle_instance_pt bundleData) { + celix_status_t status = CELIX_SUCCESS; + + service_tracker_customizer_pt customizer = NULL; + + status = serviceTrackerCustomizer_create(bundleData->deviceManager, addingService_dummy_func, + deviceManager_locatorAdded, deviceManager_locatorModified, deviceManager_locatorRemoved, &customizer); + + if (status == CELIX_SUCCESS) { + service_tracker_pt tracker = NULL; + status = serviceTracker_create(bundleData->context, "driver_locator", customizer, &tracker); + if (status == CELIX_SUCCESS) { + bundleData->driverLocatorTracker=tracker; + } + } else { + status = CELIX_ENOMEM; + } + return status; +} + +static celix_status_t deviceManagerBundle_createDriverTracker(device_manager_bundle_instance_pt bundleData) { + celix_status_t status = CELIX_SUCCESS; + + service_tracker_customizer_pt customizer = NULL; + + status = serviceTrackerCustomizer_create(bundleData->deviceManager, addingService_dummy_func, + deviceManager_driverAdded, deviceManager_driverModified, deviceManager_driverRemoved, &customizer); + + if (status == CELIX_SUCCESS) { + service_tracker_pt tracker = NULL; + status = serviceTracker_createWithFilter(bundleData->context, "(objectClass=driver)", customizer, &tracker); + if (status == CELIX_SUCCESS) { + bundleData->driverTracker=tracker; + } + } else { + status = CELIX_ENOMEM; + } + return status; +} + +static celix_status_t deviceManagerBundle_createDeviceTracker(device_manager_bundle_instance_pt bundleData) { + celix_status_t status = CELIX_SUCCESS; + + service_tracker_customizer_pt customizer = NULL; + + status = serviceTrackerCustomizer_create(bundleData->deviceManager, addingService_dummy_func, + deviceManager_deviceAdded, deviceManager_deviceModified, deviceManager_deviceRemoved, &customizer); + + if (status == CELIX_SUCCESS) { + service_tracker_pt tracker = NULL; + status = serviceTracker_createWithFilter(bundleData->context, "(|(objectClass=device)(DEVICE_CATEGORY=*))", customizer, &tracker); + if (status == CELIX_SUCCESS) { + bundleData->deviceTracker=tracker; + } + } else { + status = CELIX_ENOMEM; + } + return status; +} + +celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) { + celix_status_t status = CELIX_SUCCESS; + device_manager_bundle_instance_pt bundleData = userData; +// status = serviceTracker_close(bundleData->driverLocatorTracker); + if (status == CELIX_SUCCESS) { + status = serviceTracker_close(bundleData->driverTracker); + if (status == CELIX_SUCCESS) { + status = serviceTracker_close(bundleData->deviceTracker); + } + } + + return status; +} + +celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) { + celix_status_t status = CELIX_SUCCESS; + device_manager_bundle_instance_pt bundleData = userData; + status = deviceManager_destroy(bundleData->deviceManager); + + logHelper_stop(bundleData->loghelper); + logHelper_destroy(&bundleData->loghelper); + + return status; +} http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/device_access/src/device_manager.c ---------------------------------------------------------------------- diff --git a/device_access/device_access/src/device_manager.c b/device_access/device_access/src/device_manager.c new file mode 100644 index 0000000..6e7cfd9 --- /dev/null +++ b/device_access/device_access/src/device_manager.c @@ -0,0 +1,570 @@ +/** + *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. + */ +/* + * device_manager.c + * + * \date Jun 20, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ +#include +#include +#include + +#include "device_manager.h" +#include "driver_locator.h" +#include "driver_matcher.h" +#include "driver_attributes.h" +#include "driver_loader.h" +#include "driver.h" +#include "device.h" +#include "log_service.h" + + +#include +#include +#include +#include +#include + +struct device_manager { + bundle_context_pt context; + hash_map_pt devices; + hash_map_pt drivers; + array_list_pt locators; + driver_selector_service_pt selector; + log_helper_pt loghelper; +}; + +static celix_status_t deviceManager_attachAlgorithm(device_manager_pt manager, service_reference_pt ref, void *service); +static celix_status_t deviceManager_getIdleDevices(device_manager_pt manager, array_list_pt *idleDevices); +static celix_status_t deviceManager_isDriverBundle(device_manager_pt manager, bundle_pt bundle, bool *isDriver); + +celix_status_t deviceManager_create(bundle_context_pt context, log_helper_pt logHelper, device_manager_pt *manager) { + celix_status_t status = CELIX_SUCCESS; + + *manager = calloc(1, sizeof(**manager)); + if (!*manager) { + status = CELIX_ENOMEM; + } else { + (*manager)->context = context; + (*manager)->devices = NULL; + (*manager)->drivers = NULL; + (*manager)->locators = NULL; + (*manager)->selector = NULL; + + (*manager)->devices = hashMap_create(serviceReference_hashCode, NULL, serviceReference_equals2, NULL); + (*manager)->drivers = hashMap_create(serviceReference_hashCode, NULL, serviceReference_equals2, NULL); + + (*manager)->loghelper = logHelper; + + status = arrayList_create(&(*manager)->locators); + + logHelper_log((*manager)->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Initialized"); + } + + + return status; +} + +celix_status_t deviceManager_destroy(device_manager_pt manager) { + celix_status_t status = CELIX_SUCCESS; + + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_INFO, "DEVICE_MANAGER: Stop"); + + hashMap_destroy(manager->devices, false, false); + hashMap_destroy(manager->drivers, false, false); + arrayList_destroy(manager->locators); + + return status; +} + +celix_status_t deviceManager_selectorAdded(void * handle, service_reference_pt ref, void * service) { + device_manager_pt manager = handle; + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Add selector"); + + manager->selector = (driver_selector_service_pt) service; + return CELIX_SUCCESS; +} + +celix_status_t deviceManager_selectorModified(void * handle, service_reference_pt ref, void * service) { + device_manager_pt manager = handle; + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Modify selector"); + return CELIX_SUCCESS; +} + +celix_status_t deviceManager_selectorRemoved(void * handle, service_reference_pt ref, void * service) { + device_manager_pt manager = handle; + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Remove selector"); + manager->selector = NULL; + return CELIX_SUCCESS; +} + +celix_status_t deviceManager_locatorAdded(void * handle, service_reference_pt ref, void * service) { + device_manager_pt manager = handle; + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Add locator"); + arrayList_add(manager->locators, service); + return CELIX_SUCCESS; +} + +celix_status_t deviceManager_locatorModified(void * handle, service_reference_pt ref, void * service) { + device_manager_pt manager = handle; + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Modify locator"); + return CELIX_SUCCESS; +} + +celix_status_t deviceManager_locatorRemoved(void * handle, service_reference_pt ref, void * service) { + device_manager_pt manager = handle; + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Remove locator"); + arrayList_removeElement(manager->locators, service); + return CELIX_SUCCESS; +} + +celix_status_t deviceManager_deviceAdded(void * handle, service_reference_pt ref, void * service) { + celix_status_t status = CELIX_SUCCESS; + device_manager_pt manager = handle; + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Add device"); + status = deviceManager_attachAlgorithm(manager, ref, service); + + return status; +} + +static celix_status_t deviceManager_attachAlgorithm(device_manager_pt manager, service_reference_pt ref, void *service) { + celix_status_t status = CELIX_SUCCESS; + + driver_loader_pt loader = NULL; + status = driverLoader_create(manager->context, &loader); + if (status == CELIX_SUCCESS) { + array_list_pt included = NULL; + array_list_pt excluded = NULL; + + array_list_pt driverIds = NULL; + + hashMap_put(manager->devices, ref, service); + + status = arrayList_create(&included); + if (status == CELIX_SUCCESS) { + status = arrayList_create(&excluded); + if (status == CELIX_SUCCESS) { + properties_pt properties = properties_create(); + + unsigned int size = 0; + char **keys; + + serviceReference_getPropertyKeys(ref, &keys, &size); + for (int i = 0; i < size; i++) { + char* key = keys[i]; + const char* value = NULL; + serviceReference_getProperty(ref, key, &value); + properties_set(properties, key, value); + } + + status = driverLoader_findDrivers(loader, manager->locators, properties, &driverIds); + if (status == CELIX_SUCCESS) { + hash_map_iterator_pt iter = hashMapIterator_create(manager->drivers); + while (hashMapIterator_hasNext(iter)) { + driver_attributes_pt driverAttributes = hashMapIterator_nextValue(iter); + arrayList_add(included, driverAttributes); + + // Each driver that already is installed can be removed from the list + char *id = NULL; + celix_status_t substatus = driverAttributes_getDriverId(driverAttributes, &id); + if (substatus == CELIX_SUCCESS) { + // arrayList_removeElement(driverIds, id); + array_list_iterator_pt idsIter = arrayListIterator_create(driverIds); + while (arrayListIterator_hasNext(idsIter)) { + char *value = arrayListIterator_next(idsIter); + if (strcmp(value, id) == 0) { + arrayListIterator_remove(idsIter); + } + } + arrayListIterator_destroy(idsIter); + } + if(id != NULL){ + free(id); + } + } + hashMapIterator_destroy(iter); + + status = deviceManager_matchAttachDriver(manager, loader, driverIds, included, excluded, service, ref); + + } + arrayList_destroy(driverIds); + properties_destroy(properties); + arrayList_destroy(excluded); + } + arrayList_destroy(included); + } + + } + + driverLoader_destroy(&loader); + return status; +} + +celix_status_t deviceManager_matchAttachDriver(device_manager_pt manager, driver_loader_pt loader, + array_list_pt driverIds, array_list_pt included, array_list_pt excluded, void *service, service_reference_pt reference) { + celix_status_t status = CELIX_SUCCESS; + + array_list_pt references = NULL; + + int i; + for (i = 0; i < arrayList_size(excluded); i++) { + void *exclude = arrayList_get(excluded, i); + arrayList_removeElement(included, exclude); + } + + for (i = 0; i < arrayList_size(driverIds); i++) { + char *id = arrayList_get(driverIds, i); + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_INFO, "DEVICE_MANAGER: Driver found: %s", id); + } + + status = driverLoader_loadDrivers(loader, manager->locators, driverIds, &references); + if (status == CELIX_SUCCESS) { + for (i = 0; i < arrayList_size(references); i++) { + service_reference_pt reference = arrayList_get(references, i); + driver_attributes_pt attributes = hashMap_get(manager->drivers, reference); + if (attributes != NULL) { + arrayList_add(included, attributes); + } + } + + driver_matcher_pt matcher = NULL; + status = driverMatcher_create(manager->context, &matcher); + if (status == CELIX_SUCCESS) { + for (i = 0; i < arrayList_size(included); i++) { + driver_attributes_pt attributes = arrayList_get(included, i); + + int match = 0; + celix_status_t substatus = driverAttributes_match(attributes, reference, &match); + if (substatus == CELIX_SUCCESS) { + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_INFO, "DEVICE_MANAGER: Found match: %d", match); + if (match <= OSGI_DEVICEACCESS_DEVICE_MATCH_NONE) { + continue; + } + driverMatcher_add(matcher, match, attributes); + } else { + // Ignore + } + } + + match_pt match = NULL; + status = driverMatcher_getBestMatch(matcher, reference, &match); + if (status == CELIX_SUCCESS) { + if (match == NULL) { + status = deviceManager_noDriverFound(manager, service, reference); + } else { + driver_attributes_pt finalAttributes = hashMap_get(manager->drivers, match->reference); + if (finalAttributes == NULL) { + status = deviceManager_noDriverFound(manager, service, reference); + } else { + char *newDriverId = NULL; + status = driverAttributes_attach(finalAttributes, reference, &newDriverId); + if (status == CELIX_SUCCESS) { + if (newDriverId != NULL) { + array_list_pt ids = NULL; + arrayList_create(&ids); + arrayList_add(ids, newDriverId); + arrayList_add(excluded, finalAttributes); + status = deviceManager_matchAttachDriver(manager, loader, + ids, included, excluded, service, reference); + } else { + // Attached, unload unused drivers + status = driverLoader_unloadDrivers(loader, finalAttributes); + } + } + } + } + } + } + + driverMatcher_destroy(&matcher); + + } + + if (references != NULL) { + arrayList_destroy(references); + } + + return status; +} + +celix_status_t deviceManager_noDriverFound(device_manager_pt manager, void *service, service_reference_pt reference) { + celix_status_t status = CELIX_SUCCESS; + const char* objectClass = NULL; + serviceReference_getProperty(reference, (char *) OSGI_FRAMEWORK_OBJECTCLASS, &objectClass); + if (strcmp(objectClass, OSGI_DEVICEACCESS_DRIVER_SERVICE_NAME) == 0) { + device_service_pt device = service; + status = device->noDriverFound(device->device); + } + return status; +} + +celix_status_t deviceManager_deviceModified(void * handle, service_reference_pt ref, void * service) { + device_manager_pt manager = handle; + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Modify device"); + // #TODO the device properties could be changed + //hashMap_put(manager->devices, ref, service); + return CELIX_SUCCESS; +} + +celix_status_t deviceManager_deviceRemoved(void * handle, service_reference_pt ref, void * service) { + device_manager_pt manager = handle; + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Remove device"); + hashMap_remove(manager->devices, ref); + return CELIX_SUCCESS; +} + +celix_status_t deviceManager_driverAdded(void * handle, service_reference_pt ref, void * service) { + celix_status_t status = CELIX_SUCCESS; + + device_manager_pt manager = handle; + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Add driver"); + driver_attributes_pt attributes = NULL; + + status = driverAttributes_create(ref, service, &attributes); + if (status == CELIX_SUCCESS) { + hashMap_put(manager->drivers, ref, attributes); + } + else{ + driverAttributes_destroy(attributes); + } + return status; +} + +celix_status_t deviceManager_driverModified(void * handle, service_reference_pt ref, void * service) { + device_manager_pt manager = handle; + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Modify driver"); + // #TODO the driver properties could be changed? + return CELIX_SUCCESS; +} + +celix_status_t deviceManager_driverRemoved(void * handle, service_reference_pt ref, void * service) { + celix_status_t status = CELIX_SUCCESS; + + device_manager_pt manager = handle; + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Remove driver"); + + hashMap_remove(manager->drivers, ref); + + array_list_pt idleDevices = NULL; + status = deviceManager_getIdleDevices(manager, &idleDevices); + if (status == CELIX_SUCCESS) { + int i; + for (i = 0; i < arrayList_size(idleDevices); i++) { + celix_status_t forStatus = CELIX_SUCCESS; + service_reference_pt ref = arrayList_get(idleDevices, i); + const char *bsn = NULL; + bundle_pt bundle = NULL; + forStatus = serviceReference_getBundle(ref, &bundle); + if (forStatus == CELIX_SUCCESS) { + module_pt module = NULL; + forStatus = bundle_getCurrentModule(bundle, &module); + if (forStatus == CELIX_SUCCESS) { + forStatus = module_getSymbolicName(module, &bsn); + if (forStatus == CELIX_SUCCESS) { + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: IDLE: %s", bsn); + // #TODO attachDriver (idle device) + // #TODO this can result in a loop? + // Locate and install a driver + // Let the match fail, the device is idle + // The driver is removed, idle check is performed + // Attach is tried again + // .. loop .. + void *device = hashMap_get(manager->devices, ref); + forStatus = deviceManager_attachAlgorithm(manager, ref, device); + } + } + } + + if (forStatus != CELIX_SUCCESS) { + break; //Got error, stop loop and return status + } + } + + + hash_map_iterator_pt iter = hashMapIterator_create(manager->drivers); + while (hashMapIterator_hasNext(iter)) { + hashMapIterator_nextValue(iter); +// driver_attributes_pt da = hashMapIterator_nextValue(iter); +// driverAttributes_tryUninstall(da); + } + hashMapIterator_destroy(iter); + } + + if (idleDevices != NULL) { + arrayList_destroy(idleDevices); + } + + return status; +} + + +celix_status_t deviceManager_getIdleDevices(device_manager_pt manager, array_list_pt *idleDevices) { + celix_status_t status = CELIX_SUCCESS; + + status = arrayList_create(idleDevices); + if (status == CELIX_SUCCESS) { + hash_map_iterator_pt iter = hashMapIterator_create(manager->devices); + while (hashMapIterator_hasNext(iter)) { + celix_status_t substatus = CELIX_SUCCESS; + service_reference_pt ref = hashMapIterator_nextKey(iter); + const char *bsn = NULL; + module_pt module = NULL; + bundle_pt bundle = NULL; + substatus = serviceReference_getBundle(ref, &bundle); + if (substatus == CELIX_SUCCESS) { + substatus = bundle_getCurrentModule(bundle, &module); + if (substatus == CELIX_SUCCESS) { + substatus = module_getSymbolicName(module, &bsn); + if (substatus == CELIX_SUCCESS) { + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Check idle device: %s", bsn); + array_list_pt bundles = NULL; + substatus = serviceReference_getUsingBundles(ref, &bundles); + if (substatus == CELIX_SUCCESS) { + bool inUse = false; + int i; + for (i = 0; i < arrayList_size(bundles); i++) { + bundle_pt bundle = arrayList_get(bundles, i); + bool isDriver; + celix_status_t sstatus = deviceManager_isDriverBundle(manager, bundle, &isDriver); + if (sstatus == CELIX_SUCCESS) { + if (isDriver) { + const char *bsn = NULL; + module_pt module = NULL; + bundle_getCurrentModule(bundle, &module); + module_getSymbolicName(module, &bsn); + + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Not idle, used by driver: %s", bsn); + + inUse = true; + break; + } + } + } + + if (!inUse) { + arrayList_add(*idleDevices, ref); + } + } + + if(bundles!=NULL){ + arrayList_destroy(bundles); + } + } + } + } + } + hashMapIterator_destroy(iter); + } + + return status; +} + +//TODO examply for discussion only, remove after discussion +#define DO_IF_SUCCESS(status, call_func) ((status) == CELIX_SUCCESS) ? (call_func) : (status) +celix_status_t deviceManager_getIdleDevices_exmaple(device_manager_pt manager, array_list_pt *idleDevices) { + celix_status_t status = CELIX_SUCCESS; + + status = arrayList_create(idleDevices); + if (status == CELIX_SUCCESS) { + hash_map_iterator_pt iter = hashMapIterator_create(manager->devices); + while (hashMapIterator_hasNext(iter)) { + celix_status_t substatus = CELIX_SUCCESS; + service_reference_pt ref = hashMapIterator_nextKey(iter); + const char *bsn = NULL; + module_pt module = NULL; + bundle_pt bundle = NULL; + array_list_pt bundles = NULL; + substatus = serviceReference_getBundle(ref, &bundle); + substatus = DO_IF_SUCCESS(substatus, bundle_getCurrentModule(bundle, &module)); + substatus = DO_IF_SUCCESS(substatus, module_getSymbolicName(module, &bsn)); + substatus = DO_IF_SUCCESS(substatus, serviceReference_getUsingBundles(ref, &bundles)); + + if (substatus == CELIX_SUCCESS) { + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Check idle device: %s", bsn); + bool inUse = false; + int i; + for (i = 0; i < arrayList_size(bundles); i++) { + bundle_pt bundle = arrayList_get(bundles, i); + bool isDriver; + celix_status_t sstatus = deviceManager_isDriverBundle(manager, bundle, &isDriver); + if (sstatus == CELIX_SUCCESS) { + if (isDriver) { + const char *bsn = NULL; + module_pt module = NULL; + bundle_getCurrentModule(bundle, &module); + module_getSymbolicName(module, &bsn); + + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_DEBUG, "DEVICE_MANAGER: Not idle, used by driver: %s", bsn); + + inUse = true; + break; + } + } + } + + if (!inUse) { + arrayList_add(*idleDevices, ref); + } + } + } + hashMapIterator_destroy(iter); + } + return status; +} + +celix_status_t deviceManager_isDriverBundle(device_manager_pt manager, bundle_pt bundle, bool *isDriver) { + celix_status_t status = CELIX_SUCCESS; + (*isDriver) = false; + + array_list_pt refs = NULL; + status = bundle_getRegisteredServices(bundle, &refs); + if (status == CELIX_SUCCESS) { + if (refs != NULL) { + int i; + for (i = 0; i < arrayList_size(refs); i++) { + service_reference_pt ref = arrayList_get(refs, i); + const char* object = NULL; + serviceReference_getProperty(ref, OSGI_FRAMEWORK_OBJECTCLASS, &object); + if (strcmp(object, "driver") == 0) { + *isDriver = true; + break; + } + } + arrayList_destroy(refs); + } + } + + return status; +} + + +celix_status_t deviceManager_getBundleContext(device_manager_pt manager, bundle_context_pt *context) { + celix_status_t status = CELIX_SUCCESS; + if (manager->context != NULL) { + (*context) = manager->context; + } else { + status = CELIX_INVALID_BUNDLE_CONTEXT; + } + return status; +} + + + http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/device_access/src/device_manager.h ---------------------------------------------------------------------- diff --git a/device_access/device_access/src/device_manager.h b/device_access/device_access/src/device_manager.h new file mode 100644 index 0000000..00a4f2c --- /dev/null +++ b/device_access/device_access/src/device_manager.h @@ -0,0 +1,56 @@ +/** + *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. + */ +/* + * device_manager.h + * + * \date Jun 20, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ +#ifndef DEVICE_MANAGER_H_ +#define DEVICE_MANAGER_H_ + +#include "log_helper.h" + +#include "driver_loader.h" + +typedef struct device_manager *device_manager_pt; + +celix_status_t deviceManager_create(bundle_context_pt context, log_helper_pt logHelper, device_manager_pt *manager); +celix_status_t deviceManager_destroy(device_manager_pt manager); + +celix_status_t deviceManager_matchAttachDriver(device_manager_pt manager, driver_loader_pt loader, + array_list_pt driverIds, array_list_pt included, array_list_pt excluded, void *service, service_reference_pt reference); +celix_status_t deviceManager_noDriverFound(device_manager_pt manager, void *service, service_reference_pt reference); + +celix_status_t deviceManager_locatorAdded(void * handle, service_reference_pt ref, void * service); +celix_status_t deviceManager_locatorModified(void * handle, service_reference_pt ref, void * service); +celix_status_t deviceManager_locatorRemoved(void * handle, service_reference_pt ref, void * service); +celix_status_t deviceManager_deviceAdded(void * handle, service_reference_pt ref, void * service); +celix_status_t deviceManager_deviceModified(void * handle, service_reference_pt ref, void * service); +celix_status_t deviceManager_deviceRemoved(void * handle, service_reference_pt ref, void * service); +celix_status_t deviceManager_driverAdded(void * handle, service_reference_pt ref, void * service); +celix_status_t deviceManager_driverModified(void * handle, service_reference_pt ref, void * service); +celix_status_t deviceManager_driverRemoved(void * handle, service_reference_pt ref, void * service); + +celix_status_t deviceManager_getBundleContext(device_manager_pt manager, bundle_context_pt *context); + +// celix_status_t deviceManager_match(device_manager_pt manager, ...); + +#endif /* DEVICE_MANAGER_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/device_access/src/driver_attributes.c ---------------------------------------------------------------------- diff --git a/device_access/device_access/src/driver_attributes.c b/device_access/device_access/src/driver_attributes.c new file mode 100644 index 0000000..5ac7fda --- /dev/null +++ b/device_access/device_access/src/driver_attributes.c @@ -0,0 +1,169 @@ +/** + *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. + */ +/* + * driver_attributes.c + * + * \date Jun 20, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ +#include +#include + +#include "driver_attributes.h" +#include "bundle.h" +#include "celixbool.h" +#include "driver_loader.h" +#include "device.h" +#include "constants.h" + +struct driver_attributes { + bundle_pt bundle; + service_reference_pt reference; + driver_service_pt driver; + bool dynamic; +}; + +celix_status_t driverAttributes_create(service_reference_pt reference, driver_service_pt driver, driver_attributes_pt *attributes) { + celix_status_t status = CELIX_SUCCESS; + + *attributes = calloc(1, sizeof(**attributes)); + if (!*attributes) { + status = CELIX_ENOMEM; + } else { + bundle_pt bundle = NULL; + bundle_archive_pt bundleArchive = NULL; + status = serviceReference_getBundle(reference, &bundle); + + if (status == CELIX_SUCCESS) { + status = bundle_getArchive(bundle, &bundleArchive); + + if (status == CELIX_SUCCESS) { + (*attributes)->reference = reference; + (*attributes)->driver = driver; + (*attributes)->bundle = bundle; + + const char *location; + status = bundleArchive_getLocation(bundleArchive, &location); + if (status == CELIX_SUCCESS) { + (*attributes)->dynamic = strncmp(location, DRIVER_LOCATION_PREFIX, 4) == 0 ? true : false; + } + + } + } + } + + return status; +} + +celix_status_t driverAttributes_destroy(driver_attributes_pt attributes){ + if(attributes != NULL){ + free(attributes); + } + return CELIX_SUCCESS; +} + +celix_status_t driverAttributes_getReference(driver_attributes_pt driverAttributes, service_reference_pt *reference) { + *reference = driverAttributes->reference; + + return CELIX_SUCCESS; +} + +celix_status_t driverAttributes_getDriverId(driver_attributes_pt driverAttributes, char **driverId) { + celix_status_t status = CELIX_SUCCESS; + + const char* id_prop = NULL; + status = serviceReference_getProperty(driverAttributes->reference, "DRIVER_ID", &id_prop); + if (status == CELIX_SUCCESS) { + if (!id_prop) { + status = CELIX_ENOMEM; + } else { + *driverId = strdup(id_prop); + + if (*driverId == NULL) { + status = CELIX_ENOMEM; + } + } + } + + return status; +} + +celix_status_t driverAttributes_match(driver_attributes_pt driverAttributes, service_reference_pt reference, int *match) { + celix_status_t status = CELIX_SUCCESS; + + status = driverAttributes->driver->match(driverAttributes->driver->driver, reference, match); + + return status; +} + +celix_status_t driverAttributes_isInUse(driver_attributes_pt driverAttributes, bool *inUse) { + celix_status_t status = CELIX_SUCCESS; + + array_list_pt references = NULL; + status = bundle_getServicesInUse(driverAttributes->bundle, &references); + if (status == CELIX_SUCCESS) { + if (references == NULL || arrayList_size(references) == 0) { + *inUse = false; + } else { + int i; + for (i = 0; i < arrayList_size(references); i++) { + service_reference_pt ref = arrayList_get(references, i); + const char *object = NULL; + status = serviceReference_getProperty(ref, OSGI_FRAMEWORK_OBJECTCLASS, &object); + + if (status == CELIX_SUCCESS) { + const char* category = NULL; + status = serviceReference_getProperty(ref, "DEVICE_CATEGORY", &category); + + if (status == CELIX_SUCCESS) { + if ((object != NULL && strcmp(object, OSGI_DEVICEACCESS_DEVICE_SERVICE_NAME) == 0) || (category != NULL)) { + *inUse = true; + } + } + } + } + } + } + + return status; +} + +celix_status_t driverAttributes_attach(driver_attributes_pt driverAttributes, service_reference_pt reference, char **attach) { + celix_status_t status = CELIX_SUCCESS; + + status = driverAttributes->driver->attach(driverAttributes->driver->driver, reference, attach); + + return status; +} + +celix_status_t driverAttributes_tryUninstall(driver_attributes_pt driverAttributes) { + celix_status_t status = CELIX_SUCCESS; + + bool inUse = false; + + status = driverAttributes_isInUse(driverAttributes, &inUse); + if (status == CELIX_SUCCESS) { + if (!inUse && driverAttributes->dynamic) { + status = bundle_uninstall(driverAttributes->bundle); + } + } + + return status; +} http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/device_access/src/driver_attributes.h ---------------------------------------------------------------------- diff --git a/device_access/device_access/src/driver_attributes.h b/device_access/device_access/src/driver_attributes.h new file mode 100644 index 0000000..bdb12a2 --- /dev/null +++ b/device_access/device_access/src/driver_attributes.h @@ -0,0 +1,46 @@ +/** + *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. + */ +/* + * driver_attributes.h + * + * \date Jun 20, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ +#ifndef DRIVER_ATTRIBUTES_H_ +#define DRIVER_ATTRIBUTES_H_ + +#include "driver.h" + +typedef struct driver_attributes *driver_attributes_pt; + +celix_status_t driverAttributes_create(service_reference_pt reference, driver_service_pt driver, driver_attributes_pt *attributes); +celix_status_t driverAttributes_destroy(driver_attributes_pt attributes); + +celix_status_t driverAttributes_getReference(driver_attributes_pt driverAttributes, service_reference_pt *reference); +celix_status_t driverAttributes_getDriverId(driver_attributes_pt driverAttributes, char **driverId); + +celix_status_t driverAttributes_match(driver_attributes_pt driverAttributes, service_reference_pt reference, int *match); +celix_status_t driverAttributes_attach(driver_attributes_pt driverAttributes, service_reference_pt reference, char **attach); + +celix_status_t driverAttributes_isInUse(driver_attributes_pt driverAttributes, bool *inUse); + +celix_status_t driverAttributes_tryUninstall(driver_attributes_pt driverAttributes); + +#endif /* DRIVER_ATTRIBUTES_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/device_access/src/driver_loader.c ---------------------------------------------------------------------- diff --git a/device_access/device_access/src/driver_loader.c b/device_access/device_access/src/driver_loader.c new file mode 100644 index 0000000..c4caa65 --- /dev/null +++ b/device_access/device_access/src/driver_loader.c @@ -0,0 +1,185 @@ +/** + *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. + */ +/* + * driver_loader.c + * + * \date Jun 20, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ +#include +#include + +#include "driver_loader.h" +#include "bundle_context.h" +#include "bundle.h" + +struct driver_loader { + bundle_context_pt context; + array_list_pt loadedDrivers; +}; + +celix_status_t driverLoader_create(bundle_context_pt context, driver_loader_pt *loader) { + celix_status_t status = CELIX_SUCCESS; + + *loader = calloc(1, sizeof(**loader)); + if (!*loader) { + status = CELIX_ENOMEM; + } else { + (*loader)->context = context; + (*loader)->loadedDrivers = NULL; + status = arrayList_create(&(*loader)->loadedDrivers); + } + + return status; +} + +celix_status_t driverLoader_destroy(driver_loader_pt *loader) { + if((*loader) != NULL){ + arrayList_destroy((*loader)->loadedDrivers); + free((*loader)); + (*loader)=NULL; + } + return CELIX_SUCCESS; +} + +celix_status_t driverLoader_findDrivers(driver_loader_pt loader, array_list_pt locators, properties_pt properties, array_list_pt *driversIds) { + celix_status_t status = CELIX_SUCCESS; + arrayList_create(driversIds); + + int i; + for (i = 0; i < arrayList_size(locators); i++) { + array_list_pt drivers; + driver_locator_service_pt locator = arrayList_get(locators, i); + + status = driverLoader_findDriversForLocator(loader, locator, properties, &drivers); + if (status == CELIX_SUCCESS) { + arrayList_addAll(*driversIds, drivers); + } + arrayList_destroy(drivers); + } + + return status; +} + +celix_status_t driverLoader_findDriversForLocator(driver_loader_pt loader, driver_locator_service_pt locator, properties_pt properties, array_list_pt *driversIds) { + celix_status_t status = CELIX_SUCCESS; + + status = locator->findDrivers(locator->locator, properties, driversIds); + + return status; +} + +celix_status_t driverLoader_loadDrivers(driver_loader_pt loader, array_list_pt locators, array_list_pt driverIds, array_list_pt *references) { + celix_status_t status = CELIX_SUCCESS; + status = arrayList_create(references); + if (status == CELIX_SUCCESS) { + int i; + for (i = 0; i < arrayList_size(driverIds); i++) { + array_list_pt refs = NULL; + char *id = arrayList_get(driverIds, i); + + status = driverLoader_loadDriver(loader, locators, id, &refs); + if (status == CELIX_SUCCESS) { + arrayList_addAll(*references, refs); + } + if (refs != NULL) { + arrayList_destroy(refs); + } + } + } + + return status; +} + +celix_status_t driverLoader_loadDriver(driver_loader_pt loader, array_list_pt locators, char *driverId, array_list_pt *references) { + celix_status_t status = CELIX_SUCCESS; + status = arrayList_create(references); + if (status == CELIX_SUCCESS) { + int i; + for (i = 0; i < arrayList_size(locators); i++) { + array_list_pt refs = NULL; + driver_locator_service_pt locator = arrayList_get(locators, i); + + status = driverLoader_loadDriverForLocator(loader, locator, driverId, &refs); + if (status == CELIX_SUCCESS) { + arrayList_addAll(*references, refs); + } + + if (refs != NULL) { + arrayList_destroy(refs); + } + } + } + + return status; +} + +celix_status_t driverLoader_loadDriverForLocator(driver_loader_pt loader, driver_locator_service_pt locator, char *driverId, array_list_pt *references) { + celix_status_t status = CELIX_SUCCESS; + //The list is created in the bundle_getRegisteredServices chain + //arrayList_create(references); + + char *filename = NULL; + status = locator->loadDriver(locator->locator, driverId, &filename); + if (status == CELIX_SUCCESS) { + bundle_pt bundle = NULL; + int length = strlen(DRIVER_LOCATION_PREFIX) + strlen(driverId); + char location[length+2]; + snprintf(location, length+2, "%s%s", DRIVER_LOCATION_PREFIX, driverId); + status = bundleContext_installBundle2(loader->context, location, filename, &bundle); + if (status == CELIX_SUCCESS) { + status = bundle_start(bundle); + if (status == CELIX_SUCCESS) { + status = bundle_getRegisteredServices(bundle, references); + if (status == CELIX_SUCCESS) { + arrayList_addAll(loader->loadedDrivers, *references); + } + } + } + } + + return status; +} + +celix_status_t driverLoader_unloadDrivers(driver_loader_pt loader, driver_attributes_pt finalDriver) { + celix_status_t status = CELIX_SUCCESS; + + service_reference_pt finalReference = NULL; + if (finalDriver != NULL) { + status = driverAttributes_getReference(finalDriver, &finalReference); + } + if (status == CELIX_SUCCESS) { + int i; + for (i = 0; i < arrayList_size(loader->loadedDrivers); i++) { + service_reference_pt reference = arrayList_get(loader->loadedDrivers, i); + bool equal = false; + status = serviceReference_equals(reference, finalReference, &equal); + if (status == CELIX_SUCCESS && !equal) { + bundle_pt bundle = NULL; + status = serviceReference_getBundle(reference, &bundle); + if (status == CELIX_SUCCESS) { + bundle_uninstall(bundle); // Ignore status + } + } + } + } + + return status; +} http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/device_access/src/driver_loader.h ---------------------------------------------------------------------- diff --git a/device_access/device_access/src/driver_loader.h b/device_access/device_access/src/driver_loader.h new file mode 100644 index 0000000..fde9c88 --- /dev/null +++ b/device_access/device_access/src/driver_loader.h @@ -0,0 +1,48 @@ +/** + *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. + */ +/* + * driver_loader.h + * + * \date Jun 20, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ +#ifndef DRIVER_LOADER_H_ +#define DRIVER_LOADER_H_ + +#include "driver_locator.h" +#include "driver_attributes.h" + +#define DRIVER_LOCATION_PREFIX "_DD_" + +typedef struct driver_loader *driver_loader_pt; + +celix_status_t driverLoader_create(bundle_context_pt context, driver_loader_pt *loader); +celix_status_t driverLoader_destroy(driver_loader_pt *loader); + +celix_status_t driverLoader_findDrivers(driver_loader_pt loader, array_list_pt locators, properties_pt properties, array_list_pt *driversIds); +celix_status_t driverLoader_findDriversForLocator(driver_loader_pt loader, driver_locator_service_pt locator, properties_pt properties, array_list_pt *driversIds); + +celix_status_t driverLoader_loadDrivers(driver_loader_pt loader, array_list_pt locators, array_list_pt driverIds, array_list_pt *references); +celix_status_t driverLoader_loadDriver(driver_loader_pt loader, array_list_pt locators, char *driverId, array_list_pt *references); +celix_status_t driverLoader_loadDriverForLocator(driver_loader_pt loader, driver_locator_service_pt locator, char *driverId, array_list_pt *references); + +celix_status_t driverLoader_unloadDrivers(driver_loader_pt loader, driver_attributes_pt finalDriver); + +#endif /* DRIVER_LOADER_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/device_access/src/driver_matcher.c ---------------------------------------------------------------------- diff --git a/device_access/device_access/src/driver_matcher.c b/device_access/device_access/src/driver_matcher.c new file mode 100644 index 0000000..c7597d3 --- /dev/null +++ b/device_access/device_access/src/driver_matcher.c @@ -0,0 +1,274 @@ +/** + *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. + */ +/* + * driver_matcher.c + * + * \date Jun 20, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ +#include + +#include "hash_map.h" +#include "constants.h" + +#include "driver_matcher.h" +#include "log_helper.h" +#include "log_service.h" + + +struct driver_matcher { + hash_map_pt attributes; + array_list_pt matches; + log_helper_pt loghelper; + + bundle_context_pt context; +}; + +typedef struct match_key { + int matchValue; +}*match_key_t; + +static celix_status_t driverMatcher_get(driver_matcher_pt matcher, int key, array_list_pt *attributesV); +static celix_status_t driverMatcher_getBestMatchInternal(driver_matcher_pt matcher, match_pt *match); + +unsigned int driverMatcher_matchKeyHash(const void* match_key) { + match_key_t key = (match_key_t) match_key; + + return key->matchValue; +} + +int driverMatcher_matchKeyEquals(const void* key, const void* toCompare) { + return ((match_key_t) key)->matchValue == ((match_key_t) toCompare)->matchValue; +} + +celix_status_t driverMatcher_create(bundle_context_pt context, driver_matcher_pt *matcher) { + celix_status_t status = CELIX_SUCCESS; + + *matcher = calloc(1, sizeof(**matcher)); + if (!*matcher) { + status = CELIX_ENOMEM; + } else { + (*matcher)->matches = NULL; + (*matcher)->context = context; + (*matcher)->attributes = hashMap_create(driverMatcher_matchKeyHash, NULL, driverMatcher_matchKeyEquals, NULL); + + arrayList_create(&(*matcher)->matches); + + if(logHelper_create(context, &(*matcher)->loghelper) == CELIX_SUCCESS) { + logHelper_start((*matcher)->loghelper); + } + + } + + return status; +} + +celix_status_t driverMatcher_destroy(driver_matcher_pt *matcher) { + + if((*matcher) != NULL){ + + int i = 0; + + for(;imatches);i++){ + free(arrayList_get((*matcher)->matches,i)); + } + arrayList_destroy((*matcher)->matches); + + hash_map_iterator_pt iter = hashMapIterator_create((*matcher)->attributes); + while (hashMapIterator_hasNext(iter)) { + hash_map_entry_pt entry = hashMapIterator_nextEntry(iter); + match_key_t match = (match_key_t)hashMapEntry_getKey(entry); + array_list_pt list = (array_list_pt)hashMapEntry_getValue(entry); + free(match); + if (list != NULL) { + arrayList_destroy(list); + } + } + hashMapIterator_destroy(iter); + hashMap_destroy((*matcher)->attributes, false, false); + + logHelper_stop((*matcher)->loghelper); + logHelper_destroy(&(*matcher)->loghelper); + + free(*matcher); + } + + return CELIX_SUCCESS; +} + +celix_status_t driverMatcher_add(driver_matcher_pt matcher, int matchValue, driver_attributes_pt attributes) { + celix_status_t status = CELIX_SUCCESS; + + array_list_pt da = NULL; + status = driverMatcher_get(matcher, matchValue, &da); + if (status == CELIX_SUCCESS) { + arrayList_add(da, attributes); + + match_pt match = NULL; + match = calloc(1, sizeof(*match)); + if (!match) { + status = CELIX_ENOMEM; + } else { + match->matchValue = matchValue; + match->reference = NULL; + driverAttributes_getReference(attributes, &match->reference); + arrayList_add(matcher->matches, match); + } + } + + return status; +} + +celix_status_t driverMatcher_get(driver_matcher_pt matcher, int key, array_list_pt *attributes) { + celix_status_t status = CELIX_SUCCESS; + + match_key_t matchKeyS = calloc(1, sizeof(*matchKeyS)); + matchKeyS->matchValue = key; + + *attributes = hashMap_get(matcher->attributes, matchKeyS); + if (*attributes == NULL) { + arrayList_create(attributes); + match_key_t matchKey = calloc(1, sizeof(*matchKey)); + matchKey->matchValue = key; + hashMap_put(matcher->attributes, matchKey, *attributes); + } + + free(matchKeyS); + + return status; +} + +celix_status_t driverMatcher_getBestMatch(driver_matcher_pt matcher, service_reference_pt reference, match_pt *match) { + celix_status_t status = CELIX_SUCCESS; + + if (*match != NULL) { + status = CELIX_ILLEGAL_ARGUMENT; + } else { + service_reference_pt selectorRef = NULL; + status = bundleContext_getServiceReference(matcher->context, OSGI_DEVICEACCESS_DRIVER_SELECTOR_SERVICE_NAME, &selectorRef); + if (status == CELIX_SUCCESS) { + int index = -1; + if (selectorRef != NULL) { + driver_selector_service_pt selector = NULL; + status = bundleContext_getService(matcher->context, selectorRef, (void **) &selector); + if (status == CELIX_SUCCESS) { + if (selector != NULL) { + int size = -1; + status = selector->driverSelector_select(selector->selector, reference, matcher->matches, &index); + if (status == CELIX_SUCCESS) { + size = arrayList_size(matcher->matches); + if (index != -1 && index >= 0 && index < size) { + *match = arrayList_get(matcher->matches, index); + } + } + } + } + } + if (status == CELIX_SUCCESS && *match == NULL) { + status = driverMatcher_getBestMatchInternal(matcher, match); + } + } + } + + return status; +} + +celix_status_t driverMatcher_getBestMatchInternal(driver_matcher_pt matcher, match_pt *match) { + celix_status_t status = CELIX_SUCCESS; + + if (!hashMap_isEmpty(matcher->attributes)) { + match_key_t matchKey = NULL; + hash_map_iterator_pt iter = hashMapIterator_create(matcher->attributes); + while (hashMapIterator_hasNext(iter)) { + hash_map_entry_pt entry = hashMapIterator_nextEntry(iter); + match_key_t key = hashMapEntry_getKey(entry); + if (matchKey == NULL || matchKey->matchValue < key->matchValue) { + matchKey = key; + } + } + hashMapIterator_destroy(iter); + + array_list_pt das = hashMap_get(matcher->attributes, matchKey); + service_reference_pt best = NULL; + int i; + for (i = 0; i < arrayList_size(das); i++) { + driver_attributes_pt attributes = arrayList_get(das, i); + service_reference_pt reference = NULL; + + celix_status_t substatus = driverAttributes_getReference(attributes, &reference); + if (substatus == CELIX_SUCCESS) { + if (best != NULL) { + const char* rank1Str; + const char* rank2Str; + int rank1, rank2; + + rank1Str = "0"; + rank2Str = "0"; + + logHelper_log(matcher->loghelper, OSGI_LOGSERVICE_DEBUG, "DRIVER_MATCHER: Compare ranking"); + + serviceReference_getProperty(reference, OSGI_FRAMEWORK_SERVICE_RANKING, &rank1Str); + serviceReference_getProperty(reference, OSGI_FRAMEWORK_SERVICE_RANKING, &rank2Str); + + rank1 = atoi(rank1Str); + rank2 = atoi(rank2Str); + + if (rank1 != rank2) { + if (rank1 > rank2) { + best = reference; + } + } else { + const char* id1Str; + const char* id2Str; + long id1, id2; + + id1Str = NULL; + id2Str = NULL; + + logHelper_log(matcher->loghelper, OSGI_LOGSERVICE_DEBUG, "DRIVER_MATCHER: Compare id's"); + + serviceReference_getProperty(reference, OSGI_FRAMEWORK_SERVICE_ID, &id1Str); + serviceReference_getProperty(reference, OSGI_FRAMEWORK_SERVICE_ID, &id2Str); + + id1 = atol(id1Str); + id2 = atol(id2Str); + + if (id1 < id2) { + best = reference; + } + } + } else { + best = reference; + } + } + + } + + *match = calloc(1, sizeof(**match)); + if (!*match) { + status = CELIX_ENOMEM; + } else { + (*match)->matchValue = matchKey->matchValue; + (*match)->reference = best; + } + } + + return status; +} http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/device_access/src/driver_matcher.h ---------------------------------------------------------------------- diff --git a/device_access/device_access/src/driver_matcher.h b/device_access/device_access/src/driver_matcher.h new file mode 100644 index 0000000..d6cdb22 --- /dev/null +++ b/device_access/device_access/src/driver_matcher.h @@ -0,0 +1,42 @@ +/** + *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. + */ +/* + * driver_matcher.h + * + * \date Jun 20, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ +#ifndef DRIVER_MATCHER_H_ +#define DRIVER_MATCHER_H_ + +#include "match.h" +#include "driver_selector.h" +#include "driver_attributes.h" + +typedef struct driver_matcher *driver_matcher_pt; + +celix_status_t driverMatcher_create(bundle_context_pt context, driver_matcher_pt *matcher); +celix_status_t driverMatcher_destroy(driver_matcher_pt *matcher); + +celix_status_t driverMatcher_add(driver_matcher_pt matcher, int match, driver_attributes_pt attributes); + +celix_status_t driverMatcher_getBestMatch(driver_matcher_pt matcher, service_reference_pt reference, match_pt *match); + +#endif /* DRIVER_MATCHER_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/driver_locator/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/device_access/driver_locator/CMakeLists.txt b/device_access/driver_locator/CMakeLists.txt index 9138f4a..2e0dde2 100644 --- a/device_access/driver_locator/CMakeLists.txt +++ b/device_access/driver_locator/CMakeLists.txt @@ -20,15 +20,13 @@ add_bundle(driver_locator VERSION "0.0.2" NAME "Apache Celix Device Access Driver Locator" SOURCES - private/src/activator - private/src/driver_locator + src/activator + src/driver_locator ) install_bundle(driver_locator) +target_include_directories(driver_locator PRIVATE src) +target_link_libraries(driver_locator PRIVATE Celix::device_access_api) -include_directories(${PROJECT_SOURCE_DIR}/device_access/device_access/public/include) -include_directories(private/include) -include_directories("${PROJECT_SOURCE_DIR}/framework/public/include") -include_directories("${PROJECT_SOURCE_DIR}/utils/public/include") - -target_link_libraries(driver_locator celix_utils celix_framework) +#Setup target aliases to match external usage +add_library(Celix::driver_locator ALIAS driver_locator) http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/driver_locator/private/include/driver_locator_private.h ---------------------------------------------------------------------- diff --git a/device_access/driver_locator/private/include/driver_locator_private.h b/device_access/driver_locator/private/include/driver_locator_private.h deleted file mode 100644 index bf6dcbf..0000000 --- a/device_access/driver_locator/private/include/driver_locator_private.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - *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. - */ -/* - * driver_locator_private.h - * - * \date Jun 20, 2011 - * \author Apache Celix Project Team - * \copyright Apache License, Version 2.0 - */ -#ifndef DRIVER_LOCATOR_PRIVATE_H_ -#define DRIVER_LOCATOR_PRIVATE_H_ - -#include "driver_locator.h" - -struct driver_locator { - char *path; - array_list_pt drivers; -}; - -celix_status_t driverLocator_findDrivers(driver_locator_pt locator, properties_pt props, array_list_pt *drivers); -celix_status_t driverLocator_loadDriver(driver_locator_pt locator, char *id, char **driver); - -#endif /* DRIVER_LOCATOR_PRIVATE_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/driver_locator/private/src/activator.c ---------------------------------------------------------------------- diff --git a/device_access/driver_locator/private/src/activator.c b/device_access/driver_locator/private/src/activator.c deleted file mode 100644 index abc60c5..0000000 --- a/device_access/driver_locator/private/src/activator.c +++ /dev/null @@ -1,89 +0,0 @@ -/** - *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. - */ -/* - * activator.c - * - * \date Jun 20, 2011 - * \author Apache Celix Project Team - * \copyright Apache License, Version 2.0 - */ -#include - -#include "bundle_activator.h" -#include "bundle_context.h" -#include "driver_locator_private.h" - -static const char *DEFAULT_LOCATOR_PATH = "drivers"; - -struct bundle_instance { - driver_locator_service_pt service; - driver_locator_pt locator; - service_registration_pt locatorRegistration; -}; - -typedef struct bundle_instance *bundle_instance_pt; - -celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) { - celix_status_t status = CELIX_SUCCESS; - (*userData) = calloc(1, sizeof(struct bundle_instance)); - if ( (*userData) == NULL ){ - status = CELIX_ENOMEM; - } - return status; -} - -celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) { - celix_status_t status = CELIX_SUCCESS; - bundle_instance_pt bi = (bundle_instance_pt)userData; - - bi->service = calloc(1, sizeof(*(bi->service))); - bi->locator = calloc(1, sizeof(*(bi->locator))); - if(bi->service != NULL && bi->locator != NULL){ - bi->service->findDrivers = driverLocator_findDrivers; - bi->service->loadDriver = driverLocator_loadDriver; - - bi->service->locator = bi->locator; - bi->locator->drivers = NULL; - arrayList_create(&bi->locator->drivers); - bundleContext_getProperty(context, "DRIVER_LOCATOR_PATH", (const char**)&bi->locator->path); - if (bi->locator->path == NULL ) { - bi->locator->path = (char *)DEFAULT_LOCATOR_PATH; - } - status = bundleContext_registerService(context, OSGI_DEVICEACCESS_DRIVER_LOCATOR_SERVICE_NAME, bi->service, NULL, &bi->locatorRegistration); - } - else{ - if(bi->service!=NULL) free(bi->service); - if(bi->locator!=NULL) free(bi->locator); - status = CELIX_ENOMEM; - } - - return status; -} - -celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) { - celix_status_t status = CELIX_SUCCESS; - bundle_instance_pt bi = (bundle_instance_pt)userData; - serviceRegistration_unregister(bi->locatorRegistration); - arrayList_destroy(bi->locator->drivers); - return status; -} - -celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) { - return CELIX_SUCCESS; -} http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/driver_locator/private/src/driver_locator.c ---------------------------------------------------------------------- diff --git a/device_access/driver_locator/private/src/driver_locator.c b/device_access/driver_locator/private/src/driver_locator.c deleted file mode 100644 index 9c360bf..0000000 --- a/device_access/driver_locator/private/src/driver_locator.c +++ /dev/null @@ -1,91 +0,0 @@ -/** - *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. - */ -/* - * driver_locator.c - * - * \date Jun 20, 2011 - * \author Apache Celix Project Team - * \copyright Apache License, Version 2.0 - */ -#include -#include -#include -#include - -#include "driver_locator_private.h" -#include "device.h" - -celix_status_t driverLocator_findDrivers(driver_locator_pt locator, properties_pt props, array_list_pt *drivers) { - celix_status_t status = CELIX_SUCCESS; - - const char* category = properties_get(props, OSGI_DEVICEACCESS_DEVICE_CATEGORY); - - status = arrayList_create(drivers); - if (status == CELIX_SUCCESS) { - DIR *dir; - dir = opendir(locator->path); - if (!dir) { - status = CELIX_FILE_IO_EXCEPTION; - } else { - struct dirent *dp; - while ((dp = readdir(dir)) != NULL) { - char str1[256], str2[256], str3[256]; - if (sscanf(dp->d_name, "%[^_]_%[^.].%s", str1, str2, str3) == 3 && - strcmp(str1, category) == 0 && - strcmp(str3, "zip") == 0) { - int length = strlen(str1) + strlen(str2) + 2; - char driver[length]; - snprintf(driver, length, "%s_%s", str1, str2); - arrayList_add(*drivers, strdup(driver)); - } - } - closedir(dir); - } - } - return status; -} - -celix_status_t driverLocator_loadDriver(driver_locator_pt locator, char *id, char **stream) { - celix_status_t status = CELIX_SUCCESS; - *stream = NULL; - - DIR *dir; - dir = opendir(locator->path); - if (!dir) { - status = CELIX_FILE_IO_EXCEPTION; - } else { - struct dirent *dp; - while ((dp = readdir(dir)) != NULL) { - char str1[256], str2[256]; - if (sscanf(dp->d_name, "%[^.].%s", str1, str2) == 2 && - strcmp(str1, id) == 0 && - strcmp(str2, "zip") == 0) { - int length = strlen(locator->path) + strlen(dp->d_name) + 2; - char stream_str[length]; - snprintf(stream_str, length, "%s/%s", locator->path, dp->d_name); - *stream = strdup(stream_str); - break; - } - } - closedir(dir); - } - - return status; -} - http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/driver_locator/src/activator.c ---------------------------------------------------------------------- diff --git a/device_access/driver_locator/src/activator.c b/device_access/driver_locator/src/activator.c new file mode 100644 index 0000000..abc60c5 --- /dev/null +++ b/device_access/driver_locator/src/activator.c @@ -0,0 +1,89 @@ +/** + *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. + */ +/* + * activator.c + * + * \date Jun 20, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ +#include + +#include "bundle_activator.h" +#include "bundle_context.h" +#include "driver_locator_private.h" + +static const char *DEFAULT_LOCATOR_PATH = "drivers"; + +struct bundle_instance { + driver_locator_service_pt service; + driver_locator_pt locator; + service_registration_pt locatorRegistration; +}; + +typedef struct bundle_instance *bundle_instance_pt; + +celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) { + celix_status_t status = CELIX_SUCCESS; + (*userData) = calloc(1, sizeof(struct bundle_instance)); + if ( (*userData) == NULL ){ + status = CELIX_ENOMEM; + } + return status; +} + +celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) { + celix_status_t status = CELIX_SUCCESS; + bundle_instance_pt bi = (bundle_instance_pt)userData; + + bi->service = calloc(1, sizeof(*(bi->service))); + bi->locator = calloc(1, sizeof(*(bi->locator))); + if(bi->service != NULL && bi->locator != NULL){ + bi->service->findDrivers = driverLocator_findDrivers; + bi->service->loadDriver = driverLocator_loadDriver; + + bi->service->locator = bi->locator; + bi->locator->drivers = NULL; + arrayList_create(&bi->locator->drivers); + bundleContext_getProperty(context, "DRIVER_LOCATOR_PATH", (const char**)&bi->locator->path); + if (bi->locator->path == NULL ) { + bi->locator->path = (char *)DEFAULT_LOCATOR_PATH; + } + status = bundleContext_registerService(context, OSGI_DEVICEACCESS_DRIVER_LOCATOR_SERVICE_NAME, bi->service, NULL, &bi->locatorRegistration); + } + else{ + if(bi->service!=NULL) free(bi->service); + if(bi->locator!=NULL) free(bi->locator); + status = CELIX_ENOMEM; + } + + return status; +} + +celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) { + celix_status_t status = CELIX_SUCCESS; + bundle_instance_pt bi = (bundle_instance_pt)userData; + serviceRegistration_unregister(bi->locatorRegistration); + arrayList_destroy(bi->locator->drivers); + return status; +} + +celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) { + return CELIX_SUCCESS; +} http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/driver_locator/src/driver_locator.c ---------------------------------------------------------------------- diff --git a/device_access/driver_locator/src/driver_locator.c b/device_access/driver_locator/src/driver_locator.c new file mode 100644 index 0000000..9c360bf --- /dev/null +++ b/device_access/driver_locator/src/driver_locator.c @@ -0,0 +1,91 @@ +/** + *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. + */ +/* + * driver_locator.c + * + * \date Jun 20, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ +#include +#include +#include +#include + +#include "driver_locator_private.h" +#include "device.h" + +celix_status_t driverLocator_findDrivers(driver_locator_pt locator, properties_pt props, array_list_pt *drivers) { + celix_status_t status = CELIX_SUCCESS; + + const char* category = properties_get(props, OSGI_DEVICEACCESS_DEVICE_CATEGORY); + + status = arrayList_create(drivers); + if (status == CELIX_SUCCESS) { + DIR *dir; + dir = opendir(locator->path); + if (!dir) { + status = CELIX_FILE_IO_EXCEPTION; + } else { + struct dirent *dp; + while ((dp = readdir(dir)) != NULL) { + char str1[256], str2[256], str3[256]; + if (sscanf(dp->d_name, "%[^_]_%[^.].%s", str1, str2, str3) == 3 && + strcmp(str1, category) == 0 && + strcmp(str3, "zip") == 0) { + int length = strlen(str1) + strlen(str2) + 2; + char driver[length]; + snprintf(driver, length, "%s_%s", str1, str2); + arrayList_add(*drivers, strdup(driver)); + } + } + closedir(dir); + } + } + return status; +} + +celix_status_t driverLocator_loadDriver(driver_locator_pt locator, char *id, char **stream) { + celix_status_t status = CELIX_SUCCESS; + *stream = NULL; + + DIR *dir; + dir = opendir(locator->path); + if (!dir) { + status = CELIX_FILE_IO_EXCEPTION; + } else { + struct dirent *dp; + while ((dp = readdir(dir)) != NULL) { + char str1[256], str2[256]; + if (sscanf(dp->d_name, "%[^.].%s", str1, str2) == 2 && + strcmp(str1, id) == 0 && + strcmp(str2, "zip") == 0) { + int length = strlen(locator->path) + strlen(dp->d_name) + 2; + char stream_str[length]; + snprintf(stream_str, length, "%s/%s", locator->path, dp->d_name); + *stream = strdup(stream_str); + break; + } + } + closedir(dir); + } + + return status; +} + http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/driver_locator/src/driver_locator_private.h ---------------------------------------------------------------------- diff --git a/device_access/driver_locator/src/driver_locator_private.h b/device_access/driver_locator/src/driver_locator_private.h new file mode 100644 index 0000000..bf6dcbf --- /dev/null +++ b/device_access/driver_locator/src/driver_locator_private.h @@ -0,0 +1,39 @@ +/** + *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. + */ +/* + * driver_locator_private.h + * + * \date Jun 20, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ +#ifndef DRIVER_LOCATOR_PRIVATE_H_ +#define DRIVER_LOCATOR_PRIVATE_H_ + +#include "driver_locator.h" + +struct driver_locator { + char *path; + array_list_pt drivers; +}; + +celix_status_t driverLocator_findDrivers(driver_locator_pt locator, properties_pt props, array_list_pt *drivers); +celix_status_t driverLocator_loadDriver(driver_locator_pt locator, char *id, char **driver); + +#endif /* DRIVER_LOCATOR_PRIVATE_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/example/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/device_access/example/CMakeLists.txt b/device_access/example/CMakeLists.txt index 1a5cd77..e21e5e0 100644 --- a/device_access/example/CMakeLists.txt +++ b/device_access/example/CMakeLists.txt @@ -22,7 +22,7 @@ if(DEVICE_ACCESS_EXAMPLE) add_subdirectory(refining_driver) add_deploy(device_access_example - BUNDLES device_manager driver_locator shell shell_tui log_service base_driver + BUNDLES Celix::device_manager Celix::driver_locator Celix::shell Celix::shell_tui log_service base_driver ) deploy_bundles_dir(device_access_example http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/device_access/example/base_driver/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/device_access/example/base_driver/CMakeLists.txt b/device_access/example/base_driver/CMakeLists.txt index c354d3b..49096a6 100644 --- a/device_access/example/base_driver/CMakeLists.txt +++ b/device_access/example/base_driver/CMakeLists.txt @@ -20,14 +20,9 @@ add_bundle(base_driver VERSION "0.0.1" NAME "Apache Celix Device Access Base Driver Example" SOURCES - private/src/activator - private/src/base_driver + src/activator + src/base_driver ) - -include_directories(${PROJECT_SOURCE_DIR}/device_access/device_access/public/include) -include_directories(private/include) -include_directories(public/include) -include_directories("${PROJECT_SOURCE_DIR}/framework/public/include") -include_directories("${PROJECT_SOURCE_DIR}/utils/public/include") - -target_link_libraries(base_driver celix_utils celix_framework) +target_include_directories(base_driver PRIVATE src) +target_include_directories(base_driver PUBLIC include) +target_link_libraries(base_driver PRIVATE Celix::device_access_api)