Author: abroekhuis
Date: Fri Feb 17 07:37:05 2012
New Revision: 1245337

URL: http://svn.apache.org/viewvc?rev=1245337&view=rev
Log:
Resource Processor support

Added support for resource processors to the deployment admin

Added:
    incubator/celix/trunk/deployment_admin/public/
    incubator/celix/trunk/deployment_admin/public/include/
    incubator/celix/trunk/deployment_admin/public/include/resource_processor.h
Modified:
    incubator/celix/trunk/CMakeLists.txt
    incubator/celix/trunk/deployment_admin/CMakeLists.txt
    incubator/celix/trunk/deployment_admin/private/include/deployment_package.h
    incubator/celix/trunk/deployment_admin/private/src/deployment_admin.c
    incubator/celix/trunk/deployment_admin/private/src/deployment_package.c
    incubator/celix/trunk/framework/public/include/constants.h

Modified: incubator/celix/trunk/CMakeLists.txt
URL: 
http://svn.apache.org/viewvc/incubator/celix/trunk/CMakeLists.txt?rev=1245337&r1=1245336&r2=1245337&view=diff
==============================================================================
--- incubator/celix/trunk/CMakeLists.txt (original)
+++ incubator/celix/trunk/CMakeLists.txt Fri Feb 17 07:37:05 2012
@@ -60,6 +60,7 @@ add_subdirectory(examples)
 add_subdirectory(remote_services)
 
 add_subdirectory(deployment_admin)
+add_subdirectory(o2parameters_resource_processor)
 
 include(target.cmake)
 #enable_testing()

Modified: incubator/celix/trunk/deployment_admin/CMakeLists.txt
URL: 
http://svn.apache.org/viewvc/incubator/celix/trunk/deployment_admin/CMakeLists.txt?rev=1245337&r1=1245336&r2=1245337&view=diff
==============================================================================
--- incubator/celix/trunk/deployment_admin/CMakeLists.txt (original)
+++ incubator/celix/trunk/deployment_admin/CMakeLists.txt Fri Feb 17 07:37:05 
2012
@@ -20,6 +20,7 @@ add_definitions(-DUSE_FILE32API)
 include_directories("/opt/local/include")
 include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
 include_directories("${PROJECT_SOURCE_DIR}/deployment_admin/private/include")
+include_directories("${PROJECT_SOURCE_DIR}/deployment_admin/public/include")
 
 link_directories("/opt/local/lib")
 bundle(deployment_admin SOURCES

Modified: 
incubator/celix/trunk/deployment_admin/private/include/deployment_package.h
URL: 
http://svn.apache.org/viewvc/incubator/celix/trunk/deployment_admin/private/include/deployment_package.h?rev=1245337&r1=1245336&r2=1245337&view=diff
==============================================================================
--- incubator/celix/trunk/deployment_admin/private/include/deployment_package.h 
(original)
+++ incubator/celix/trunk/deployment_admin/private/include/deployment_package.h 
Fri Feb 17 07:37:05 2012
@@ -19,18 +19,30 @@ struct bundle_info {
        char *path;
        VERSION version;
        char *symbolicName;
+       bool customizer;
 
        PROPERTIES attributes;
 };
 
 typedef struct bundle_info *bundle_info_t;
 
+struct resource_info {
+       char *path;
+       PROPERTIES attributes;
+
+       char *resourceProcessor;
+};
+
+typedef struct resource_info *resource_info_t;
+
 struct deployment_package {
        apr_pool_t *pool;
        BUNDLE_CONTEXT context;
        MANIFEST manifest;
        ARRAY_LIST bundleInfos;
+       ARRAY_LIST resourceInfos;
        HASH_MAP nameToBundleInfo;
+       HASH_MAP pathToEntry;
 };
 
 typedef struct deployment_package *deployment_package_t;
@@ -39,6 +51,8 @@ celix_status_t deploymentPackage_create(
 celix_status_t deploymentPackage_getName(deployment_package_t package, char 
**name);
 celix_status_t deploymentPackage_getBundleInfos(deployment_package_t package, 
ARRAY_LIST *infos);
 celix_status_t deploymentPackage_getBundleInfoByName(deployment_package_t 
package, char *name, bundle_info_t *info);
+celix_status_t deploymentPackage_getResourceInfos(deployment_package_t 
package, ARRAY_LIST *infos);
+celix_status_t deploymentPackage_getResourceInfoByPath(deployment_package_t 
package, char *path, resource_info_t *info);
 celix_status_t deploymentPackage_getBundle(deployment_package_t package, char 
*name, BUNDLE *bundle);
 celix_status_t deploymentPackage_getVersion(deployment_package_t package, 
VERSION *version);
 

Modified: incubator/celix/trunk/deployment_admin/private/src/deployment_admin.c
URL: 
http://svn.apache.org/viewvc/incubator/celix/trunk/deployment_admin/private/src/deployment_admin.c?rev=1245337&r1=1245336&r2=1245337&view=diff
==============================================================================
--- incubator/celix/trunk/deployment_admin/private/src/deployment_admin.c 
(original)
+++ incubator/celix/trunk/deployment_admin/private/src/deployment_admin.c Fri 
Feb 17 07:37:05 2012
@@ -21,6 +21,8 @@
 #include "bundle.h"
 #include "utils.h"
 
+#include "resource_processor.h"
+
 #define VERSIONS "http://localhost:8080/deployment/test/versions";
 
 static void *APR_THREAD_FUNC deploymentAdmin_poll(apr_thread_t *thd, void 
*deploymentAdmin);
@@ -31,6 +33,9 @@ celix_status_t deploymentAdmin_readVersi
 
 celix_status_t deploymentAdmin_stopDeploymentPackageBundles(deployment_admin_t 
admin, deployment_package_t target);
 celix_status_t 
deploymentAdmin_updateDeploymentPackageBundles(deployment_admin_t admin, 
deployment_package_t source);
+celix_status_t 
deploymentAdmin_startDeploymentPackageCustomizerBundles(deployment_admin_t 
admin, deployment_package_t source, deployment_package_t target);
+celix_status_t 
deploymentAdmin_processDeploymentPackageResources(deployment_admin_t admin, 
deployment_package_t source);
+celix_status_t 
deploymentAdmin_dropDeploymentPackageResources(deployment_admin_t admin, 
deployment_package_t source, deployment_package_t target);
 celix_status_t deploymentAdmin_dropDeploymentPackageBundles(deployment_admin_t 
admin, deployment_package_t source, deployment_package_t target);
 celix_status_t 
deploymentAdmin_startDeploymentPackageBundles(deployment_admin_t admin, 
deployment_package_t source);
 
@@ -116,8 +121,15 @@ static void *APR_THREAD_FUNC deploymentA
                                }
 
                                deployment_package_t target = 
hashMap_get(admin->packages, name);
+                               if (target == NULL) {
+//                                     target = empty package
+                               }
+
                                
deploymentAdmin_stopDeploymentPackageBundles(admin, target);
                                
deploymentAdmin_updateDeploymentPackageBundles(admin, source);
+                               
deploymentAdmin_startDeploymentPackageCustomizerBundles(admin, source, target);
+                               
deploymentAdmin_processDeploymentPackageResources(admin, source);
+                               
deploymentAdmin_dropDeploymentPackageResources(admin, source, target);
                                
deploymentAdmin_dropDeploymentPackageBundles(admin, source, target);
                                
deploymentAdmin_startDeploymentPackageBundles(admin, source);
 
@@ -319,21 +331,172 @@ celix_status_t deploymentAdmin_updateDep
        return status;
 }
 
-celix_status_t deploymentAdmin_dropDeploymentPackageBundles(deployment_admin_t 
admin, deployment_package_t source, deployment_package_t target) {
+celix_status_t 
deploymentAdmin_startDeploymentPackageCustomizerBundles(deployment_admin_t 
admin, deployment_package_t source, deployment_package_t target) {
        celix_status_t status = CELIX_SUCCESS;
 
+       apr_pool_t *tmpPool = NULL;
+       ARRAY_LIST bundles = NULL;
+       ARRAY_LIST sourceInfos = NULL;
+
+       apr_pool_create(&tmpPool, admin->pool);
+       arrayList_create(tmpPool, &bundles);
+
+       deploymentPackage_getBundleInfos(source, &sourceInfos);
+       int i;
+       for (i = 0; i < arrayList_size(sourceInfos); i++) {
+               bundle_info_t sourceInfo = arrayList_get(sourceInfos, i);
+               if (sourceInfo->customizer) {
+                       BUNDLE bundle = NULL;
+                       deploymentPackage_getBundle(source, 
sourceInfo->symbolicName, &bundle);
+                       if (bundle != NULL) {
+                               arrayList_add(bundles, bundle);
+                       }
+               }
+       }
+
        if (target != NULL) {
                ARRAY_LIST targetInfos = NULL;
                deploymentPackage_getBundleInfos(target, &targetInfos);
-               int i;
                for (i = 0; i < arrayList_size(targetInfos); i++) {
                        bundle_info_t targetInfo = arrayList_get(targetInfos, 
i);
-                       bundle_info_t info = NULL;
-                       deploymentPackage_getBundleInfoByName(source, 
targetInfo->symbolicName, &info);
-                       if (info == NULL) {
+                       if (targetInfo->customizer) {
                                BUNDLE bundle = NULL;
                                deploymentPackage_getBundle(target, 
targetInfo->symbolicName, &bundle);
-                               bundle_uninstall(bundle);
+                               if (bundle != NULL) {
+                                       arrayList_add(bundles, bundle);
+                               }
+                       }
+               }
+       }
+
+       for (i = 0; i < arrayList_size(bundles); i++) {
+               BUNDLE bundle = arrayList_get(bundles, i);
+               bundle_start(bundle, 0);
+       }
+
+       apr_pool_destroy(tmpPool);
+
+       return status;
+}
+
+celix_status_t 
deploymentAdmin_processDeploymentPackageResources(deployment_admin_t admin, 
deployment_package_t source) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       ARRAY_LIST infos = NULL;
+       deploymentPackage_getResourceInfos(source, &infos);
+       int i;
+       for (i = 0; i < arrayList_size(infos); i++) {
+               resource_info_t info = arrayList_get(infos, i);
+               apr_pool_t *tmpPool = NULL;
+               ARRAY_LIST services = NULL;
+               char *filter = NULL;
+
+               printf("Process resource: %s with %s\n", info->path, 
info->resourceProcessor);
+
+               apr_pool_create(&tmpPool, admin->pool);
+               filter = apr_pstrcat(tmpPool, "(", SERVICE_PID, "=", 
info->resourceProcessor, ")", NULL);
+
+               status = bundleContext_getServiceReferences(admin->context, 
RESOURCE_PROCESSOR_SERVICE, filter, &services);
+               if (status == CELIX_SUCCESS) {
+                       printf("REFS\n");
+                       if (services != NULL && arrayList_size(services) > 0) {
+                               printf("REFS22\n");
+                               SERVICE_REFERENCE ref = arrayList_get(services, 
0);
+                               // In Felix a check is done to assure the 
processor belongs to the deployment package
+                               // Is this according to spec?
+                               void *processorP = NULL;
+                               status = 
bundleContext_getService(admin->context, ref, &processorP);
+                               if (status == CELIX_SUCCESS) {
+                                       BUNDLE bundle = NULL;
+                                       char *entry = NULL;
+                                       char *name = NULL;
+                                       char *packageName = NULL;
+                                       resource_processor_service_t processor 
= processorP;
+
+                                       bundleContext_getBundle(admin->context, 
&bundle);
+                                       bundle_getEntry(bundle, "/", 
admin->pool, &entry);
+                                       deploymentPackage_getName(source, 
&name);
+
+                                       char *resourcePath = 
apr_pstrcat(admin->pool, entry, "repo/", name, "/", info->path, NULL);
+                                       deploymentPackage_getName(source, 
&packageName);
+
+                                       processor->begin(processor->processor, 
packageName);
+                                       
processor->process(processor->processor, info->path, resourcePath);
+                               }
+                       }
+               }
+
+
+       }
+
+       return status;
+}
+
+celix_status_t 
deploymentAdmin_dropDeploymentPackageResources(deployment_admin_t admin, 
deployment_package_t source, deployment_package_t target) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       if (target != NULL) {
+               ARRAY_LIST infos = NULL;
+               deploymentPackage_getResourceInfos(target, &infos);
+               int i;
+               for (i = 0; i < arrayList_size(infos); i++) {
+                       resource_info_t info = arrayList_get(infos, i);
+                       resource_info_t sourceInfo = NULL;
+                       deploymentPackage_getResourceInfoByPath(source, 
info->path, &sourceInfo);
+                       if (sourceInfo == NULL) {
+                               apr_pool_t *tmpPool = NULL;
+                               ARRAY_LIST services = NULL;
+                               char *filter = NULL;
+
+                               printf("Drop resource: %s with %s\n", 
info->path, info->resourceProcessor);
+
+                               apr_pool_create(&tmpPool, admin->pool);
+                               filter = apr_pstrcat(tmpPool, "(", SERVICE_PID, 
"=", info->resourceProcessor, ")", NULL);
+
+                               status = 
bundleContext_getServiceReferences(admin->context, RESOURCE_PROCESSOR_SERVICE, 
filter, &services);
+                               if (status == CELIX_SUCCESS) {
+                                       if (services != NULL && 
arrayList_size(services) > 0) {
+                                               SERVICE_REFERENCE ref = 
arrayList_get(services, 0);
+                                               // In Felix a check is done to 
assure the processor belongs to the deployment package
+                                               // Is this according to spec?
+                                               void *processorP = NULL;
+                                               status = 
bundleContext_getService(admin->context, ref, &processorP);
+                                               if (status == CELIX_SUCCESS) {
+                                                       BUNDLE bundle = NULL;
+                                                       char *packageName = 
NULL;
+                                                       
resource_processor_service_t processor = processorP;
+
+                                                       
deploymentPackage_getName(source, &packageName);
+                                                       
processor->begin(processor->processor, packageName);
+                                                       
processor->dropped(processor->processor, info->path);
+                                               }
+                                       }
+                               }
+
+                       }
+               }
+       }
+
+       return status;
+}
+
+celix_status_t deploymentAdmin_dropDeploymentPackageBundles(deployment_admin_t 
admin, deployment_package_t source, deployment_package_t target) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       if (target != NULL) {
+               ARRAY_LIST targetInfos = NULL;
+               deploymentPackage_getBundleInfos(target, &targetInfos);
+               int i;
+               for (i = 0; i < arrayList_size(targetInfos); i++) {
+                       bundle_info_t targetInfo = arrayList_get(targetInfos, 
i);
+                       if (!targetInfo->customizer) {
+                               bundle_info_t info = NULL;
+                               deploymentPackage_getBundleInfoByName(source, 
targetInfo->symbolicName, &info);
+                               if (info == NULL) {
+                                       BUNDLE bundle = NULL;
+                                       deploymentPackage_getBundle(target, 
targetInfo->symbolicName, &bundle);
+                                       bundle_uninstall(bundle);
+                               }
                        }
                }
        }
@@ -350,11 +513,13 @@ celix_status_t deploymentAdmin_startDepl
        for (i = 0; i < arrayList_size(infos); i++) {
                BUNDLE bundle = NULL;
                bundle_info_t info = arrayList_get(infos, i);
-               deploymentPackage_getBundle(source, info->symbolicName, 
&bundle);
-               if (bundle != NULL) {
-                       bundle_start(bundle, 0);
-               } else {
-                       printf("DEPLOYMENT_ADMIN: Could not start bundle %s\n", 
info->symbolicName);
+               if (!info->customizer) {
+                       deploymentPackage_getBundle(source, info->symbolicName, 
&bundle);
+                       if (bundle != NULL) {
+                               bundle_start(bundle, 0);
+                       } else {
+                               printf("DEPLOYMENT_ADMIN: Could not start 
bundle %s\n", info->symbolicName);
+                       }
                }
        }
 

Modified: 
incubator/celix/trunk/deployment_admin/private/src/deployment_package.c
URL: 
http://svn.apache.org/viewvc/incubator/celix/trunk/deployment_admin/private/src/deployment_package.c?rev=1245337&r1=1245336&r2=1245337&view=diff
==============================================================================
--- incubator/celix/trunk/deployment_admin/private/src/deployment_package.c 
(original)
+++ incubator/celix/trunk/deployment_admin/private/src/deployment_package.c Fri 
Feb 17 07:37:05 2012
@@ -15,7 +15,12 @@
 #include "module.h"
 #include "bundle.h"
 
-celix_status_t deploymentPackage_setBundleInfos(deployment_package_t package);
+static const char * const RESOURCE_PROCESSOR = "Resource-Processor";
+static const char * const DEPLOYMENTPACKAGE_CUSTOMIZER = 
"DeploymentPackage-Customizer";
+
+celix_status_t deploymentPackage_processEntries(deployment_package_t package);
+static celix_status_t deploymentPackage_isBundleResource(PROPERTIES 
attributes, bool *isBundleResource);
+static celix_status_t deploymentPackage_parseBooleanHeader(char *value, bool 
*boolValue);
 
 celix_status_t deploymentPackage_create(apr_pool_t *pool, BUNDLE_CONTEXT 
context, MANIFEST manifest, deployment_package_t *package) {
        celix_status_t status = CELIX_SUCCESS;
@@ -28,15 +33,24 @@ celix_status_t deploymentPackage_create(
                (*package)->context = context;
                (*package)->manifest = manifest;
                (*package)->bundleInfos = NULL;
+               (*package)->resourceInfos = NULL;
                (*package)->nameToBundleInfo = hashMap_create(string_hash, 
NULL, string_equals, NULL);
+               (*package)->pathToEntry = hashMap_create(string_hash, NULL, 
string_equals, NULL);
                status = arrayList_create(pool, &(*package)->bundleInfos);
                if (status == CELIX_SUCCESS) {
-                       status = deploymentPackage_setBundleInfos(*package);
+                       status = arrayList_create(pool, 
&(*package)->resourceInfos);
                        if (status == CELIX_SUCCESS) {
-                               int i;
-                               for (i = 0; i < 
arrayList_size((*package)->bundleInfos); i++) {
-                                       bundle_info_t info = 
arrayList_get((*package)->bundleInfos, i);
-                                       
hashMap_put((*package)->nameToBundleInfo, info->symbolicName, info);
+                               status = 
deploymentPackage_processEntries(*package);
+                               if (status == CELIX_SUCCESS) {
+                                       int i;
+                                       for (i = 0; i < 
arrayList_size((*package)->bundleInfos); i++) {
+                                               bundle_info_t info = 
arrayList_get((*package)->bundleInfos, i);
+                                               
hashMap_put((*package)->nameToBundleInfo, info->symbolicName, info);
+                                       }
+                                       for (i = 0; i < 
arrayList_size((*package)->resourceInfos); i++) {
+                                               resource_info_t info = 
arrayList_get((*package)->resourceInfos, i);
+                                               
hashMap_put((*package)->pathToEntry, info->path, info);
+                                       }
                                }
                        }
                }
@@ -81,12 +95,22 @@ celix_status_t deploymentPackage_getBund
        return CELIX_SUCCESS;
 }
 
+celix_status_t deploymentPackage_getResourceInfos(deployment_package_t 
package, ARRAY_LIST *infos) {
+       *infos = arrayList_clone(package->pool, package->resourceInfos);
+       return CELIX_SUCCESS;
+}
+
+celix_status_t deploymentPackage_getResourceInfoByPath(deployment_package_t 
package, char *path, resource_info_t *info) {
+       *info = hashMap_get(package->pathToEntry, path);
+       return CELIX_SUCCESS;
+}
+
 celix_status_t deploymentPackage_getVersion(deployment_package_t package, 
VERSION *version) {
        char *versionStr = manifest_getValue(package->manifest, 
"DeploymentPackage-Version");
        return version_createVersionFromString(package->pool, versionStr, 
version);
 }
 
-celix_status_t deploymentPackage_setBundleInfos(deployment_package_t package) {
+celix_status_t deploymentPackage_processEntries(deployment_package_t package) {
        celix_status_t status = CELIX_SUCCESS;
 
        HASH_MAP entries = NULL;
@@ -97,18 +121,48 @@ celix_status_t deploymentPackage_setBund
                char *name = hashMapEntry_getKey(entry);
                PROPERTIES values = hashMapEntry_getValue(entry);
 
-               bundle_info_t info = apr_palloc(package->pool, sizeof(*info));
-               info->path = name;
-               info->attributes = values;
-               info->symbolicName = properties_get(values, (char *) 
BUNDLE_SYMBOLICNAME);
-               char *version = properties_get(values, (char *) BUNDLE_VERSION);
-               info->version = NULL;
-               status = version_createVersionFromString(package->pool, 
version, &info->version);
+               bool isBundleResource;
+               deploymentPackage_isBundleResource(values, &isBundleResource);
+               if (isBundleResource) {
+                       bundle_info_t info = apr_palloc(package->pool, 
sizeof(*info));
+                       info->path = name;
+                       info->attributes = values;
+                       info->symbolicName = properties_get(values, (char *) 
BUNDLE_SYMBOLICNAME);
+                       char *version = properties_get(values, (char *) 
BUNDLE_VERSION);
+                       info->version = NULL;
+                       status = version_createVersionFromString(package->pool, 
version, &info->version);
+                       char *customizer = properties_get(values, (char *) 
DEPLOYMENTPACKAGE_CUSTOMIZER);
+                       deploymentPackage_parseBooleanHeader(customizer, 
&info->customizer);
+
+                       arrayList_add(package->bundleInfos, info);
+               } else {
+                       resource_info_t info = apr_palloc(package->pool, 
sizeof(*info));
+                       info->path = name;
+                       info->attributes = values;
+                       info->resourceProcessor = properties_get(values, (char 
*) RESOURCE_PROCESSOR);
 
-               arrayList_add(package->bundleInfos, info);
+                       arrayList_add(package->resourceInfos, info);
+               }
        }
 
        return status;
 }
 
+static celix_status_t deploymentPackage_isBundleResource(PROPERTIES 
attributes, bool *isBundleResource) {
+       *isBundleResource = properties_get(attributes, (char *) 
BUNDLE_SYMBOLICNAME) != NULL;
+       return CELIX_SUCCESS;
+}
+
+static celix_status_t deploymentPackage_parseBooleanHeader(char *value, bool 
*boolValue) {
+       *boolValue = false;
+       if (value != NULL) {
+               if (strcmp(value, "true") == 0) {
+                       *boolValue = true;
+               } else {
+                       *boolValue = false;
+               }
+       }
+       return CELIX_SUCCESS;
+}
+
 

Added: 
incubator/celix/trunk/deployment_admin/public/include/resource_processor.h
URL: 
http://svn.apache.org/viewvc/incubator/celix/trunk/deployment_admin/public/include/resource_processor.h?rev=1245337&view=auto
==============================================================================
--- incubator/celix/trunk/deployment_admin/public/include/resource_processor.h 
(added)
+++ incubator/celix/trunk/deployment_admin/public/include/resource_processor.h 
Fri Feb 17 07:37:05 2012
@@ -0,0 +1,35 @@
+/*
+ * resource_processor.h
+ *
+ *  Created on: Feb 13, 2012
+ *      Author: alexander
+ */
+
+#ifndef RESOURCE_PROCESSOR_H_
+#define RESOURCE_PROCESSOR_H_
+
+#include "celix_errno.h"
+
+#define RESOURCE_PROCESSOR_SERVICE "resource_processor"
+
+typedef struct resource_processor *resource_processor_t;
+
+typedef struct resource_processor_service *resource_processor_service_t;
+
+struct resource_processor_service {
+       resource_processor_t processor;
+       celix_status_t (*begin)(resource_processor_t processor, char 
*packageName);
+
+       celix_status_t (*process)(resource_processor_t processor, char *name, 
char *path);
+
+       celix_status_t (*dropped)(resource_processor_t processor, char *name);
+       celix_status_t (*dropAllResources)(resource_processor_t processor);
+
+       //celix_status_t (*prepare)(resource_processor_t processor);
+       //celix_status_t (*commit)(resource_processor_t processor);
+       //celix_status_t (*rollback)(resource_processor_t processor);
+
+       //celix_status_t (*cancel)(resource_processor_t processor);
+};
+
+#endif /* RESOURCE_PROCESSOR_H_ */

Modified: incubator/celix/trunk/framework/public/include/constants.h
URL: 
http://svn.apache.org/viewvc/incubator/celix/trunk/framework/public/include/constants.h?rev=1245337&r1=1245336&r2=1245337&view=diff
==============================================================================
--- incubator/celix/trunk/framework/public/include/constants.h (original)
+++ incubator/celix/trunk/framework/public/include/constants.h Fri Feb 17 
07:37:05 2012
@@ -28,6 +28,7 @@
 
 static const char * const OBJECTCLASS = "objectClass";
 static const char * const SERVICE_ID = "service.id";
+static const char * const SERVICE_PID = "service.pid";
 static const char * const SERVICE_RANKING = "service.ranking";
 
 static const char * const BUNDLE_ACTIVATOR_CREATE = "bundleActivator_create";


Reply via email to