You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by ab...@apache.org on 2011/08/30 14:18:54 UTC
svn commit: r1163183 - in /incubator/celix/trunk:
dependency_manager/service_dependency.c
examples/whiteboard/tracker/activator.c framework/private/include/headers.h
framework/private/include/service_tracker.h
framework/private/src/service_tracker.c
Author: abroekhuis
Date: Tue Aug 30 12:18:53 2011
New Revision: 1163183
URL: http://svn.apache.org/viewvc?rev=1163183&view=rev
Log:
Added support for filters to the service tracker
Modified:
incubator/celix/trunk/dependency_manager/service_dependency.c
incubator/celix/trunk/examples/whiteboard/tracker/activator.c
incubator/celix/trunk/framework/private/include/headers.h
incubator/celix/trunk/framework/private/include/service_tracker.h
incubator/celix/trunk/framework/private/src/service_tracker.c
Modified: incubator/celix/trunk/dependency_manager/service_dependency.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/dependency_manager/service_dependency.c?rev=1163183&r1=1163182&r2=1163183&view=diff
==============================================================================
--- incubator/celix/trunk/dependency_manager/service_dependency.c (original)
+++ incubator/celix/trunk/dependency_manager/service_dependency.c Tue Aug 30 12:18:53 2011
@@ -76,7 +76,8 @@ void serviceDependency_start(SERVICE_DEP
cust->modifiedService = serviceDependency_modifiedService;
cust->removedService = serviceDependency_removedService;
- dependency->tracker = tracker_create(dependency->context, dependency->trackedServiceName, cust);
+ dependency->tracker = NULL;
+ tracker_create(dependency->context, dependency->trackedServiceName, cust, &dependency->tracker);
} else {
}
Modified: incubator/celix/trunk/examples/whiteboard/tracker/activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/whiteboard/tracker/activator.c?rev=1163183&r1=1163182&r2=1163183&view=diff
==============================================================================
--- incubator/celix/trunk/examples/whiteboard/tracker/activator.c (original)
+++ incubator/celix/trunk/examples/whiteboard/tracker/activator.c Tue Aug 30 12:18:53 2011
@@ -107,7 +107,8 @@ celix_status_t bundleActivator_start(voi
cust->addingService = addingServ;
cust->modifiedService = modifiedServ;
cust->removedService = removedServ;
- SERVICE_TRACKER tracker = tracker_create(context, (char *) PUBLISHER_NAME, cust);
+ SERVICE_TRACKER tracker = NULL;
+ tracker_create(context, (char *) PUBLISHER_NAME, cust, &tracker);
data->tracker = tracker;
tracker_open(tracker);
Modified: incubator/celix/trunk/framework/private/include/headers.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/include/headers.h?rev=1163183&r1=1163182&r2=1163183&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/include/headers.h (original)
+++ incubator/celix/trunk/framework/private/include/headers.h Tue Aug 30 12:18:53 2011
@@ -188,7 +188,7 @@ typedef struct serviceTrackerCustomizer
struct serviceTracker {
BUNDLE_CONTEXT context;
- char * className;
+ char * filter;
};
typedef struct serviceTracker * SERVICE_TRACKER;
Modified: incubator/celix/trunk/framework/private/include/service_tracker.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/include/service_tracker.h?rev=1163183&r1=1163182&r2=1163183&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/include/service_tracker.h (original)
+++ incubator/celix/trunk/framework/private/include/service_tracker.h Tue Aug 30 12:18:53 2011
@@ -44,7 +44,8 @@ struct tracked {
typedef struct tracked * TRACKED;
-SERVICE_TRACKER tracker_create(BUNDLE_CONTEXT context, char * className, SERVICE_TRACKER_CUSTOMIZER customizer);
+celix_status_t tracker_create(BUNDLE_CONTEXT context, char * service, SERVICE_TRACKER_CUSTOMIZER customizer, SERVICE_TRACKER *tracker);
+SERVICE_TRACKER tracker_createWithFilter(BUNDLE_CONTEXT context, char * filter, SERVICE_TRACKER_CUSTOMIZER customizer);
void tracker_open(SERVICE_TRACKER tracker);
void tracker_close(SERVICE_TRACKER tracker);
Modified: incubator/celix/trunk/framework/private/src/service_tracker.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/src/service_tracker.c?rev=1163183&r1=1163182&r2=1163183&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/src/service_tracker.c (original)
+++ incubator/celix/trunk/framework/private/src/service_tracker.c Tue Aug 30 12:18:53 2011
@@ -35,14 +35,43 @@ void * addingService(FW_SERVICE_TRACKER,
void track(FW_SERVICE_TRACKER, SERVICE_REFERENCE, SERVICE_EVENT);
void untrack(FW_SERVICE_TRACKER, SERVICE_REFERENCE, SERVICE_EVENT);
-SERVICE_TRACKER tracker_create(BUNDLE_CONTEXT context, char * className, SERVICE_TRACKER_CUSTOMIZER customizer) {
+celix_status_t tracker_create(BUNDLE_CONTEXT context, char * service, SERVICE_TRACKER_CUSTOMIZER customizer, SERVICE_TRACKER *tracker) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ if (service == NULL) {
+ status = CELIX_ILLEGAL_ARGUMENT;
+ } else {
+ apr_pool_t *pool = NULL;
+ //status = bundleContext_getMemoryPool(context, &pool);
+ if (status == CELIX_SUCCESS) {
+ int len = strlen(service) + strlen(OBJECTCLASS) + 4;
+ //char *filter = apr_palloc(pool, sizeof(char) * len);
+ char *filter = malloc(sizeof(char) * len);
+ if (filter == NULL) {
+ status = CELIX_ENOMEM;
+ } else {
+ strcpy(filter, "(");
+ strcat(filter, OBJECTCLASS);
+ strcat(filter, "=");
+ strcat(filter, service);
+ strcat(filter, ")\0");
+ *tracker = tracker_createWithFilter(context, filter, customizer);
+ }
+ }
+ }
+
+
+ return status;
+}
+
+SERVICE_TRACKER tracker_createWithFilter(BUNDLE_CONTEXT context, char * filter, SERVICE_TRACKER_CUSTOMIZER customizer) {
SERVICE_TRACKER tracker = (SERVICE_TRACKER) malloc(sizeof(*tracker));
FW_SERVICE_TRACKER fw_tracker = (FW_SERVICE_TRACKER) malloc(sizeof(*fw_tracker));
if (m_trackers == NULL) {
m_trackers = arrayList_create();
}
tracker->context = context;
- tracker->className = className;
+ tracker->filter = filter;
fw_tracker->tracker = tracker;
fw_tracker->tracked = arrayList_create();
@@ -58,21 +87,12 @@ void tracker_open(SERVICE_TRACKER tracke
FW_SERVICE_TRACKER fwTracker = findFwServiceTracker(tracker);
ARRAY_LIST initial = NULL;
- bundleContext_getServiceReferences(tracker->context, tracker->className, NULL, &initial);
+ bundleContext_getServiceReferences(tracker->context, NULL, tracker->filter, &initial);
SERVICE_REFERENCE initial_reference;
unsigned int i;
- int len = strlen(tracker->className);
- len += strlen(OBJECTCLASS);
- len += 4;
- char filter[len];
- strcpy(filter, "(");
- strcat(filter, OBJECTCLASS);
- strcat(filter, "=");
- strcat(filter, tracker->className);
- strcat(filter, ")\0");
listener->serviceChanged = (void *) tracker_serviceChanged;
- bundleContext_addServiceListener(tracker->context, listener, filter);
+ bundleContext_addServiceListener(tracker->context, listener, tracker->filter);
fwTracker->listener = listener;
for (i = 0; i < arrayList_size(initial); i++) {