Repository: celix
Updated Branches:
  refs/heads/develop 3ba41cad6 -> 3391d88d0


CELIX-446: Adds celix_bundleContext_registerServiceWithOptions api, refactors 
previous registerService api.


Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/3391d88d
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/3391d88d
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/3391d88d

Branch: refs/heads/develop
Commit: 3391d88d09956a5df09eece9b8ad37009bb30484
Parents: 3ba41ca
Author: Pepijn Noltes <[email protected]>
Authored: Sun May 13 12:47:04 2018 +0200
Committer: Pepijn Noltes <[email protected]>
Committed: Sun May 13 12:47:04 2018 +0200

----------------------------------------------------------------------
 .../src/dynamic_provider_example.c              |   2 +-
 .../src/simple_provider_example.c               |   2 +-
 framework/include/bundle_context.h              | 117 ++++++++++++-------
 framework/private/mock/bundle_context_mock.c    |  29 +----
 framework/src/bundle_context.c                  |  64 +++++-----
 framework/tst/bundle_context_services_test.cpp  |  50 ++++----
 shell/src/activator.c                           |  12 +-
 7 files changed, 143 insertions(+), 133 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/3391d88d/examples/celix-examples/services_example_c/src/dynamic_provider_example.c
----------------------------------------------------------------------
diff --git 
a/examples/celix-examples/services_example_c/src/dynamic_provider_example.c 
b/examples/celix-examples/services_example_c/src/dynamic_provider_example.c
index 4127c4b..7a7d9d9 100644
--- a/examples/celix-examples/services_example_c/src/dynamic_provider_example.c
+++ b/examples/celix-examples/services_example_c/src/dynamic_provider_example.c
@@ -65,7 +65,7 @@ void * run(void *handle) {
         if (up) {
             properties_t *props = properties_create();
             celix_properties_setLong(props, OSGI_FRAMEWORK_SERVICE_RANKING, 
rand());
-            data->svcIds[i++] = celix_bundleContext_registerService(data->ctx, 
EXAMPLE_CALC_NAME, &data->svc, NULL, props);
+            data->svcIds[i++] = celix_bundleContext_registerService(data->ctx, 
&data->svc, EXAMPLE_CALC_NAME, props);
         } else { //down
             celix_bundleContext_unregisterService(data->ctx, data->svcIds[i]);
             data->svcIds[--i] = -1L;

http://git-wip-us.apache.org/repos/asf/celix/blob/3391d88d/examples/celix-examples/services_example_c/src/simple_provider_example.c
----------------------------------------------------------------------
diff --git 
a/examples/celix-examples/services_example_c/src/simple_provider_example.c 
b/examples/celix-examples/services_example_c/src/simple_provider_example.c
index 765a49e..3358903 100644
--- a/examples/celix-examples/services_example_c/src/simple_provider_example.c
+++ b/examples/celix-examples/services_example_c/src/simple_provider_example.c
@@ -54,7 +54,7 @@ celix_status_t bundleActivator_create(celix_bundle_context_t 
*ctx, void **out) {
 
 celix_status_t bundleActivator_start(void * handle, celix_bundle_context_t 
*ctx) {
     activator_data_t *data = handle;
-    data->svcId = celix_bundleContext_registerService(data->ctx, 
EXAMPLE_CALC_NAME, &data->svc, EXAMPLE_CALC_VERSION, NULL);
+    data->svcId = celix_bundleContext_registerService(data->ctx, &data->svc, 
EXAMPLE_CALC_NAME, NULL);
     printf("Registered calc service with service id %li\n", data->svcId);
        return CELIX_SUCCESS;
 }

http://git-wip-us.apache.org/repos/asf/celix/blob/3391d88d/framework/include/bundle_context.h
----------------------------------------------------------------------
diff --git a/framework/include/bundle_context.h 
b/framework/include/bundle_context.h
index 5daaff9..93840b7 100644
--- a/framework/include/bundle_context.h
+++ b/framework/include/bundle_context.h
@@ -196,34 +196,83 @@ bundleContext_getPropertyWithDefault(bundle_context_pt 
context, const char *name
  */
 dm_dependency_manager_t* 
celix_bundleContext_getDependencyManager(celix_bundle_context_t *ctx);
 
+
+typedef struct celix_service_registration_options {
+    /**
+     * The service pointer. The actual pointer to the service. For C this is 
normally a pointer to a struct
+     * with function pointers, but theoretically this can be a pointer to 
anything (e.g. a pointer to a single function,
+     * or a pointer to a C++ interface implementation, or just a pointer to a 
data structure).
+     *
+     * The bundle is responsible to keep the service pointer valid as long as 
it is registered in the Celix framework.
+     */
+    void *svc;
+
+    /**
+     * The service factory pointer.
+     * Note if the factory service is set, the svc field will not be used.
+     *
+     * The service factory will be called for every bundle 
requesting/de-requesting a service. This gives the provider the
+     * option to create bundle specific service instances.
+     *
+     * When a service is requested for a bundle the getService of the factory 
service will be called. This function must
+     * return a valid pointer to a service conform the registered service name 
or NULL.
+     * When a service in no longer needed for a bundle (e.g. ending the 
useService(s) calls when a service tacker is stopped)
+     * the ungetService function of the service factory will be called.
+     *
+     * The bundle is responsible to keep the service factory pointer valid as 
long as it is registered in the Celix framework.
+     */
+    celix_service_factory_t *factory;
+
+    /**
+     * The required service name. This is used to identify the service. A 
fully qualified name with a namespace is
+     * advisable to prevent name collision. (e.g. EXAMPLE_PRESURE_SENSOR).
+     */
+    const char *serviceName;
+
+    /**
+     * The optional service properties. These contain meta information about 
the service in the
+     * form of string key/values. (e.g. the location of a pressure sensor: 
location=left-tire).
+     *
+     * When a service is registered the Celix framework will take ownership of 
the provided properties.
+     * If a registration fails, the properties will be destroyed (freed) by 
the Celix framework.
+     */
+     celix_properties_t *properties;
+
+     /**
+      * The optional service language. If this is NULL, 
CELIX_FRAMEWORK_SERVICE_LANGUAGE_C is used.
+      */
+      const char *serviceLanguage;
+
+      /**
+       * The optional service version (in the form of 
<MAJOR>.<MINOR>.<MICRO>.<QUALIFIER>).
+       * If present consumer of the service can specific which service version 
range of
+       * a specific service they are interested in. Note that it is the 
responsibility of the users to ensure that
+       * service in those version range are compatible (binary of source). It 
is advisable to use semantic versioning
+       * for this.
+       */
+      const char *serviceVersion;
+} celix_service_registration_options_t;
+
+#define CELIX_EMPTY_SERVICE_REGISTRATION_OPTIONS { .svc = NULL, \
+    .serviceName = NULL, \
+    .properties = NULL, \
+    .serviceLanguage = NULL, \
+    .serviceVersion = NULL }
+
 /**
  * Register a C lang service to the framework.
  *
  * @param ctx The bundle context
- * @param serviceName the service name, cannot be NULL
  * @param svc the service object. Normally a pointer to a service struct (e.g. 
a struct with function pointers)
- * @param serviceVersion The optional service version.
+ * @param serviceName the service name, cannot be NULL
  * @param properties The meta properties associated with the service. The 
service registration will take ownership of the properties (e.g. no destroy 
needed)
  * @return The serviceId, which should be >= 0. If < 0 then the registration 
was unsuccessful.
  */
-long celix_bundleContext_registerService(celix_bundle_context_t *ctx, const 
char *serviceName, void *svc, const char *serviceVersion, celix_properties_t 
*properties);
-
-/**
-* Register a service for the specified language to the framework.
-*
-* @param ctx The bundle context
-* @param serviceName the service name, cannot be NULL
-* @param svc Pointer to the service. Normally a pointer to a service struct 
(e.g. a struct with function pointers)
-* @param serviceVersion The optional service version.
-* @param lang The service language. Will be set to 
CELIX_FRAMEWORK_SERVICE_LANGUAGE_C if NULL is provided.
-* @param properties The meta properties associated with the service. The 
service registration will take ownership of the properties
-* @return The serviceId, which should >= 0. If < 0 then the registration was 
unsuccessful.
-*/
-long celix_bundleContext_registerServiceForLang(celix_bundle_context_t *ctx, 
const char *serviceName, void *svc, const char *serviceVersion, const char* 
lang, celix_properties_t *properties);
+long celix_bundleContext_registerService(celix_bundle_context_t *ctx, void 
*svc, const char *serviceName, celix_properties_t *properties);
 
 /**
  * Register a service factory in the framework (for the C language).
- * THe service factory will be called for every bundle 
requesting/de-requesting a service. This gives the provider the
+ * The service factory will be called for every bundle 
requesting/de-requesting a service. This gives the provider the
  * option to create bundle specific service instances.
  *
  * When a service is requested for a bundle the getService of the factory 
service will be called. This function must
@@ -232,33 +281,22 @@ long 
celix_bundleContext_registerServiceForLang(celix_bundle_context_t *ctx, con
  * the ungetService function of the service factory will be called.
  *
  * @param ctx The bundle context
- * @param serviceName The required service name of the services this factory 
will produce.
  * @param factory The pointer to the factory service.
- * @param serviceVersion The optional service version.
+ * @param serviceName The required service name of the services this factory 
will produce.
  * @param properties The optional service factory properties. For a service 
consumer this will be seen as the service properties.
  * @return The service id of the service factory or < 0 if the registration 
was unsuccessful.
  */
-long celix_bundleContext_registerServiceFactory(celix_bundle_context_t *ctx, 
const char *serviceName, celix_service_factory_t *factory, const char 
*serviceVersion, celix_properties_t *properties);
+long celix_bundleContext_registerServiceFactory(celix_bundle_context_t *ctx, 
celix_service_factory_t *factory, const char *serviceName, celix_properties_t 
*props);
 
 /**
- * Register a service factory in the framework.
- * THe service factory will be called for every bundle 
requesting/de-requesting a service. This gives the provider the
- * option to create bundle specific service instances.
- *
- * When a service is requested for a bundle the getService of the factory 
service will be called. This function must
- * return a valid pointer to a service conform the registered service name or 
NULL.
- * When a service in no longer needed for a bundle (e.g. ending the 
useService(s) calls when a service tacker is stopped)
- * the ungetService function of the service factory will be called.
- *
- * @param ctx The bundle context
- * @param serviceName The required service name of the services this factory 
will produce.
- * @param factory The pointer to the factory service.
- * @param serviceVersion The optional service version.
- * @param lang The d service language. Will be set to 
CELIX_FRAMEWORK_SERVICE_LANGUAGE_C if NULL is provided.
- * @param properties The optional service factory properties. For a service 
consumer this will be seen as the service properties.
- * @return The service id of the service factory or < 0 if the registration 
was unsuccessful.
- */
-long celix_bundleContext_registerServiceFactorForLang(celix_bundle_context_t 
*ctx, const char *serviceName, celix_service_factory_t *factory, const char 
*serviceVersion, const char *lang, celix_properties_t *properties);
+* Register a service Celix to the framework using the provded registration 
options.
+*
+* @param ctx The bundle context
+* @param opts The pointer to the registration options. The options are only in 
the during registration call.
+* @return The serviceId, which should >= 0. If < 0 then the registration was 
unsuccessful.
+*/
+long celix_bundleContext_registerServiceWithOptions(celix_bundle_context_t 
*ctx, const celix_service_registration_options_t *opts);
+
 
 /**
  * Unregister the service or service factory with service id.
@@ -565,8 +603,6 @@ bool 
celix_bundleContext_uninstallBundle(celix_bundle_context_t *ctx, long bundl
  * requested bundle tracker ootions.
  */
 typedef struct celix_bundle_tracker_options {
-    //TODO options to track framework & own bundle
-
     /**
      * Handle used in the tracker callbacks.
      */
@@ -612,7 +648,6 @@ long celix_bundleContext_trackBundlesWithOptions(
         const celix_bundle_tracker_options_t *opts
 );
 
-//TODO except framework & own bundle
 /**
  * track bundles
  * The add bundle callback will also be called for already installed bundles.

http://git-wip-us.apache.org/repos/asf/celix/blob/3391d88d/framework/private/mock/bundle_context_mock.c
----------------------------------------------------------------------
diff --git a/framework/private/mock/bundle_context_mock.c 
b/framework/private/mock/bundle_context_mock.c
index b763b5a..9d3fe85 100644
--- a/framework/private/mock/bundle_context_mock.c
+++ b/framework/private/mock/bundle_context_mock.c
@@ -194,24 +194,19 @@ celix_status_t 
bundleContext_getProperty(bundle_context_pt context, const char *
        return mock_c()->returnValue().value.intValue;
 }
 
-long celix_bundleContext_registerService(bundle_context_t *ctx, const char 
*serviceName, void *svc, const char *serviceVersion, properties_t *properties) {
+long celix_bundleContext_registerService(bundle_context_t *ctx, void *svc, 
const char *serviceName, properties_t *properties) {
        mock_c()->actualCall("celix_bundleContext_registerCService")
                        ->withPointerParameters("ctx", ctx)
                        ->withStringParameters("serviceName", serviceName)
                        ->withPointerParameters("svc", svc)
-                       ->withPointerParameters("properties", properties)
-                       ->withStringParameters("serviceName", serviceVersion);
+                       ->withPointerParameters("properties", properties);
        return mock_c()->returnValue().value.longIntValue;
 }
 
-long celix_bundleContext_registerServiceForLang(bundle_context_t *ctx, const 
char *serviceName, void *svc, const char *serviceVersion, const char* lang, 
properties_t *properties) {
-       mock_c()->actualCall("celix_bundleContext_registerServiceForLang")
+long celix_bundleContext_registerServiceWithOptions(celix_bundle_context_t 
*ctx, const celix_service_registration_options_t *opts) {
+       mock_c()->actualCall("celix_bundleContext_registerServiceWithOptions")
                        ->withPointerParameters("ctx", ctx)
-                       ->withStringParameters("serviceName", serviceName)
-                       ->withConstPointerParameters("svc", svc)
-                       ->withPointerParameters("properties", properties)
-                       ->withStringParameters("serviceName", serviceVersion)
-                       ->withStringParameters("lang", lang);
+                       ->withConstPointerParameters("opts", opts);
        return mock_c()->returnValue().value.longIntValue;
 }
 
@@ -327,23 +322,11 @@ void celix_bundleContext_useServicesWithOptions(
                        ->withConstPointerParameters("opts", opts);
 }
 
-long celix_bundleContext_registerServiceFactory(celix_bundle_context_t *ctx, 
const char *serviceName, celix_service_factory_t *factory, const char 
*serviceVersion, celix_properties_t *props) {
+long celix_bundleContext_registerServiceFactory(celix_bundle_context_t *ctx, 
celix_service_factory_t *factory, const char *serviceName, celix_properties_t 
*props) {
        mock_c()->actualCall("celix_bundleContext_registerServiceFactory")
                        ->withPointerParameters("ctx", ctx)
                        ->withStringParameters("serviceName", serviceName)
                        ->withPointerParameters("factory", factory)
-                       ->withStringParameters("serviceVersion", serviceVersion)
-                       ->withPointerParameters("props", props);
-       return mock_c()->returnValue().value.longIntValue;
-}
-
-long celix_bundleContext_registerServiceFactorForLang(celix_bundle_context_t 
*ctx, const char *serviceName, celix_service_factory_t *factory, const char 
*serviceVersion, const char *lang, celix_properties_t *props) {
-       mock_c()->actualCall("celix_bundleContext_registerServiceFactorForLang")
-                       ->withPointerParameters("ctx", ctx)
-                       ->withStringParameters("serviceName", serviceName)
-                       ->withPointerParameters("factory", factory)
-                       ->withStringParameters("serviceVersion", serviceVersion)
-                       ->withStringParameters("lang", lang)
                        ->withPointerParameters("props", props);
        return mock_c()->returnValue().value.longIntValue;
 }

http://git-wip-us.apache.org/repos/asf/celix/blob/3391d88d/framework/src/bundle_context.c
----------------------------------------------------------------------
diff --git a/framework/src/bundle_context.c b/framework/src/bundle_context.c
index ffb1704..f79d101 100644
--- a/framework/src/bundle_context.c
+++ b/framework/src/bundle_context.c
@@ -425,29 +425,47 @@ celix_status_t 
bundleContext_getPropertyWithDefault(bundle_context_pt context, c
  
**********************************************************************************************************************/
 
 
-long celix_bundleContext_registerService(bundle_context_t *ctx, const char 
*serviceName, void *svc, const char *serviceVersion, properties_t *properties) {
-    return celix_bundleContext_registerServiceForLang(ctx, serviceName, svc, 
serviceVersion, NULL, properties);
+long celix_bundleContext_registerService(bundle_context_t *ctx, void *svc, 
const char *serviceName, celix_properties_t *properties) {
+    celix_service_registration_options_t opts = 
CELIX_EMPTY_SERVICE_REGISTRATION_OPTIONS;
+    opts.svc = svc;
+    opts.serviceName = serviceName;
+    opts.properties = properties;
+    return celix_bundleContext_registerServiceWithOptions(ctx, &opts);
 }
 
 
-long celix_bundleContext_registerServiceForLang(bundle_context_t *ctx, const 
char *serviceName, void *svc, const char *serviceVersion, const char* lang, 
properties_t *properties) {
+long celix_bundleContext_registerServiceFactory(celix_bundle_context_t *ctx, 
celix_service_factory_t *factory, const char *serviceName, celix_properties_t 
*props) {
+    celix_service_registration_options_t opts = 
CELIX_EMPTY_SERVICE_REGISTRATION_OPTIONS;
+    opts.factory = factory;
+    opts.serviceName = serviceName;
+    opts.properties = props;
+    return celix_bundleContext_registerServiceWithOptions(ctx, &opts);
+}
+
+long celix_bundleContext_registerServiceWithOptions(bundle_context_t *ctx, 
const celix_service_registration_options_t *opts) {
     long svcId = -1;
     service_registration_t *reg = NULL;
-    if (properties == NULL) {
-        properties = properties_create();
+    celix_properties_t *props = opts->properties;
+    if (props == NULL) {
+        props = celix_properties_create();
     }
-    if (serviceVersion != NULL) {
-        properties_set(properties, CELIX_FRAMEWORK_SERVICE_VERSION, 
serviceVersion);
+    if (opts->serviceVersion != NULL && strncmp("", opts->serviceVersion, 1) 
!= 0) {
+        celix_properties_set(props, CELIX_FRAMEWORK_SERVICE_VERSION, 
opts->serviceVersion);
     }
-    if (serviceName != NULL) {
-        properties_set(properties, CELIX_FRAMEWORK_SERVICE_LANGUAGE, lang == 
NULL ? CELIX_FRAMEWORK_SERVICE_C_LANGUAGE : lang);
-        bundleContext_registerService(ctx, serviceName, svc, properties, &reg);
+    const char *lang = opts->serviceLanguage != NULL && strncmp("", 
opts->serviceLanguage, 1) != 0 ? opts->serviceLanguage : 
CELIX_FRAMEWORK_SERVICE_C_LANGUAGE;
+    celix_properties_set(props, CELIX_FRAMEWORK_SERVICE_LANGUAGE, lang);
+    if (opts->serviceName != NULL && strncmp("", opts->serviceName, 1) != 0) {
+        if (opts->factory != NULL) {
+            reg = celix_framework_registerServiceFactory(ctx->framework, 
ctx->bundle, opts->serviceName, opts->factory, props);
+        } else {
+            bundleContext_registerService(ctx, opts->serviceName, opts->svc, 
props, &reg);
+        }
         svcId = serviceRegistration_getServiceId(reg); //save to call with NULL
     } else {
         framework_logIfError(logger, CELIX_ILLEGAL_ARGUMENT, NULL, "Required 
serviceName argument is NULL");
     }
     if (svcId < 0) {
-        properties_destroy(properties);
+        properties_destroy(props);
     } else {
         celixThreadMutex_lock(&ctx->mutex);
         arrayList_add(ctx->svcRegistrations, reg);
@@ -803,30 +821,6 @@ long 
celix_bundleContext_trackServicesWithOptions(bundle_context_t *ctx, const c
     return trackerId;
 }
 
-long celix_bundleContext_registerServiceFactory(celix_bundle_context_t *ctx, 
const char *serviceName, celix_service_factory_t *factory, const char 
*serviceVersion, celix_properties_t *props) {
-    return celix_bundleContext_registerServiceFactorForLang(ctx, serviceName, 
factory, serviceVersion, NULL, props);
-}
-
-long celix_bundleContext_registerServiceFactorForLang(celix_bundle_context_t 
*ctx, const char *serviceName, celix_service_factory_t *factory, const char 
*serviceVersion, const char *lang, celix_properties_t *props) {
-    if (props == NULL) {
-        props = celix_properties_create();
-    }
-    if (serviceVersion != NULL) {
-        celix_properties_set(props, CELIX_FRAMEWORK_SERVICE_VERSION, 
serviceVersion);
-    }
-    celix_properties_set(props, CELIX_FRAMEWORK_SERVICE_LANGUAGE, lang == NULL 
? CELIX_FRAMEWORK_SERVICE_C_LANGUAGE : lang);
-    service_registration_t *reg = 
celix_framework_registerServiceFactory(ctx->framework, ctx->bundle, 
serviceName, factory, props);
-    long facId = serviceRegistration_getServiceId(reg); //save to call with 
NULL
-    if (facId < 0) {
-        properties_destroy(props);
-    } else {
-        celixThreadMutex_lock(&ctx->mutex);
-        arrayList_add(ctx->svcRegistrations, reg);
-        celixThreadMutex_unlock(&ctx->mutex);
-    }
-    return facId;
-}
-
 long celix_bundleContext_findService(celix_bundle_context_t *ctx, const char 
*serviceName) {
     celix_service_filter_options_t opts = CELIX_EMPTY_SERVICE_FILTER_OPTIONS;
     opts.serviceName = serviceName;

http://git-wip-us.apache.org/repos/asf/celix/blob/3391d88d/framework/tst/bundle_context_services_test.cpp
----------------------------------------------------------------------
diff --git a/framework/tst/bundle_context_services_test.cpp 
b/framework/tst/bundle_context_services_test.cpp
index ec7b92d..9162212 100644
--- a/framework/tst/bundle_context_services_test.cpp
+++ b/framework/tst/bundle_context_services_test.cpp
@@ -70,7 +70,7 @@ TEST(CelixBundleContextServicesTests, registerService) {
         return n * 42;
     };
 
-    long svcId = celix_bundleContext_registerService(ctx, calcName, &svc, 
NULL, NULL);
+    long svcId = celix_bundleContext_registerService(ctx, &svc, calcName, 
NULL);
     CHECK(svcId >= 0);
     celix_bundleContext_unregisterService(ctx, svcId);
 };
@@ -93,13 +93,13 @@ TEST(CelixBundleContextServicesTests, 
registerMultipleAndUseServices) {
         return n * 42;
     };
 
-    long svcId1 = celix_bundleContext_registerService(ctx, calcName, &svc, 
NULL, NULL);
+    long svcId1 = celix_bundleContext_registerService(ctx, &svc, calcName, 
NULL);
     CHECK(svcId1 >= 0);
 
-    long svcId2 = celix_bundleContext_registerService(ctx, calcName, &svc, 
NULL, NULL);
+    long svcId2 = celix_bundleContext_registerService(ctx, &svc, calcName, 
NULL);
     CHECK(svcId2 >= 0);
 
-    long svcId3 = celix_bundleContext_registerService(ctx, calcName, &svc, 
NULL, NULL);
+    long svcId3 = celix_bundleContext_registerService(ctx, &svc, calcName, 
NULL);
     CHECK(svcId3 >= 0);
 
     auto use = [](void *handle, void *svc) {
@@ -140,7 +140,7 @@ TEST(CelixBundleContextServicesTests, 
registerAndUseService) {
         return n * 42;
     };
 
-    long svcId = celix_bundleContext_registerService(ctx, calcName, &svc, 
NULL, NULL);
+    long svcId = celix_bundleContext_registerService(ctx, &svc, calcName, 
NULL);
     CHECK(svcId >= 0);
 
     int result = 0;
@@ -179,7 +179,7 @@ TEST(CelixBundleContextServicesTests, 
registerAndUseWithForcedRaceCondition) {
         return n * 42;
     };
 
-    long svcId = celix_bundleContext_registerService(ctx, calcName, &svc, 
NULL, NULL);
+    long svcId = celix_bundleContext_registerService(ctx, &svc, calcName, 
NULL);
     CHECK(svcId >= 0);
 
     struct sync {
@@ -265,11 +265,11 @@ TEST(CelixBundleContextServicesTests, 
servicesTrackerTest) {
     CHECK(trackerId > 0);
     CHECK_EQUAL(0, count);
 
-    long svcId1 = celix_bundleContext_registerService(ctx, "calc", 
(void*)0x100, NULL, NULL);
+    long svcId1 = celix_bundleContext_registerService(ctx, (void*)0x100, 
"calc", NULL);
     CHECK(svcId1 > 0);
     CHECK_EQUAL(1, count);
 
-    long svcId2 = celix_bundleContext_registerService(ctx, "calc", 
(void*)0x200, NULL, NULL);
+    long svcId2 = celix_bundleContext_registerService(ctx, (void*)0x200, 
"calc", NULL);
     CHECK(svcId2 > 0);
     CHECK_EQUAL(2, count);
 
@@ -318,8 +318,8 @@ TEST(CelixBundleContextServicesTests, 
servicesTrackerTestWithAlreadyRegisteredSe
         *c -= 1;
     };
 
-    long svcId1 = celix_bundleContext_registerService(ctx, "calc", 
(void*)0x010, NULL, NULL);
-    long svcId2 = celix_bundleContext_registerService(ctx, "calc", 
(void*)0x020, NULL, NULL);
+    long svcId1 = celix_bundleContext_registerService(ctx, (void*)0x010, 
"calc", NULL);
+    long svcId2 = celix_bundleContext_registerService(ctx, (void*)0x020, 
"calc", NULL);
 
 
 
@@ -327,11 +327,11 @@ TEST(CelixBundleContextServicesTests, 
servicesTrackerTestWithAlreadyRegisteredSe
     CHECK(trackerId > 0);
     CHECK_EQUAL(2, count);
 
-    long svcId3 = celix_bundleContext_registerService(ctx, "calc", 
(void*)0x100, NULL, NULL);
+    long svcId3 = celix_bundleContext_registerService(ctx, (void*)0x100, 
"calc", NULL);
     CHECK(svcId1 > 0);
     CHECK_EQUAL(3, count);
 
-    long svcId4 = celix_bundleContext_registerService(ctx, "calc", 
(void*)0x200, NULL, NULL);
+    long svcId4 = celix_bundleContext_registerService(ctx, (void*)0x200, 
"calc", NULL);
     CHECK(svcId2 > 0);
     CHECK_EQUAL(4, count);
 
@@ -359,7 +359,7 @@ TEST(CelixBundleContextServicesTests, 
servicesTrackerTestWithProperties) {
         *c -= 1;
     };
 
-    long svcId1 = celix_bundleContext_registerService(ctx, "calc", 
(void*)0x100, NULL, NULL);
+    long svcId1 = celix_bundleContext_registerService(ctx, (void*)0x100, 
"calc", NULL);
 
     celix_service_tracking_options_t opts;
     memset(&opts, 0, sizeof(opts));
@@ -371,7 +371,7 @@ TEST(CelixBundleContextServicesTests, 
servicesTrackerTestWithProperties) {
     CHECK(trackerId > 0);
     CHECK_EQUAL(1, count);
 
-    long svcId2 = celix_bundleContext_registerService(ctx, "calc", 
(void*)0x200, NULL, NULL);
+    long svcId2 = celix_bundleContext_registerService(ctx, (void*)0x200, 
"calc", NULL);
     CHECK(svcId1 > 0);
     CHECK_EQUAL(2, count);
 
@@ -399,7 +399,7 @@ TEST(CelixBundleContextServicesTests, 
servicesTrackerTestWithOwner) {
         *c -= 1;
     };
 
-    long svcId1 = celix_bundleContext_registerService(ctx, "calc", 
(void*)0x100, NULL, NULL);
+    long svcId1 = celix_bundleContext_registerService(ctx, (void*)0x100, 
"calc", NULL);
 
     celix_service_tracking_options_t opts;
     memset(&opts, 0, sizeof(opts));
@@ -411,7 +411,7 @@ TEST(CelixBundleContextServicesTests, 
servicesTrackerTestWithOwner) {
     CHECK(trackerId > 0);
     CHECK_EQUAL(1, count);
 
-    long svcId2 = celix_bundleContext_registerService(ctx, "calc", 
(void*)0x200, NULL, NULL);
+    long svcId2 = celix_bundleContext_registerService(ctx, (void*)0x200, 
"calc", NULL);
     CHECK(svcId1 > 0);
     CHECK_EQUAL(2, count);
 
@@ -479,7 +479,7 @@ TEST(CelixBundleContextServicesTests, 
serviceTrackerWithRaceConditionTest) {
     long trackerId = celix_bundleContext_trackServices(ctx, calcName, &data, 
add, remove);
 
     std::thread registerThread{[&]{
-        long id = celix_bundleContext_registerService(ctx, calcName, &svc, 
NULL, NULL);
+        long id = celix_bundleContext_registerService(ctx, &svc, calcName, 
NULL);
         std::cout << "registered service with id " << id << std::endl;
         std::lock_guard<std::mutex> lock{data.mutex};
         data.svcId = id;
@@ -552,8 +552,8 @@ TEST(CelixBundleContextServicesTests, 
servicesTrackerSetTest) {
         *c = callCount;
     };
 
-    long svcId1 = celix_bundleContext_registerService(ctx, "NA", svc1, NULL, 
NULL);
-    long svcId2 = celix_bundleContext_registerService(ctx, "NA", svc2, NULL, 
NULL);
+    long svcId1 = celix_bundleContext_registerService(ctx, svc1, "NA", NULL);
+    long svcId2 = celix_bundleContext_registerService(ctx, svc2, "NA", NULL);
 
     //starting tracker should lead to first set call
     celix_service_tracking_options_t opts;
@@ -567,12 +567,12 @@ TEST(CelixBundleContextServicesTests, 
servicesTrackerSetTest) {
     //register svc3 should lead to second set call
     properties_t *props3 = celix_properties_create();
     celix_properties_set(props3, OSGI_FRAMEWORK_SERVICE_RANKING, "10");
-    long svcId3 = celix_bundleContext_registerService(ctx, "NA", svc3, NULL, 
props3);
+    long svcId3 = celix_bundleContext_registerService(ctx, svc3, "NA", props3);
 
     //register svc4 should lead to no set (lower ranking)
     properties_t *props4 = celix_properties_create();
     celix_properties_set(props4, OSGI_FRAMEWORK_SERVICE_RANKING, "10");
-    long svcId4 = celix_bundleContext_registerService(ctx, "NA", svc4, NULL, 
props4);
+    long svcId4 = celix_bundleContext_registerService(ctx, svc4, "NA", props4);
 
     //unregister svc3 should lead to set (new highest ranking)
     celix_bundleContext_unregisterService(ctx, svcId3);
@@ -593,8 +593,6 @@ TEST(CelixBundleContextServicesTests, serviceFactoryTest) {
         int (*calc)(int);
     };
     auto name = "CALC";
-    auto version = "1.0.0";
-
 
     int count = 0;
     celix_service_factory_t fac;
@@ -612,7 +610,7 @@ TEST(CelixBundleContextServicesTests, serviceFactoryTest) {
         *c += 1;
     };
 
-    long facId = celix_bundleContext_registerServiceFactory(ctx, name, &fac, 
version, NULL);
+    long facId = celix_bundleContext_registerServiceFactory(ctx, &fac, name, 
NULL);
     CHECK_TRUE(facId >= 0);
 
 
@@ -631,8 +629,8 @@ TEST(CelixBundleContextServicesTests, serviceFactoryTest) {
 }
 
 TEST(CelixBundleContextServicesTests, findServicesTest) {
-    long svcId1 = celix_bundleContext_registerService(ctx, "example", 
(void*)0x100, NULL, NULL);
-    long svcId2 = celix_bundleContext_registerService(ctx, "example", 
(void*)0x100, NULL, NULL);
+    long svcId1 = celix_bundleContext_registerService(ctx, (void*)0x100, 
"example", NULL);
+    long svcId2 = celix_bundleContext_registerService(ctx, (void*)0x100, 
"example", NULL);
 
     long foundId = celix_bundleContext_findService(ctx, "non existing service 
name");
     CHECK_EQUAL(-1L, foundId);

http://git-wip-us.apache.org/repos/asf/celix/blob/3391d88d/shell/src/activator.c
----------------------------------------------------------------------
diff --git a/shell/src/activator.c b/shell/src/activator.c
index b5b8e6e..16923cf 100644
--- a/shell/src/activator.c
+++ b/shell/src/activator.c
@@ -211,12 +211,12 @@ celix_status_t bundleActivator_start(void *_ptr, 
bundle_context_pt context_ptr)
 
     if (status == CELIX_SUCCESS) {
         for (unsigned int i = 0; instance_ptr->std_commands[i].exec != NULL; 
i++) {
-            instance_ptr->std_commands[i].svcId = 
celix_bundleContext_registerService(
-                    context_ptr,
-                    OSGI_SHELL_COMMAND_SERVICE_NAME,
-                    instance_ptr->std_commands[i].service,
-                    OSGI_SHELL_COMMAND_SERVICE_VERSION,
-                    instance_ptr->std_commands[i].props);
+            celix_service_registration_options_t opts = 
CELIX_EMPTY_SERVICE_REGISTRATION_OPTIONS;
+            opts.svc = instance_ptr->std_commands[i].service;
+            opts.serviceName = OSGI_SHELL_COMMAND_SERVICE_NAME;
+            opts.serviceVersion = OSGI_SHELL_COMMAND_SERVICE_VERSION;
+            opts.properties = instance_ptr->std_commands[i].props;
+            instance_ptr->std_commands[i].svcId = 
celix_bundleContext_registerServiceWithOptions(context_ptr, &opts);
         }
        }
 

Reply via email to