http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_common/src/import_registration_impl.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_common/src/import_registration_impl.c 
b/remote_services/remote_service_admin_common/src/import_registration_impl.c
deleted file mode 100644
index 9a84327..0000000
--- a/remote_services/remote_service_admin_common/src/import_registration_impl.c
+++ /dev/null
@@ -1,274 +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.
- */
-/*
- * import_registration_impl.c
- *
- *  \date       Oct 14, 2011
- *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
- *  \copyright Apache License, Version 2.0
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <constants.h>
-
-#include "celix_errno.h"
-
-#include "import_registration_impl.h"
-#include "remote_service_admin_impl.h"
-
-struct import_reference {
-       endpoint_description_pt endpoint;
-       service_reference_pt reference;
-};
-
-
-
-celix_status_t importRegistration_proxyFactoryAdding(void * handle, 
service_reference_pt reference, void **service);
-celix_status_t importRegistration_proxyFactoryAdded(void * handle, 
service_reference_pt reference, void *service);
-celix_status_t importRegistration_proxyFactoryModified(void * handle, 
service_reference_pt reference, void *service);
-celix_status_t importRegistration_proxyFactoryRemoved(void * handle, 
service_reference_pt reference, void *service);
-
-celix_status_t importRegistration_create(endpoint_description_pt endpoint, 
remote_service_admin_pt rsa, sendToHandle sendToCallback, bundle_context_pt 
context, import_registration_pt *registration) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       *registration = calloc(1, sizeof(**registration));
-       if (!*registration) {
-               status = CELIX_ENOMEM;
-       } else {
-               (*registration)->context = context;
-               (*registration)->closed = false;
-               (*registration)->endpointDescription = endpoint;
-               (*registration)->rsa = rsa;
-               (*registration)->sendToCallback = sendToCallback;
-               (*registration)->reference = NULL;
-               (*registration)->importReference = NULL;
-       }
-
-       return status;
-}
-
-celix_status_t importRegistration_destroy(import_registration_pt registration)
-{
-       free(registration);
-
-       return CELIX_SUCCESS;
-}
-
-
-celix_status_t importRegistrationFactory_create(log_helper_pt helper, char* 
serviceName, bundle_context_pt context, import_registration_factory_pt 
*registration_factory) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       *registration_factory = calloc(1, sizeof(**registration_factory));
-       if (!*registration_factory) {
-               status = CELIX_ENOMEM;
-       } else {
-               (*registration_factory)->serviceName = strdup(serviceName);
-               (*registration_factory)->context = context;
-               (*registration_factory)->bundle = NULL;
-               (*registration_factory)->loghelper = helper;
-
-               arrayList_create(&(*registration_factory)->registrations);
-       }
-
-       return status;
-}
-
-
-
-celix_status_t 
importRegistrationFactory_destroy(import_registration_factory_pt* 
registration_factory) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       if (*registration_factory != NULL)
-       {
-               free((*registration_factory)->serviceName);
-               arrayList_destroy((*registration_factory)->registrations);
-
-               
serviceTracker_destroy((*registration_factory)->proxyFactoryTracker);
-               free(*registration_factory);
-
-               *registration_factory = NULL;
-       }
-
-
-       return status;
-}
-
-
-celix_status_t importRegistrationFactory_open(import_registration_factory_pt 
registration_factory)
-{
-       celix_status_t status;
-
-       const char *bundleStore = NULL;
-       bundleContext_getProperty(registration_factory->context, 
BUNDLE_STORE_PROPERTY_NAME, &bundleStore);
-
-       if (bundleStore == NULL) {
-               bundleStore = DEFAULT_BUNDLE_STORE;
-       }
-
-       char name[256];
-       snprintf(name, 256, "%s/%s_proxy.zip", bundleStore, 
registration_factory->serviceName);
-
-       status = bundleContext_installBundle(registration_factory->context, 
name, &registration_factory->bundle);
-
-       if (status == CELIX_SUCCESS) {
-               status = bundle_start(registration_factory->bundle);
-               if (status == CELIX_SUCCESS) {
-                       logHelper_log(registration_factory->loghelper, 
OSGI_LOGSERVICE_INFO, "%s successfully started.", name);
-               }
-       }
-       else {
-               logHelper_log(registration_factory->loghelper, 
OSGI_LOGSERVICE_ERROR, "%s could not be installed.", name);
-       }
-
-       return status;
-}
-
-celix_status_t importRegistrationFactory_close(import_registration_factory_pt 
registration_factory)
-{
-       celix_status_t status = CELIX_SUCCESS;
-
-
-       if (registration_factory->proxyFactoryTracker != NULL) {
-               serviceTracker_close(registration_factory->proxyFactoryTracker);
-       }
-
-       if (registration_factory->bundle != NULL) {
-               bundle_uninstall(registration_factory->bundle);
-       }
-
-       return status;
-}
-
-
-celix_status_t 
importRegistration_createProxyFactoryTracker(import_registration_factory_pt 
registration_factory, service_tracker_pt *tracker) {
-       celix_status_t status;
-       service_tracker_customizer_pt customizer = NULL;
-
-       status = serviceTrackerCustomizer_create(registration_factory, 
importRegistration_proxyFactoryAdding, importRegistration_proxyFactoryAdded, 
importRegistration_proxyFactoryModified, 
importRegistration_proxyFactoryRemoved, &customizer);
-
-       if (status == CELIX_SUCCESS) {
-               char filter[512];
-
-               snprintf(filter, 512, "(&(%s=%s)(proxy.interface=%s))", (char*) 
OSGI_FRAMEWORK_OBJECTCLASS, (char*) OSGI_RSA_REMOTE_PROXY_FACTORY, 
registration_factory->serviceName);
-               status = 
serviceTracker_createWithFilter(registration_factory->context, filter, 
customizer, tracker);
-
-               if (status == CELIX_SUCCESS)
-               {
-                       serviceTracker_open(*tracker);
-               }
-       }
-
-       return status;
-}
-
-celix_status_t importRegistration_proxyFactoryAdding(void * handle, 
service_reference_pt reference, void **service) {
-       celix_status_t status = CELIX_SUCCESS;
-       import_registration_factory_pt registration_factory = 
(import_registration_factory_pt) handle;
-
-       bundleContext_getService(registration_factory->context, reference, 
service);
-
-       return status;
-}
-
-celix_status_t importRegistration_proxyFactoryAdded(void * handle, 
service_reference_pt reference, void *service) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       import_registration_factory_pt registration_factory = 
(import_registration_factory_pt) handle;
-       registration_factory->trackedFactory = 
(remote_proxy_factory_service_pt) service;
-
-       return status;
-}
-
-celix_status_t importRegistration_proxyFactoryModified(void * handle, 
service_reference_pt reference, void *service) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       return status;
-}
-
-celix_status_t importRegistration_proxyFactoryRemoved(void * handle, 
service_reference_pt reference, void *service) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       import_registration_factory_pt registration_factory = 
(import_registration_factory_pt) handle;
-       registration_factory->trackedFactory = NULL;
-
-       return status;
-}
-
-
-
-celix_status_t importRegistrationFactory_install(log_helper_pt helper, char* 
serviceName, bundle_context_pt context, import_registration_factory_pt 
*registration_factory)
-{
-       celix_status_t status;
-
-       if ( (status = importRegistrationFactory_create(helper, serviceName, 
context, registration_factory)) == CELIX_SUCCESS) {
-               // starting the proxy tracker first allows us to pick up 
already available proxy factories
-               
importRegistration_createProxyFactoryTracker(*registration_factory, 
&((*registration_factory)->proxyFactoryTracker));
-               logHelper_log((*registration_factory)->loghelper, 
OSGI_LOGSERVICE_INFO, "remoteServiceAdmin_importService: new 
registration_factory added for %s at %p", serviceName, 
(*registration_factory)->proxyFactoryTracker);
-
-               // check whether factory is available
-               if (((*registration_factory)->trackedFactory == NULL) && 
((status = importRegistrationFactory_open(*registration_factory)) != 
CELIX_SUCCESS)) {
-                       logHelper_log((*registration_factory)->loghelper, 
OSGI_LOGSERVICE_ERROR, "remoteServiceAdmin_importService: cannot open 
registration_factory for %s.", serviceName);
-
-                       importRegistrationFactory_close(*registration_factory);
-                       importRegistrationFactory_destroy(registration_factory);
-               }
-       }
-
-       return status;
-}
-
-
-
-
-celix_status_t importRegistration_getException(import_registration_pt 
registration) {
-       celix_status_t status = CELIX_SUCCESS;
-       return status;
-}
-
-
-celix_status_t importRegistration_getImportReference(import_registration_pt 
registration, import_reference_pt *reference) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       if (registration->importReference == NULL) {
-               registration->importReference = calloc(1, 
sizeof(*registration->importReference));
-               if (registration->importReference == NULL) {
-                       status = CELIX_ENOMEM;
-               } else {
-                       registration->importReference->endpoint = 
registration->endpointDescription;
-                       registration->importReference->reference = 
registration->reference;
-               }
-       }
-
-       *reference = registration->importReference;
-
-       return status;
-}
-
-
-celix_status_t importReference_getImportedEndpoint(import_reference_pt 
reference) {
-       celix_status_t status = CELIX_SUCCESS;
-       return status;
-}
-
-celix_status_t importReference_getImportedService(import_reference_pt 
reference) {
-       celix_status_t status = CELIX_SUCCESS;
-       return status;
-}

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_common/src/import_registration_impl.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_common/src/import_registration_impl.h 
b/remote_services/remote_service_admin_common/src/import_registration_impl.h
deleted file mode 100644
index 7aa397f..0000000
--- a/remote_services/remote_service_admin_common/src/import_registration_impl.h
+++ /dev/null
@@ -1,81 +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.
- */
-/*
- * import_registration_impl.h
- *
- *  \date       Oct 14, 2011
- *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
- *  \copyright Apache License, Version 2.0
- */
-
-#ifndef IMPORT_REGISTRATION_IMPL_H_
-#define IMPORT_REGISTRATION_IMPL_H_
-
-#include "remote_service_admin.h"
-#include "remote_proxy.h"
-#include "service_tracker.h"
-#include "log_helper.h"
-
-struct import_registration {
-       bundle_context_pt context;
-       endpoint_description_pt endpointDescription;
-
-       service_reference_pt reference;
-       import_reference_pt importReference;
-
-       remote_service_admin_pt rsa;
-       sendToHandle sendToCallback;
-
-       bool closed;
-};
-
-
-
-struct import_registration_factory
-{
-       char* serviceName;
-       log_helper_pt loghelper;
-       remote_proxy_factory_service_pt trackedFactory;
-       service_tracker_pt proxyFactoryTracker;
-       bundle_context_pt context;
-       array_list_pt registrations;
-       bundle_pt bundle;
-};
-
-
-celix_status_t importRegistration_create(endpoint_description_pt endpoint, 
remote_service_admin_pt rsa, sendToHandle callback, bundle_context_pt context, 
import_registration_pt *registration);
-celix_status_t importRegistration_destroy(import_registration_pt registration);
-
-celix_status_t 
importRegistration_setEndpointDescription(import_registration_pt registration, 
endpoint_description_pt endpointDescription);
-celix_status_t importRegistration_setHandler(import_registration_pt 
registration, void * handler);
-celix_status_t importRegistration_setCallback(import_registration_pt 
registration, sendToHandle callback);
-
-celix_status_t importRegistration_getException(import_registration_pt 
registration);
-celix_status_t importRegistration_getImportReference(import_registration_pt 
registration, import_reference_pt *reference);
-
-celix_status_t 
importRegistration_createProxyFactoryTracker(import_registration_factory_pt 
registration_factory, service_tracker_pt *tracker);
-
-celix_status_t 
importRegistrationFactory_destroy(import_registration_factory_pt* 
registration_factory);
-//celix_status_t importRegistrationFactory_open(import_registration_factory_pt 
registration_factory);
-celix_status_t importRegistrationFactory_close(import_registration_factory_pt 
registration_factory);
-celix_status_t importRegistrationFactory_install(log_helper_pt helper, char* 
serviceName, bundle_context_pt context, import_registration_factory_pt 
*registration_factory);
-
-
-
-#endif /* IMPORT_REGISTRATION_IMPL_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_common/src/remote_proxy_factory_impl.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_common/src/remote_proxy_factory_impl.c 
b/remote_services/remote_service_admin_common/src/remote_proxy_factory_impl.c
deleted file mode 100644
index 9f996d6..0000000
--- 
a/remote_services/remote_service_admin_common/src/remote_proxy_factory_impl.c
+++ /dev/null
@@ -1,252 +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.
- */
-
-/*
- * remote_proxy_factory_impl.c
- *
- *  \date       22 Dec 2014
- *  \author     <a href="mailto:[email protected]";>Apache Celix Project 
Team</a>
- *  \copyright  Apache License, Version 2.0
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "remote_proxy.h"
-
-typedef struct proxy_instance {
-       service_registration_pt registration_ptr;
-       void *service;
-       properties_pt properties;
-} *proxy_instance_pt;
-
-static celix_status_t 
remoteProxyFactory_registerProxyService(remote_proxy_factory_pt 
remote_proxy_factory_ptr, endpoint_description_pt endpointDescription, 
remote_service_admin_pt rsa, sendToHandle sendToCallback);
-static celix_status_t 
remoteProxyFactory_unregisterProxyService(remote_proxy_factory_pt 
remote_proxy_factory_ptr, endpoint_description_pt endpointDescription);
-
-celix_status_t remoteProxyFactory_create(bundle_context_pt context, char 
*service, void *handle,
-               createProxyService create, destroyProxyService destroy,
-               remote_proxy_factory_pt *remote_proxy_factory_ptr) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       *remote_proxy_factory_ptr = calloc(1, 
sizeof(**remote_proxy_factory_ptr));
-       if (!*remote_proxy_factory_ptr) {
-               status = CELIX_ENOMEM;
-       }
-
-       if (status == CELIX_SUCCESS) {
-               (*remote_proxy_factory_ptr)->context_ptr = context;
-               (*remote_proxy_factory_ptr)->service = strdup(service);
-
-               (*remote_proxy_factory_ptr)->remote_proxy_factory_service_ptr = 
NULL;
-               (*remote_proxy_factory_ptr)->properties = NULL;
-               (*remote_proxy_factory_ptr)->registration = NULL;
-
-               (*remote_proxy_factory_ptr)->proxy_instances = 
hashMap_create(NULL, NULL, NULL, NULL);
-
-               (*remote_proxy_factory_ptr)->handle = handle;
-
-               (*remote_proxy_factory_ptr)->create_proxy_service_ptr = create;
-               (*remote_proxy_factory_ptr)->destroy_proxy_service_ptr = 
destroy;
-       }
-
-       return status;
-}
-
-celix_status_t remoteProxyFactory_destroy(remote_proxy_factory_pt 
*remote_proxy_factory_ptr) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       if (!*remote_proxy_factory_ptr) {
-               status = CELIX_ILLEGAL_ARGUMENT;
-       }
-
-       if (status == CELIX_SUCCESS) {
-               if ((*remote_proxy_factory_ptr)->proxy_instances) {
-                       
hashMap_destroy((*remote_proxy_factory_ptr)->proxy_instances, false, false);
-                       (*remote_proxy_factory_ptr)->proxy_instances = NULL;
-               }
-               if ((*remote_proxy_factory_ptr)->service) {
-                       free((*remote_proxy_factory_ptr)->service);
-                       (*remote_proxy_factory_ptr)->service = NULL;
-               }
-               free(*remote_proxy_factory_ptr);
-               *remote_proxy_factory_ptr = NULL;
-       }
-
-       return status;
-}
-
-celix_status_t remoteProxyFactory_register(remote_proxy_factory_pt 
remote_proxy_factory_ptr) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       remote_proxy_factory_ptr->remote_proxy_factory_service_ptr = calloc(1, 
sizeof(*remote_proxy_factory_ptr->remote_proxy_factory_service_ptr));
-       if (!remote_proxy_factory_ptr->remote_proxy_factory_service_ptr) {
-               status = CELIX_ENOMEM;
-       }
-
-       if (status == CELIX_SUCCESS) {
-               
remote_proxy_factory_ptr->remote_proxy_factory_service_ptr->factory = 
remote_proxy_factory_ptr;
-               
remote_proxy_factory_ptr->remote_proxy_factory_service_ptr->registerProxyService
 = remoteProxyFactory_registerProxyService;
-               
remote_proxy_factory_ptr->remote_proxy_factory_service_ptr->unregisterProxyService
 = remoteProxyFactory_unregisterProxyService;
-
-               remote_proxy_factory_ptr->properties = properties_create();
-               if (!remote_proxy_factory_ptr->properties) {
-                       status = CELIX_BUNDLE_EXCEPTION;
-               } else {
-                       properties_set(remote_proxy_factory_ptr->properties, 
"proxy.interface", remote_proxy_factory_ptr->service);
-               }
-       }
-
-       if (status == CELIX_SUCCESS) {
-               status = 
bundleContext_registerService(remote_proxy_factory_ptr->context_ptr, 
OSGI_RSA_REMOTE_PROXY_FACTORY,
-                               
remote_proxy_factory_ptr->remote_proxy_factory_service_ptr, 
remote_proxy_factory_ptr->properties, &remote_proxy_factory_ptr->registration);
-       }
-
-       return status;
-}
-
-celix_status_t remoteProxyFactory_unregister(remote_proxy_factory_pt 
remote_proxy_factory_ptr) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       if (!remote_proxy_factory_ptr) {
-               status = CELIX_ILLEGAL_ARGUMENT;
-       }
-
-       // #TODO Remove proxy registrations
-       if (status == CELIX_SUCCESS) {
-
-               hash_map_iterator_pt iter = 
hashMapIterator_create(remote_proxy_factory_ptr->proxy_instances);
-               while(hashMapIterator_hasNext(iter)){
-                       proxy_instance_pt proxy_instance_ptr = 
(proxy_instance_pt)hashMapIterator_nextValue(iter);
-
-                       if (proxy_instance_ptr->service) {
-                               
remote_proxy_factory_ptr->destroy_proxy_service_ptr(remote_proxy_factory_ptr->handle,
 proxy_instance_ptr->service);
-                       }
-                       free(proxy_instance_ptr);
-               }
-               hashMapIterator_destroy(iter);
-
-               if (remote_proxy_factory_ptr->registration) {
-                       status = 
serviceRegistration_unregister(remote_proxy_factory_ptr->registration);
-                       remote_proxy_factory_ptr->properties = NULL;
-               }
-               if (remote_proxy_factory_ptr->properties) {
-                       
properties_destroy(remote_proxy_factory_ptr->properties);
-               }
-               if (remote_proxy_factory_ptr->remote_proxy_factory_service_ptr) 
{
-                       
free(remote_proxy_factory_ptr->remote_proxy_factory_service_ptr);
-               }
-       }
-
-       return status;
-}
-
-
-static celix_status_t 
remoteProxyFactory_registerProxyService(remote_proxy_factory_pt 
remote_proxy_factory_ptr, endpoint_description_pt endpointDescription, 
remote_service_admin_pt rsa, sendToHandle sendToCallback) {
-       celix_status_t status = CELIX_SUCCESS;
-       proxy_instance_pt proxy_instance_ptr = NULL;
-
-       if (!remote_proxy_factory_ptr || 
!remote_proxy_factory_ptr->create_proxy_service_ptr) {
-               status = CELIX_ILLEGAL_ARGUMENT;
-       }
-
-       if (status == CELIX_SUCCESS) {
-               proxy_instance_ptr = calloc(1, sizeof(*proxy_instance_ptr));
-               if (!proxy_instance_ptr) {
-                       status = CELIX_ENOMEM;
-               }
-       }
-
-       if (status == CELIX_SUCCESS) {
-               proxy_instance_ptr->properties = properties_create();
-               if (!proxy_instance_ptr->properties) {
-                       status = CELIX_ENOMEM;
-               }
-       }
-
-       if (status == CELIX_SUCCESS) {
-               status = 
remote_proxy_factory_ptr->create_proxy_service_ptr(remote_proxy_factory_ptr->handle,
 endpointDescription, rsa, sendToCallback, proxy_instance_ptr->properties, 
&proxy_instance_ptr->service);
-       }
-
-       if (status == CELIX_SUCCESS) {
-               properties_set(proxy_instance_ptr->properties, 
"proxy.interface", remote_proxy_factory_ptr->service);
-
-               hash_map_iterator_pt iter = 
hashMapIterator_create(endpointDescription->properties);
-               while (hashMapIterator_hasNext(iter)) {
-                       hash_map_entry_pt entry = 
hashMapIterator_nextEntry(iter);
-                       char *key = hashMapEntry_getKey(entry);
-                       char *value = hashMapEntry_getValue(entry);
-
-                       properties_set(proxy_instance_ptr->properties, key, 
value);
-               }
-               hashMapIterator_destroy(iter);
-       }
-
-       if (status == CELIX_SUCCESS) {
-               status = 
bundleContext_registerService(remote_proxy_factory_ptr->context_ptr, 
remote_proxy_factory_ptr->service, proxy_instance_ptr->service, 
proxy_instance_ptr->properties, &proxy_instance_ptr->registration_ptr);
-       }
-
-       if (status == CELIX_SUCCESS) {
-               hashMap_put(remote_proxy_factory_ptr->proxy_instances, 
endpointDescription, proxy_instance_ptr);
-       }
-
-       if(status!=CELIX_SUCCESS){
-               if(proxy_instance_ptr != NULL){
-                       if(proxy_instance_ptr->properties != NULL){
-                               
properties_destroy(proxy_instance_ptr->properties);
-                       }
-                       free(proxy_instance_ptr);
-               }
-       }
-
-       return status;
-}
-
-static celix_status_t 
remoteProxyFactory_unregisterProxyService(remote_proxy_factory_pt 
remote_proxy_factory_ptr, endpoint_description_pt endpointDescription) {
-       celix_status_t status = CELIX_SUCCESS;
-       proxy_instance_pt proxy_instance_ptr = NULL;
-
-       if (!remote_proxy_factory_ptr || !endpointDescription || 
!remote_proxy_factory_ptr->proxy_instances || 
!remote_proxy_factory_ptr->handle) {
-               status = CELIX_ILLEGAL_ARGUMENT;
-       }
-
-       if (status == CELIX_SUCCESS) {
-               proxy_instance_ptr = 
hashMap_remove(remote_proxy_factory_ptr->proxy_instances, endpointDescription);
-               if (proxy_instance_ptr == NULL) {
-                       status = CELIX_BUNDLE_EXCEPTION;
-               }
-       }
-
-       if (status == CELIX_SUCCESS) {
-               if (proxy_instance_ptr->registration_ptr) {
-                       status = 
serviceRegistration_unregister(proxy_instance_ptr->registration_ptr);
-                       proxy_instance_ptr->properties = NULL;
-               }
-               if (proxy_instance_ptr->service) {
-                       status = 
remote_proxy_factory_ptr->destroy_proxy_service_ptr(remote_proxy_factory_ptr->handle,
 proxy_instance_ptr->service);
-               }
-               if (proxy_instance_ptr->properties) {
-                       properties_destroy(proxy_instance_ptr->properties);
-               }
-        free(proxy_instance_ptr);
-       }
-
-       return status;
-}
-
-

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_common/src/remote_service_admin_impl.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_common/src/remote_service_admin_impl.h 
b/remote_services/remote_service_admin_common/src/remote_service_admin_impl.h
deleted file mode 100644
index e8a5e1f..0000000
--- 
a/remote_services/remote_service_admin_common/src/remote_service_admin_impl.h
+++ /dev/null
@@ -1,49 +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.
- */
-/*
- * remote_service_admin_impl.h
- *
- *  \date       Dec 5, 2013
- *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
- *  \copyright Apache License, Version 2.0
- */
-
-#ifndef REMOTE_SERVICE_ADMIN_IMPL_H_
-#define REMOTE_SERVICE_ADMIN_IMPL_H_
-
-#include "remote_service_admin.h"
-
-#define BUNDLE_STORE_PROPERTY_NAME "ENDPOINTS"
-#define DEFAULT_BUNDLE_STORE "endpoints"
-
-celix_status_t remoteServiceAdmin_create(bundle_context_pt context, 
remote_service_admin_pt *admin);
-celix_status_t remoteServiceAdmin_destroy(remote_service_admin_pt *admin);
-
-celix_status_t remoteServiceAdmin_send(remote_service_admin_pt rsa, 
endpoint_description_pt endpointDescription, char *methodSignature, char 
**reply, int* replyStatus);
-
-celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, 
char *serviceId, properties_pt properties, array_list_pt *registrations);
-celix_status_t 
remoteServiceAdmin_removeExportedService(remote_service_admin_pt admin, 
export_registration_pt registration);
-celix_status_t remoteServiceAdmin_getExportedServices(remote_service_admin_pt 
admin, array_list_pt *services);
-celix_status_t remoteServiceAdmin_getImportedEndpoints(remote_service_admin_pt 
admin, array_list_pt *services);
-celix_status_t remoteServiceAdmin_importService(remote_service_admin_pt admin, 
endpoint_description_pt endpoint, import_registration_pt *registration);
-celix_status_t 
remoteServiceAdmin_removeImportedService(remote_service_admin_pt admin, 
import_registration_pt registration);
-
-celix_status_t 
remoteServiceAdmin_destroyEndpointDescription(endpoint_description_pt 
*description);
-
-#endif /* REMOTE_SERVICE_ADMIN_IMPL_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_services_api/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/remote_services_api/CMakeLists.txt 
b/remote_services/remote_services_api/CMakeLists.txt
new file mode 100644
index 0000000..67656d3
--- /dev/null
+++ b/remote_services/remote_services_api/CMakeLists.txt
@@ -0,0 +1,28 @@
+# 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.
+
+add_library(celix_remote_services_api INTERFACE)
+target_include_directories(celix_remote_services_api INTERFACE
+    $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
+    $<INSTALL_INTERFACE:include/celix/remote_services>
+)
+
+install(TARGETS celix_remote_services_api EXPORT celix DESTINATION 
${CMAKE_INSTALL_LIBDIR} COMPONENT rsa)
+install(DIRECTORY include/ DESTINATION include/celix/remote_services COMPONENT 
rsa)
+
+#Setup target aliases to match external usage
+add_library(Celix::remote_services_api ALIAS celix_remote_services_api)

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_services_api/README.md
----------------------------------------------------------------------
diff --git a/remote_services/remote_services_api/README.md 
b/remote_services/remote_services_api/README.md
new file mode 100644
index 0000000..2e3d268
--- /dev/null
+++ b/remote_services/remote_services_api/README.md
@@ -0,0 +1,11 @@
+# Remote Service Admin
+
+The Remote Service Admin (RSA) provides the mechanisms to import and export 
services when instructed to do so by the Topology Manager. 
+
+To delegate method calls to the actual service implementation, the RSA_SHM and 
the RSA_HTTP are using "endpoint/proxy" bundles, which has all the knowledge 
about the marshalling and unmarshalling of data for the service. The RSA_DFI 
implementation combines a [foreign function 
interface](https://en.wikipedia.org/wiki/Foreign_function_interface) technique 
together with manualy created descriptors.  
+
+Note that this folder contains code commonly used by the RSA implementations 
and therefore does not include any CMAKE configuration.
+
+## Properties
+    ENDPOINTS                           defines the relative directory where 
endpoints and proxys can be found (default: endpoints)
+    CELIX_FRAMEWORK_EXTENDER_PATH  Used in RSA_DFI only. Can be used to define 
a path to use as an extender path point for the framework bundle. For normal 
bundles the bundle cache is used. 

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_services_api/include/remote_constants.h
----------------------------------------------------------------------
diff --git a/remote_services/remote_services_api/include/remote_constants.h 
b/remote_services/remote_services_api/include/remote_constants.h
new file mode 100644
index 0000000..277f837
--- /dev/null
+++ b/remote_services/remote_services_api/include/remote_constants.h
@@ -0,0 +1,31 @@
+/**
+ *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.
+ */
+
+#ifndef REMOTE_CONSTANTS_H_
+#define REMOTE_CONSTANTS_H_
+
+static const char * const OSGI_RSA_SERVICE_EXPORTED_INTERFACES = 
"service.exported.interfaces";
+static const char * const OSGI_RSA_ENDPOINT_FRAMEWORK_UUID = 
"endpoint.framework.uuid";
+static const char * const OSGI_RSA_ENDPOINT_SERVICE_ID = "endpoint.service.id";
+static const char * const OSGI_RSA_ENDPOINT_ID = "endpoint.id";
+static const char * const OSGI_RSA_SERVICE_IMPORTED = "service.imported";
+static const char * const OSGI_RSA_SERVICE_IMPORTED_CONFIGS = 
"service.imported.configs";
+static const char * const OSGI_RSA_SERVICE_LOCATION = "service.location";
+
+#endif /* REMOTE_CONSTANTS_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/rsa_common/CMakeLists.txt 
b/remote_services/rsa_common/CMakeLists.txt
new file mode 100644
index 0000000..27c2dba
--- /dev/null
+++ b/remote_services/rsa_common/CMakeLists.txt
@@ -0,0 +1,29 @@
+# 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.
+
+add_library(celix_rsa_common STATIC
+    src/endpoint_description.c
+    src/export_registration_impl.c
+    src/import_registration_impl.c
+)
+target_include_directories(celix_rsa_common PRIVATE src)
+target_link_libraries(celix_rsa_common PUBLIC Celix::framework Celix::rsa_spi 
Celix::log_helper)
+
+install(TARGETS celix_rsa_common EXPORT celix COMPONENT rsa DESTINATION 
${CMAKE_INSTALL_LIBDIR})
+
+#Setup target aliases to match external usage
+add_library(Celix::rsa_common ALIAS celix_rsa_common)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/src/endpoint_description.c
----------------------------------------------------------------------
diff --git a/remote_services/rsa_common/src/endpoint_description.c 
b/remote_services/rsa_common/src/endpoint_description.c
new file mode 100644
index 0000000..0d8b684
--- /dev/null
+++ b/remote_services/rsa_common/src/endpoint_description.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.
+ */
+/*
+ * endpoint_description.c
+ *
+ *  \date       25 Jul 2014
+ *  \author     <a href="mailto:[email protected]";>Apache Celix Project 
Team</a>
+ *  \copyright  Apache License, Version 2.0
+ */
+#include <stdlib.h>
+#include <string.h>
+
+#include "celix_errno.h"
+#include "celix_log.h"
+
+#include "endpoint_description.h"
+#include "remote_constants.h"
+#include "constants.h"
+
+static celix_status_t endpointDescription_verifyLongProperty(properties_pt 
properties, char *propertyName, unsigned long *longProperty);
+
+celix_status_t endpointDescription_create(properties_pt properties, 
endpoint_description_pt *endpointDescription) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       unsigned long serviceId = 0UL;
+       status = endpointDescription_verifyLongProperty(properties, (char *) 
OSGI_RSA_ENDPOINT_SERVICE_ID, &serviceId);
+       if (status != CELIX_SUCCESS) {
+               return status;
+       }
+
+       endpoint_description_pt ep = calloc(1,sizeof(*ep));
+
+    ep->properties = properties;
+    ep->frameworkUUID = (char*)properties_get(properties, 
OSGI_RSA_ENDPOINT_FRAMEWORK_UUID);
+    ep->id = (char*)properties_get(properties, OSGI_RSA_ENDPOINT_ID);
+    ep->service = strndup(properties_get(properties, 
OSGI_FRAMEWORK_OBJECTCLASS), 1024*10);
+    ep->serviceId = serviceId;
+
+    if (!(ep->frameworkUUID) || !(ep->id) || !(ep->service) ) {
+       fw_log(logger, OSGI_FRAMEWORK_LOG_ERROR, "ENDPOINT_DESCRIPTION: 
incomplete description!.");
+       status = CELIX_BUNDLE_EXCEPTION;
+    }
+
+    if(status == CELIX_SUCCESS){
+       *endpointDescription = ep;
+    }
+    else{
+       *endpointDescription = NULL;
+       free(ep);
+    }
+
+    return status;
+}
+
+celix_status_t endpointDescription_destroy(endpoint_description_pt 
description) {
+    properties_destroy(description->properties);
+    free(description->service);
+    free(description);
+    return CELIX_SUCCESS;
+}
+
+static celix_status_t endpointDescription_verifyLongProperty(properties_pt 
properties, char *propertyName, unsigned long *longProperty) {
+    celix_status_t status = CELIX_SUCCESS;
+
+    const char *value = properties_get(properties, propertyName);
+    if (value == NULL) {
+        *longProperty = 0UL;
+    } else {
+        *longProperty = strtoul(value,NULL,10);
+    }
+
+    return status;
+}

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/src/export_registration_impl.c
----------------------------------------------------------------------
diff --git a/remote_services/rsa_common/src/export_registration_impl.c 
b/remote_services/rsa_common/src/export_registration_impl.c
new file mode 100644
index 0000000..1c684e7
--- /dev/null
+++ b/remote_services/rsa_common/src/export_registration_impl.c
@@ -0,0 +1,257 @@
+/**
+ *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.
+ */
+/*
+ * export_registration_impl.c
+ *
+ *  \date       Oct 6, 2011
+ *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
+ *  \copyright Apache License, Version 2.0
+ */
+#include <stdlib.h>
+
+#include "constants.h"
+
+#include "celix_errno.h"
+
+#include "export_registration_impl.h"
+#include "remote_service_admin_impl.h"
+
+
+struct export_reference {
+       endpoint_description_pt endpoint;
+       service_reference_pt reference;
+};
+
+celix_status_t exportRegistration_endpointAdding(void * handle, 
service_reference_pt reference, void **service);
+celix_status_t exportRegistration_endpointAdded(void * handle, 
service_reference_pt reference, void *service);
+celix_status_t exportRegistration_endpointModified(void * handle, 
service_reference_pt reference, void *service);
+celix_status_t exportRegistration_endpointRemoved(void * handle, 
service_reference_pt reference, void *service);
+
+celix_status_t exportRegistration_createEndpointTracker(export_registration_pt 
registration, service_tracker_pt *tracker);
+
+celix_status_t exportRegistration_create(log_helper_pt helper, 
service_reference_pt reference, endpoint_description_pt endpoint, 
remote_service_admin_pt rsa, bundle_context_pt context, export_registration_pt 
*registration) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       *registration = calloc(1, sizeof(**registration));
+       if (!*registration) {
+               status = CELIX_ENOMEM;
+       } else {
+               (*registration)->context = context;
+               (*registration)->closed = false;
+               (*registration)->endpointDescription = endpoint;
+               (*registration)->reference = reference;
+               (*registration)->rsa = rsa;
+               (*registration)->tracker = NULL;
+               (*registration)->endpoint = NULL;
+               (*registration)->endpointTracker = NULL;
+               (*registration)->exportReference = NULL;
+               (*registration)->bundle = NULL;
+               (*registration)->loghelper = helper;
+       }
+
+       return status;
+}
+
+celix_status_t exportRegistration_destroy(export_registration_pt 
*registration) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       
remoteServiceAdmin_destroyEndpointDescription(&(*registration)->endpointDescription);
+       free(*registration);
+
+       return status;
+}
+
+celix_status_t exportRegistration_startTracking(export_registration_pt 
registration) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       if (registration->endpointTracker == NULL) {
+               status = exportRegistration_createEndpointTracker(registration, 
&registration->endpointTracker);
+               if (status == CELIX_SUCCESS) {
+                       status = 
serviceTracker_open(registration->endpointTracker);
+               }
+       }
+
+       return status;
+}
+
+celix_status_t exportRegistration_stopTracking(export_registration_pt 
registration) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       if (registration->endpointTracker != NULL) {
+               status = serviceTracker_close(registration->endpointTracker);
+               if (status != CELIX_SUCCESS) {
+                   logHelper_log(registration->loghelper, 
OSGI_LOGSERVICE_ERROR, "EXPORT_REGISTRATION: Could not close endpoint tracker");
+               }
+               else {
+                       status = 
serviceTracker_destroy(registration->endpointTracker);
+               }
+       }
+       if (registration->tracker != NULL) {
+               status = serviceTracker_close(registration->tracker);
+               if (status != CELIX_SUCCESS) {
+                       logHelper_log(registration->loghelper, 
OSGI_LOGSERVICE_ERROR, "EXPORT_REGISTRATION: Could not close service tracker");
+               }
+               else {
+                       status = serviceTracker_destroy(registration->tracker);
+               }
+       }
+
+       return status;
+}
+
+celix_status_t exportRegistration_createEndpointTracker(export_registration_pt 
registration, service_tracker_pt *tracker) {
+       celix_status_t status;
+
+       service_tracker_customizer_pt customizer = NULL;
+
+       status = serviceTrackerCustomizer_create(registration, 
exportRegistration_endpointAdding,
+                       exportRegistration_endpointAdded, 
exportRegistration_endpointModified, exportRegistration_endpointRemoved, 
&customizer);
+
+       if (status == CELIX_SUCCESS) {
+               char filter[512];
+
+               snprintf(filter, 512, "(&(%s=%s)(remote.interface=%s))", 
(char*) OSGI_FRAMEWORK_OBJECTCLASS, (char*) OSGI_RSA_REMOTE_ENDPOINT, 
registration->endpointDescription->service);
+               status = serviceTracker_createWithFilter(registration->context, 
filter, customizer, tracker);
+       }
+
+       return status;
+}
+
+celix_status_t exportRegistration_endpointAdding(void * handle, 
service_reference_pt reference, void **service) {
+       celix_status_t status;
+       export_registration_pt registration = handle;
+
+       status = bundleContext_getService(registration->context, reference, 
service);
+
+       return status;
+}
+
+celix_status_t exportRegistration_endpointAdded(void * handle, 
service_reference_pt reference, void *endpoint_service) {
+       celix_status_t status = CELIX_SUCCESS;
+       export_registration_pt registration = handle;
+
+       remote_endpoint_service_pt endpoint = endpoint_service;
+       if (registration->endpoint == NULL) {
+               registration->endpoint = endpoint;
+               void *service = NULL;
+               status = bundleContext_getService(registration->context, 
registration->reference, &service);
+               if (status == CELIX_SUCCESS) {
+                       endpoint->setService(endpoint->endpoint, service);
+               }
+       }
+
+       return status;
+}
+
+celix_status_t exportRegistration_endpointModified(void * handle, 
service_reference_pt reference, void *service) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       return status;
+}
+
+celix_status_t exportRegistration_endpointRemoved(void * handle, 
service_reference_pt reference, void *service) {
+       celix_status_t status = CELIX_SUCCESS;
+       export_registration_pt registration = handle;
+
+       remote_endpoint_service_pt endpoint = service;
+       if (registration->endpoint != NULL) {
+               endpoint->setService(endpoint->endpoint, NULL);
+       }
+
+       return status;
+}
+
+celix_status_t exportRegistration_open(export_registration_pt registration) {
+       celix_status_t status = CELIX_SUCCESS;
+       const char *bundleStore = NULL;
+
+       bundleContext_getProperty(registration->context, 
BUNDLE_STORE_PROPERTY_NAME, &bundleStore);
+
+       if (bundleStore == NULL) {
+               bundleStore = DEFAULT_BUNDLE_STORE;
+       }
+       char name[256];
+
+       snprintf(name, 256, "%s/%s_endpoint.zip", bundleStore, 
registration->endpointDescription->service);
+
+       status = bundleContext_installBundle(registration->context, name, 
&registration->bundle);
+       if (status == CELIX_SUCCESS) {
+               status = bundle_start(registration->bundle);
+               if (status == CELIX_SUCCESS) {
+               }
+       }
+
+       return status;
+}
+
+celix_status_t exportRegistration_close(export_registration_pt registration) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       exportRegistration_stopTracking(registration);
+
+       bundle_uninstall(registration->bundle);
+
+
+       return status;
+}
+
+celix_status_t exportRegistration_getException(export_registration_pt 
registration) {
+       celix_status_t status = CELIX_SUCCESS;
+       return status;
+}
+
+celix_status_t exportRegistration_getExportReference(export_registration_pt 
registration, export_reference_pt *reference) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       registration->exportReference = calloc(1, 
sizeof(*registration->exportReference));
+
+       if (registration->exportReference == NULL) {
+               status = CELIX_ENOMEM;
+       } else {
+               registration->exportReference->endpoint = 
registration->endpointDescription;
+               registration->exportReference->reference = 
registration->reference;
+       }
+       
+       *reference = registration->exportReference;
+
+       return status;
+}
+
+celix_status_t 
exportRegistration_setEndpointDescription(export_registration_pt registration, 
endpoint_description_pt endpointDescription) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       registration->endpointDescription = endpointDescription;
+
+       return status;
+}
+
+celix_status_t exportReference_getExportedEndpoint(export_reference_pt 
reference, endpoint_description_pt *endpoint) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       *endpoint = reference->endpoint;
+
+       return status;
+}
+
+celix_status_t exportReference_getExportedService(export_reference_pt 
reference, service_reference_pt *service) {
+       celix_status_t status = CELIX_SUCCESS;
+       *service = reference->reference;
+       return status;
+}
+

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/src/export_registration_impl.h
----------------------------------------------------------------------
diff --git a/remote_services/rsa_common/src/export_registration_impl.h 
b/remote_services/rsa_common/src/export_registration_impl.h
new file mode 100644
index 0000000..bb276f9
--- /dev/null
+++ b/remote_services/rsa_common/src/export_registration_impl.h
@@ -0,0 +1,61 @@
+/**
+ *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.
+ */
+/*
+ * export_registration_impl.h
+ *
+ *  \date       Oct 6, 2011
+ *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
+ *  \copyright Apache License, Version 2.0
+ */
+
+#ifndef EXPORT_REGISTRATION_IMPL_H_
+#define EXPORT_REGISTRATION_IMPL_H_
+
+#include "remote_service_admin.h"
+#include "remote_endpoint.h"
+#include "service_tracker.h"
+#include "log_helper.h"
+
+struct export_registration {
+       bundle_context_pt context;
+       remote_service_admin_pt rsa;
+       endpoint_description_pt endpointDescription;
+       service_reference_pt reference;
+       log_helper_pt loghelper;
+
+       service_tracker_pt tracker;
+       service_tracker_pt endpointTracker;
+
+       remote_endpoint_service_pt endpoint;
+
+       export_reference_pt exportReference;
+       bundle_pt bundle;
+
+       bool closed;
+};
+
+celix_status_t exportRegistration_create(log_helper_pt helper, 
service_reference_pt reference, endpoint_description_pt endpoint, 
remote_service_admin_pt rsa, bundle_context_pt context, export_registration_pt 
*registration);
+celix_status_t exportRegistration_destroy(export_registration_pt 
*registration);
+celix_status_t exportRegistration_open(export_registration_pt registration);
+
+celix_status_t 
exportRegistration_setEndpointDescription(export_registration_pt registration, 
endpoint_description_pt endpointDescription);
+celix_status_t exportRegistration_startTracking(export_registration_pt 
registration);
+celix_status_t exportRegistration_stopTracking(export_registration_pt 
registration);
+
+#endif /* EXPORT_REGISTRATION_IMPL_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/src/import_registration_impl.c
----------------------------------------------------------------------
diff --git a/remote_services/rsa_common/src/import_registration_impl.c 
b/remote_services/rsa_common/src/import_registration_impl.c
new file mode 100644
index 0000000..9a84327
--- /dev/null
+++ b/remote_services/rsa_common/src/import_registration_impl.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.
+ */
+/*
+ * import_registration_impl.c
+ *
+ *  \date       Oct 14, 2011
+ *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
+ *  \copyright Apache License, Version 2.0
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <constants.h>
+
+#include "celix_errno.h"
+
+#include "import_registration_impl.h"
+#include "remote_service_admin_impl.h"
+
+struct import_reference {
+       endpoint_description_pt endpoint;
+       service_reference_pt reference;
+};
+
+
+
+celix_status_t importRegistration_proxyFactoryAdding(void * handle, 
service_reference_pt reference, void **service);
+celix_status_t importRegistration_proxyFactoryAdded(void * handle, 
service_reference_pt reference, void *service);
+celix_status_t importRegistration_proxyFactoryModified(void * handle, 
service_reference_pt reference, void *service);
+celix_status_t importRegistration_proxyFactoryRemoved(void * handle, 
service_reference_pt reference, void *service);
+
+celix_status_t importRegistration_create(endpoint_description_pt endpoint, 
remote_service_admin_pt rsa, sendToHandle sendToCallback, bundle_context_pt 
context, import_registration_pt *registration) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       *registration = calloc(1, sizeof(**registration));
+       if (!*registration) {
+               status = CELIX_ENOMEM;
+       } else {
+               (*registration)->context = context;
+               (*registration)->closed = false;
+               (*registration)->endpointDescription = endpoint;
+               (*registration)->rsa = rsa;
+               (*registration)->sendToCallback = sendToCallback;
+               (*registration)->reference = NULL;
+               (*registration)->importReference = NULL;
+       }
+
+       return status;
+}
+
+celix_status_t importRegistration_destroy(import_registration_pt registration)
+{
+       free(registration);
+
+       return CELIX_SUCCESS;
+}
+
+
+celix_status_t importRegistrationFactory_create(log_helper_pt helper, char* 
serviceName, bundle_context_pt context, import_registration_factory_pt 
*registration_factory) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       *registration_factory = calloc(1, sizeof(**registration_factory));
+       if (!*registration_factory) {
+               status = CELIX_ENOMEM;
+       } else {
+               (*registration_factory)->serviceName = strdup(serviceName);
+               (*registration_factory)->context = context;
+               (*registration_factory)->bundle = NULL;
+               (*registration_factory)->loghelper = helper;
+
+               arrayList_create(&(*registration_factory)->registrations);
+       }
+
+       return status;
+}
+
+
+
+celix_status_t 
importRegistrationFactory_destroy(import_registration_factory_pt* 
registration_factory) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       if (*registration_factory != NULL)
+       {
+               free((*registration_factory)->serviceName);
+               arrayList_destroy((*registration_factory)->registrations);
+
+               
serviceTracker_destroy((*registration_factory)->proxyFactoryTracker);
+               free(*registration_factory);
+
+               *registration_factory = NULL;
+       }
+
+
+       return status;
+}
+
+
+celix_status_t importRegistrationFactory_open(import_registration_factory_pt 
registration_factory)
+{
+       celix_status_t status;
+
+       const char *bundleStore = NULL;
+       bundleContext_getProperty(registration_factory->context, 
BUNDLE_STORE_PROPERTY_NAME, &bundleStore);
+
+       if (bundleStore == NULL) {
+               bundleStore = DEFAULT_BUNDLE_STORE;
+       }
+
+       char name[256];
+       snprintf(name, 256, "%s/%s_proxy.zip", bundleStore, 
registration_factory->serviceName);
+
+       status = bundleContext_installBundle(registration_factory->context, 
name, &registration_factory->bundle);
+
+       if (status == CELIX_SUCCESS) {
+               status = bundle_start(registration_factory->bundle);
+               if (status == CELIX_SUCCESS) {
+                       logHelper_log(registration_factory->loghelper, 
OSGI_LOGSERVICE_INFO, "%s successfully started.", name);
+               }
+       }
+       else {
+               logHelper_log(registration_factory->loghelper, 
OSGI_LOGSERVICE_ERROR, "%s could not be installed.", name);
+       }
+
+       return status;
+}
+
+celix_status_t importRegistrationFactory_close(import_registration_factory_pt 
registration_factory)
+{
+       celix_status_t status = CELIX_SUCCESS;
+
+
+       if (registration_factory->proxyFactoryTracker != NULL) {
+               serviceTracker_close(registration_factory->proxyFactoryTracker);
+       }
+
+       if (registration_factory->bundle != NULL) {
+               bundle_uninstall(registration_factory->bundle);
+       }
+
+       return status;
+}
+
+
+celix_status_t 
importRegistration_createProxyFactoryTracker(import_registration_factory_pt 
registration_factory, service_tracker_pt *tracker) {
+       celix_status_t status;
+       service_tracker_customizer_pt customizer = NULL;
+
+       status = serviceTrackerCustomizer_create(registration_factory, 
importRegistration_proxyFactoryAdding, importRegistration_proxyFactoryAdded, 
importRegistration_proxyFactoryModified, 
importRegistration_proxyFactoryRemoved, &customizer);
+
+       if (status == CELIX_SUCCESS) {
+               char filter[512];
+
+               snprintf(filter, 512, "(&(%s=%s)(proxy.interface=%s))", (char*) 
OSGI_FRAMEWORK_OBJECTCLASS, (char*) OSGI_RSA_REMOTE_PROXY_FACTORY, 
registration_factory->serviceName);
+               status = 
serviceTracker_createWithFilter(registration_factory->context, filter, 
customizer, tracker);
+
+               if (status == CELIX_SUCCESS)
+               {
+                       serviceTracker_open(*tracker);
+               }
+       }
+
+       return status;
+}
+
+celix_status_t importRegistration_proxyFactoryAdding(void * handle, 
service_reference_pt reference, void **service) {
+       celix_status_t status = CELIX_SUCCESS;
+       import_registration_factory_pt registration_factory = 
(import_registration_factory_pt) handle;
+
+       bundleContext_getService(registration_factory->context, reference, 
service);
+
+       return status;
+}
+
+celix_status_t importRegistration_proxyFactoryAdded(void * handle, 
service_reference_pt reference, void *service) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       import_registration_factory_pt registration_factory = 
(import_registration_factory_pt) handle;
+       registration_factory->trackedFactory = 
(remote_proxy_factory_service_pt) service;
+
+       return status;
+}
+
+celix_status_t importRegistration_proxyFactoryModified(void * handle, 
service_reference_pt reference, void *service) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       return status;
+}
+
+celix_status_t importRegistration_proxyFactoryRemoved(void * handle, 
service_reference_pt reference, void *service) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       import_registration_factory_pt registration_factory = 
(import_registration_factory_pt) handle;
+       registration_factory->trackedFactory = NULL;
+
+       return status;
+}
+
+
+
+celix_status_t importRegistrationFactory_install(log_helper_pt helper, char* 
serviceName, bundle_context_pt context, import_registration_factory_pt 
*registration_factory)
+{
+       celix_status_t status;
+
+       if ( (status = importRegistrationFactory_create(helper, serviceName, 
context, registration_factory)) == CELIX_SUCCESS) {
+               // starting the proxy tracker first allows us to pick up 
already available proxy factories
+               
importRegistration_createProxyFactoryTracker(*registration_factory, 
&((*registration_factory)->proxyFactoryTracker));
+               logHelper_log((*registration_factory)->loghelper, 
OSGI_LOGSERVICE_INFO, "remoteServiceAdmin_importService: new 
registration_factory added for %s at %p", serviceName, 
(*registration_factory)->proxyFactoryTracker);
+
+               // check whether factory is available
+               if (((*registration_factory)->trackedFactory == NULL) && 
((status = importRegistrationFactory_open(*registration_factory)) != 
CELIX_SUCCESS)) {
+                       logHelper_log((*registration_factory)->loghelper, 
OSGI_LOGSERVICE_ERROR, "remoteServiceAdmin_importService: cannot open 
registration_factory for %s.", serviceName);
+
+                       importRegistrationFactory_close(*registration_factory);
+                       importRegistrationFactory_destroy(registration_factory);
+               }
+       }
+
+       return status;
+}
+
+
+
+
+celix_status_t importRegistration_getException(import_registration_pt 
registration) {
+       celix_status_t status = CELIX_SUCCESS;
+       return status;
+}
+
+
+celix_status_t importRegistration_getImportReference(import_registration_pt 
registration, import_reference_pt *reference) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       if (registration->importReference == NULL) {
+               registration->importReference = calloc(1, 
sizeof(*registration->importReference));
+               if (registration->importReference == NULL) {
+                       status = CELIX_ENOMEM;
+               } else {
+                       registration->importReference->endpoint = 
registration->endpointDescription;
+                       registration->importReference->reference = 
registration->reference;
+               }
+       }
+
+       *reference = registration->importReference;
+
+       return status;
+}
+
+
+celix_status_t importReference_getImportedEndpoint(import_reference_pt 
reference) {
+       celix_status_t status = CELIX_SUCCESS;
+       return status;
+}
+
+celix_status_t importReference_getImportedService(import_reference_pt 
reference) {
+       celix_status_t status = CELIX_SUCCESS;
+       return status;
+}

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/src/import_registration_impl.h
----------------------------------------------------------------------
diff --git a/remote_services/rsa_common/src/import_registration_impl.h 
b/remote_services/rsa_common/src/import_registration_impl.h
new file mode 100644
index 0000000..7aa397f
--- /dev/null
+++ b/remote_services/rsa_common/src/import_registration_impl.h
@@ -0,0 +1,81 @@
+/**
+ *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.
+ */
+/*
+ * import_registration_impl.h
+ *
+ *  \date       Oct 14, 2011
+ *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
+ *  \copyright Apache License, Version 2.0
+ */
+
+#ifndef IMPORT_REGISTRATION_IMPL_H_
+#define IMPORT_REGISTRATION_IMPL_H_
+
+#include "remote_service_admin.h"
+#include "remote_proxy.h"
+#include "service_tracker.h"
+#include "log_helper.h"
+
+struct import_registration {
+       bundle_context_pt context;
+       endpoint_description_pt endpointDescription;
+
+       service_reference_pt reference;
+       import_reference_pt importReference;
+
+       remote_service_admin_pt rsa;
+       sendToHandle sendToCallback;
+
+       bool closed;
+};
+
+
+
+struct import_registration_factory
+{
+       char* serviceName;
+       log_helper_pt loghelper;
+       remote_proxy_factory_service_pt trackedFactory;
+       service_tracker_pt proxyFactoryTracker;
+       bundle_context_pt context;
+       array_list_pt registrations;
+       bundle_pt bundle;
+};
+
+
+celix_status_t importRegistration_create(endpoint_description_pt endpoint, 
remote_service_admin_pt rsa, sendToHandle callback, bundle_context_pt context, 
import_registration_pt *registration);
+celix_status_t importRegistration_destroy(import_registration_pt registration);
+
+celix_status_t 
importRegistration_setEndpointDescription(import_registration_pt registration, 
endpoint_description_pt endpointDescription);
+celix_status_t importRegistration_setHandler(import_registration_pt 
registration, void * handler);
+celix_status_t importRegistration_setCallback(import_registration_pt 
registration, sendToHandle callback);
+
+celix_status_t importRegistration_getException(import_registration_pt 
registration);
+celix_status_t importRegistration_getImportReference(import_registration_pt 
registration, import_reference_pt *reference);
+
+celix_status_t 
importRegistration_createProxyFactoryTracker(import_registration_factory_pt 
registration_factory, service_tracker_pt *tracker);
+
+celix_status_t 
importRegistrationFactory_destroy(import_registration_factory_pt* 
registration_factory);
+//celix_status_t importRegistrationFactory_open(import_registration_factory_pt 
registration_factory);
+celix_status_t importRegistrationFactory_close(import_registration_factory_pt 
registration_factory);
+celix_status_t importRegistrationFactory_install(log_helper_pt helper, char* 
serviceName, bundle_context_pt context, import_registration_factory_pt 
*registration_factory);
+
+
+
+#endif /* IMPORT_REGISTRATION_IMPL_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/src/remote_proxy_factory_impl.c
----------------------------------------------------------------------
diff --git a/remote_services/rsa_common/src/remote_proxy_factory_impl.c 
b/remote_services/rsa_common/src/remote_proxy_factory_impl.c
new file mode 100644
index 0000000..9f996d6
--- /dev/null
+++ b/remote_services/rsa_common/src/remote_proxy_factory_impl.c
@@ -0,0 +1,252 @@
+/**
+ * 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.
+ */
+
+/*
+ * remote_proxy_factory_impl.c
+ *
+ *  \date       22 Dec 2014
+ *  \author     <a href="mailto:[email protected]";>Apache Celix Project 
Team</a>
+ *  \copyright  Apache License, Version 2.0
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "remote_proxy.h"
+
+typedef struct proxy_instance {
+       service_registration_pt registration_ptr;
+       void *service;
+       properties_pt properties;
+} *proxy_instance_pt;
+
+static celix_status_t 
remoteProxyFactory_registerProxyService(remote_proxy_factory_pt 
remote_proxy_factory_ptr, endpoint_description_pt endpointDescription, 
remote_service_admin_pt rsa, sendToHandle sendToCallback);
+static celix_status_t 
remoteProxyFactory_unregisterProxyService(remote_proxy_factory_pt 
remote_proxy_factory_ptr, endpoint_description_pt endpointDescription);
+
+celix_status_t remoteProxyFactory_create(bundle_context_pt context, char 
*service, void *handle,
+               createProxyService create, destroyProxyService destroy,
+               remote_proxy_factory_pt *remote_proxy_factory_ptr) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       *remote_proxy_factory_ptr = calloc(1, 
sizeof(**remote_proxy_factory_ptr));
+       if (!*remote_proxy_factory_ptr) {
+               status = CELIX_ENOMEM;
+       }
+
+       if (status == CELIX_SUCCESS) {
+               (*remote_proxy_factory_ptr)->context_ptr = context;
+               (*remote_proxy_factory_ptr)->service = strdup(service);
+
+               (*remote_proxy_factory_ptr)->remote_proxy_factory_service_ptr = 
NULL;
+               (*remote_proxy_factory_ptr)->properties = NULL;
+               (*remote_proxy_factory_ptr)->registration = NULL;
+
+               (*remote_proxy_factory_ptr)->proxy_instances = 
hashMap_create(NULL, NULL, NULL, NULL);
+
+               (*remote_proxy_factory_ptr)->handle = handle;
+
+               (*remote_proxy_factory_ptr)->create_proxy_service_ptr = create;
+               (*remote_proxy_factory_ptr)->destroy_proxy_service_ptr = 
destroy;
+       }
+
+       return status;
+}
+
+celix_status_t remoteProxyFactory_destroy(remote_proxy_factory_pt 
*remote_proxy_factory_ptr) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       if (!*remote_proxy_factory_ptr) {
+               status = CELIX_ILLEGAL_ARGUMENT;
+       }
+
+       if (status == CELIX_SUCCESS) {
+               if ((*remote_proxy_factory_ptr)->proxy_instances) {
+                       
hashMap_destroy((*remote_proxy_factory_ptr)->proxy_instances, false, false);
+                       (*remote_proxy_factory_ptr)->proxy_instances = NULL;
+               }
+               if ((*remote_proxy_factory_ptr)->service) {
+                       free((*remote_proxy_factory_ptr)->service);
+                       (*remote_proxy_factory_ptr)->service = NULL;
+               }
+               free(*remote_proxy_factory_ptr);
+               *remote_proxy_factory_ptr = NULL;
+       }
+
+       return status;
+}
+
+celix_status_t remoteProxyFactory_register(remote_proxy_factory_pt 
remote_proxy_factory_ptr) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       remote_proxy_factory_ptr->remote_proxy_factory_service_ptr = calloc(1, 
sizeof(*remote_proxy_factory_ptr->remote_proxy_factory_service_ptr));
+       if (!remote_proxy_factory_ptr->remote_proxy_factory_service_ptr) {
+               status = CELIX_ENOMEM;
+       }
+
+       if (status == CELIX_SUCCESS) {
+               
remote_proxy_factory_ptr->remote_proxy_factory_service_ptr->factory = 
remote_proxy_factory_ptr;
+               
remote_proxy_factory_ptr->remote_proxy_factory_service_ptr->registerProxyService
 = remoteProxyFactory_registerProxyService;
+               
remote_proxy_factory_ptr->remote_proxy_factory_service_ptr->unregisterProxyService
 = remoteProxyFactory_unregisterProxyService;
+
+               remote_proxy_factory_ptr->properties = properties_create();
+               if (!remote_proxy_factory_ptr->properties) {
+                       status = CELIX_BUNDLE_EXCEPTION;
+               } else {
+                       properties_set(remote_proxy_factory_ptr->properties, 
"proxy.interface", remote_proxy_factory_ptr->service);
+               }
+       }
+
+       if (status == CELIX_SUCCESS) {
+               status = 
bundleContext_registerService(remote_proxy_factory_ptr->context_ptr, 
OSGI_RSA_REMOTE_PROXY_FACTORY,
+                               
remote_proxy_factory_ptr->remote_proxy_factory_service_ptr, 
remote_proxy_factory_ptr->properties, &remote_proxy_factory_ptr->registration);
+       }
+
+       return status;
+}
+
+celix_status_t remoteProxyFactory_unregister(remote_proxy_factory_pt 
remote_proxy_factory_ptr) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       if (!remote_proxy_factory_ptr) {
+               status = CELIX_ILLEGAL_ARGUMENT;
+       }
+
+       // #TODO Remove proxy registrations
+       if (status == CELIX_SUCCESS) {
+
+               hash_map_iterator_pt iter = 
hashMapIterator_create(remote_proxy_factory_ptr->proxy_instances);
+               while(hashMapIterator_hasNext(iter)){
+                       proxy_instance_pt proxy_instance_ptr = 
(proxy_instance_pt)hashMapIterator_nextValue(iter);
+
+                       if (proxy_instance_ptr->service) {
+                               
remote_proxy_factory_ptr->destroy_proxy_service_ptr(remote_proxy_factory_ptr->handle,
 proxy_instance_ptr->service);
+                       }
+                       free(proxy_instance_ptr);
+               }
+               hashMapIterator_destroy(iter);
+
+               if (remote_proxy_factory_ptr->registration) {
+                       status = 
serviceRegistration_unregister(remote_proxy_factory_ptr->registration);
+                       remote_proxy_factory_ptr->properties = NULL;
+               }
+               if (remote_proxy_factory_ptr->properties) {
+                       
properties_destroy(remote_proxy_factory_ptr->properties);
+               }
+               if (remote_proxy_factory_ptr->remote_proxy_factory_service_ptr) 
{
+                       
free(remote_proxy_factory_ptr->remote_proxy_factory_service_ptr);
+               }
+       }
+
+       return status;
+}
+
+
+static celix_status_t 
remoteProxyFactory_registerProxyService(remote_proxy_factory_pt 
remote_proxy_factory_ptr, endpoint_description_pt endpointDescription, 
remote_service_admin_pt rsa, sendToHandle sendToCallback) {
+       celix_status_t status = CELIX_SUCCESS;
+       proxy_instance_pt proxy_instance_ptr = NULL;
+
+       if (!remote_proxy_factory_ptr || 
!remote_proxy_factory_ptr->create_proxy_service_ptr) {
+               status = CELIX_ILLEGAL_ARGUMENT;
+       }
+
+       if (status == CELIX_SUCCESS) {
+               proxy_instance_ptr = calloc(1, sizeof(*proxy_instance_ptr));
+               if (!proxy_instance_ptr) {
+                       status = CELIX_ENOMEM;
+               }
+       }
+
+       if (status == CELIX_SUCCESS) {
+               proxy_instance_ptr->properties = properties_create();
+               if (!proxy_instance_ptr->properties) {
+                       status = CELIX_ENOMEM;
+               }
+       }
+
+       if (status == CELIX_SUCCESS) {
+               status = 
remote_proxy_factory_ptr->create_proxy_service_ptr(remote_proxy_factory_ptr->handle,
 endpointDescription, rsa, sendToCallback, proxy_instance_ptr->properties, 
&proxy_instance_ptr->service);
+       }
+
+       if (status == CELIX_SUCCESS) {
+               properties_set(proxy_instance_ptr->properties, 
"proxy.interface", remote_proxy_factory_ptr->service);
+
+               hash_map_iterator_pt iter = 
hashMapIterator_create(endpointDescription->properties);
+               while (hashMapIterator_hasNext(iter)) {
+                       hash_map_entry_pt entry = 
hashMapIterator_nextEntry(iter);
+                       char *key = hashMapEntry_getKey(entry);
+                       char *value = hashMapEntry_getValue(entry);
+
+                       properties_set(proxy_instance_ptr->properties, key, 
value);
+               }
+               hashMapIterator_destroy(iter);
+       }
+
+       if (status == CELIX_SUCCESS) {
+               status = 
bundleContext_registerService(remote_proxy_factory_ptr->context_ptr, 
remote_proxy_factory_ptr->service, proxy_instance_ptr->service, 
proxy_instance_ptr->properties, &proxy_instance_ptr->registration_ptr);
+       }
+
+       if (status == CELIX_SUCCESS) {
+               hashMap_put(remote_proxy_factory_ptr->proxy_instances, 
endpointDescription, proxy_instance_ptr);
+       }
+
+       if(status!=CELIX_SUCCESS){
+               if(proxy_instance_ptr != NULL){
+                       if(proxy_instance_ptr->properties != NULL){
+                               
properties_destroy(proxy_instance_ptr->properties);
+                       }
+                       free(proxy_instance_ptr);
+               }
+       }
+
+       return status;
+}
+
+static celix_status_t 
remoteProxyFactory_unregisterProxyService(remote_proxy_factory_pt 
remote_proxy_factory_ptr, endpoint_description_pt endpointDescription) {
+       celix_status_t status = CELIX_SUCCESS;
+       proxy_instance_pt proxy_instance_ptr = NULL;
+
+       if (!remote_proxy_factory_ptr || !endpointDescription || 
!remote_proxy_factory_ptr->proxy_instances || 
!remote_proxy_factory_ptr->handle) {
+               status = CELIX_ILLEGAL_ARGUMENT;
+       }
+
+       if (status == CELIX_SUCCESS) {
+               proxy_instance_ptr = 
hashMap_remove(remote_proxy_factory_ptr->proxy_instances, endpointDescription);
+               if (proxy_instance_ptr == NULL) {
+                       status = CELIX_BUNDLE_EXCEPTION;
+               }
+       }
+
+       if (status == CELIX_SUCCESS) {
+               if (proxy_instance_ptr->registration_ptr) {
+                       status = 
serviceRegistration_unregister(proxy_instance_ptr->registration_ptr);
+                       proxy_instance_ptr->properties = NULL;
+               }
+               if (proxy_instance_ptr->service) {
+                       status = 
remote_proxy_factory_ptr->destroy_proxy_service_ptr(remote_proxy_factory_ptr->handle,
 proxy_instance_ptr->service);
+               }
+               if (proxy_instance_ptr->properties) {
+                       properties_destroy(proxy_instance_ptr->properties);
+               }
+        free(proxy_instance_ptr);
+       }
+
+       return status;
+}
+
+

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/src/remote_service_admin_impl.h
----------------------------------------------------------------------
diff --git a/remote_services/rsa_common/src/remote_service_admin_impl.h 
b/remote_services/rsa_common/src/remote_service_admin_impl.h
new file mode 100644
index 0000000..e8a5e1f
--- /dev/null
+++ b/remote_services/rsa_common/src/remote_service_admin_impl.h
@@ -0,0 +1,49 @@
+/**
+ *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.
+ */
+/*
+ * remote_service_admin_impl.h
+ *
+ *  \date       Dec 5, 2013
+ *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
+ *  \copyright Apache License, Version 2.0
+ */
+
+#ifndef REMOTE_SERVICE_ADMIN_IMPL_H_
+#define REMOTE_SERVICE_ADMIN_IMPL_H_
+
+#include "remote_service_admin.h"
+
+#define BUNDLE_STORE_PROPERTY_NAME "ENDPOINTS"
+#define DEFAULT_BUNDLE_STORE "endpoints"
+
+celix_status_t remoteServiceAdmin_create(bundle_context_pt context, 
remote_service_admin_pt *admin);
+celix_status_t remoteServiceAdmin_destroy(remote_service_admin_pt *admin);
+
+celix_status_t remoteServiceAdmin_send(remote_service_admin_pt rsa, 
endpoint_description_pt endpointDescription, char *methodSignature, char 
**reply, int* replyStatus);
+
+celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, 
char *serviceId, properties_pt properties, array_list_pt *registrations);
+celix_status_t 
remoteServiceAdmin_removeExportedService(remote_service_admin_pt admin, 
export_registration_pt registration);
+celix_status_t remoteServiceAdmin_getExportedServices(remote_service_admin_pt 
admin, array_list_pt *services);
+celix_status_t remoteServiceAdmin_getImportedEndpoints(remote_service_admin_pt 
admin, array_list_pt *services);
+celix_status_t remoteServiceAdmin_importService(remote_service_admin_pt admin, 
endpoint_description_pt endpoint, import_registration_pt *registration);
+celix_status_t 
remoteServiceAdmin_removeImportedService(remote_service_admin_pt admin, 
import_registration_pt registration);
+
+celix_status_t 
remoteServiceAdmin_destroyEndpointDescription(endpoint_description_pt 
*description);
+
+#endif /* REMOTE_SERVICE_ADMIN_IMPL_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_spi/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/rsa_spi/CMakeLists.txt 
b/remote_services/rsa_spi/CMakeLists.txt
new file mode 100644
index 0000000..ea4ec95
--- /dev/null
+++ b/remote_services/rsa_spi/CMakeLists.txt
@@ -0,0 +1,29 @@
+# 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.
+
+add_library(rsa_spi INTERFACE)
+target_include_directories(rsa_spi INTERFACE
+    $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
+    $<INSTALL_INTERFACE:include/celix/rsa>
+)
+target_link_libraries(rsa_spi INTERFACE Celix::remote_services_api)
+
+install(TARGETS rsa_spi EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} 
COMPONENT rsa)
+install(DIRECTORY include/ DESTINATION include/celix/rsa COMPONENT rsa)
+
+#Setup target aliases to match external usage
+add_library(Celix::rsa_spi ALIAS rsa_spi)

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_spi/README.md
----------------------------------------------------------------------
diff --git a/remote_services/rsa_spi/README.md 
b/remote_services/rsa_spi/README.md
new file mode 100644
index 0000000..2e3d268
--- /dev/null
+++ b/remote_services/rsa_spi/README.md
@@ -0,0 +1,11 @@
+# Remote Service Admin
+
+The Remote Service Admin (RSA) provides the mechanisms to import and export 
services when instructed to do so by the Topology Manager. 
+
+To delegate method calls to the actual service implementation, the RSA_SHM and 
the RSA_HTTP are using "endpoint/proxy" bundles, which has all the knowledge 
about the marshalling and unmarshalling of data for the service. The RSA_DFI 
implementation combines a [foreign function 
interface](https://en.wikipedia.org/wiki/Foreign_function_interface) technique 
together with manualy created descriptors.  
+
+Note that this folder contains code commonly used by the RSA implementations 
and therefore does not include any CMAKE configuration.
+
+## Properties
+    ENDPOINTS                           defines the relative directory where 
endpoints and proxys can be found (default: endpoints)
+    CELIX_FRAMEWORK_EXTENDER_PATH  Used in RSA_DFI only. Can be used to define 
a path to use as an extender path point for the framework bundle. For normal 
bundles the bundle cache is used. 

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_spi/include/endpoint_description.h
----------------------------------------------------------------------
diff --git a/remote_services/rsa_spi/include/endpoint_description.h 
b/remote_services/rsa_spi/include/endpoint_description.h
new file mode 100644
index 0000000..de27d2e
--- /dev/null
+++ b/remote_services/rsa_spi/include/endpoint_description.h
@@ -0,0 +1,50 @@
+/**
+ *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.
+ */
+/*
+ * endpoint_description.h
+ *
+ *  \date       25 Jul 2014
+ *  \author     <a href="mailto:[email protected]";>Apache Celix Project 
Team</a>
+ *  \copyright  Apache License, Version 2.0
+ */
+
+#ifndef ENDPOINT_DESCRIPTION_H_
+#define ENDPOINT_DESCRIPTION_H_
+
+#include "properties.h"
+#include "array_list.h"
+
+struct endpoint_description {
+    char *frameworkUUID;
+    char *id;
+    // array_list_pt intents;
+    char *service;
+    // HASH_MAP packageVersions;
+    properties_pt properties;
+    unsigned long serviceId;
+};
+
+typedef struct endpoint_description endpoint_description_t;
+typedef endpoint_description_t* endpoint_description_pt;
+
+celix_status_t endpointDescription_create(properties_pt properties, 
endpoint_description_pt *endpointDescription);
+celix_status_t endpointDescription_destroy(endpoint_description_pt 
description);
+
+
+#endif /* ENDPOINT_DESCRIPTION_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_spi/include/endpoint_listener.h
----------------------------------------------------------------------
diff --git a/remote_services/rsa_spi/include/endpoint_listener.h 
b/remote_services/rsa_spi/include/endpoint_listener.h
new file mode 100644
index 0000000..2e6359f
--- /dev/null
+++ b/remote_services/rsa_spi/include/endpoint_listener.h
@@ -0,0 +1,49 @@
+/**
+ *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.
+ */
+/*
+ * endpoint_listener.h
+ *
+ *  \date       Sep 29, 2011
+ *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
+ *  \copyright Apache License, Version 2.0
+ */
+
+#ifndef ENDPOINT_LISTENER_H_
+#define ENDPOINT_LISTENER_H_
+
+#include "array_list.h"
+#include "properties.h"
+
+#include "endpoint_description.h"
+
+static const char * const OSGI_ENDPOINT_LISTENER_SERVICE = "endpoint_listener";
+
+static const char * const OSGI_ENDPOINT_LISTENER_SCOPE = 
"endpoint.listener.scope";
+
+struct endpoint_listener {
+       void *handle;
+       celix_status_t (*endpointAdded)(void *handle, endpoint_description_pt 
endpoint, char *machtedFilter);
+       celix_status_t (*endpointRemoved)(void *handle, endpoint_description_pt 
endpoint, char *machtedFilter);
+};
+
+typedef struct endpoint_listener endpoint_listener_t;
+typedef endpoint_listener_t *endpoint_listener_pt;
+
+
+#endif /* ENDPOINT_LISTENER_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_spi/include/export_registration.h
----------------------------------------------------------------------
diff --git a/remote_services/rsa_spi/include/export_registration.h 
b/remote_services/rsa_spi/include/export_registration.h
new file mode 100644
index 0000000..dc3882b
--- /dev/null
+++ b/remote_services/rsa_spi/include/export_registration.h
@@ -0,0 +1,22 @@
+/*
+ * Licensed under Apache License v2. See LICENSE for more information.
+ */
+#ifndef CELIX_EXPORT_REGISTRATION_H
+#define CELIX_EXPORT_REGISTRATION_H
+
+#include "celix_errno.h"
+#include "endpoint_description.h"
+#include "service_reference.h"
+
+typedef struct export_registration *export_registration_pt;
+
+typedef struct export_reference *export_reference_pt;
+
+celix_status_t exportRegistration_close(export_registration_pt registration);
+celix_status_t exportRegistration_getException(export_registration_pt 
registration);
+celix_status_t exportRegistration_getExportReference(export_registration_pt 
registration, export_reference_pt *reference);
+
+celix_status_t exportReference_getExportedEndpoint(export_reference_pt 
reference, endpoint_description_pt *endpoint);
+celix_status_t exportReference_getExportedService(export_reference_pt 
reference, service_reference_pt *service);
+
+#endif //CELIX_EXPORT_REGISTRATION_H

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_spi/include/import_registration.h
----------------------------------------------------------------------
diff --git a/remote_services/rsa_spi/include/import_registration.h 
b/remote_services/rsa_spi/include/import_registration.h
new file mode 100644
index 0000000..ef8193f
--- /dev/null
+++ b/remote_services/rsa_spi/include/import_registration.h
@@ -0,0 +1,22 @@
+/*
+ * Licensed under Apache License v2. See LICENSE for more information.
+ */
+#ifndef CELIX_IMPORT_REGISTRATION_H
+#define CELIX_IMPORT_REGISTRATION_H
+
+#include "celix_errno.h"
+#include "endpoint_description.h"
+#include "service_reference.h"
+
+typedef struct import_registration *import_registration_pt;
+
+typedef struct import_reference *import_reference_pt;
+
+celix_status_t importRegistration_close(import_registration_pt registration);
+celix_status_t importRegistration_getException(import_registration_pt 
registration);
+celix_status_t importRegistration_getImportReference(import_registration_pt 
registration, import_reference_pt *reference);
+
+celix_status_t importReference_getImportedEndpoint(import_reference_pt 
reference);
+celix_status_t importReference_getImportedService(import_reference_pt 
reference);
+
+#endif //CELIX_IMPORT_REGISTRATION_H

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_spi/include/remote_constants.h
----------------------------------------------------------------------
diff --git a/remote_services/rsa_spi/include/remote_constants.h 
b/remote_services/rsa_spi/include/remote_constants.h
new file mode 100644
index 0000000..0736685
--- /dev/null
+++ b/remote_services/rsa_spi/include/remote_constants.h
@@ -0,0 +1,38 @@
+/**
+ *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.
+ */
+/*
+ * remote_constants.h
+ *
+ *  \date       Sep 30, 2011
+ *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
+ *  \copyright Apache License, Version 2.0
+ */
+
+#ifndef REMOTE_CONSTANTS_H_
+#define REMOTE_CONSTANTS_H_
+
+static const char * const OSGI_RSA_SERVICE_EXPORTED_INTERFACES = 
"service.exported.interfaces";
+static const char * const OSGI_RSA_ENDPOINT_FRAMEWORK_UUID = 
"endpoint.framework.uuid";
+static const char * const OSGI_RSA_ENDPOINT_SERVICE_ID = "endpoint.service.id";
+static const char * const OSGI_RSA_ENDPOINT_ID = "endpoint.id";
+static const char * const OSGI_RSA_SERVICE_IMPORTED = "service.imported";
+static const char * const OSGI_RSA_SERVICE_IMPORTED_CONFIGS = 
"service.imported.configs";
+static const char * const OSGI_RSA_SERVICE_LOCATION = "service.location";
+
+#endif /* REMOTE_CONSTANTS_H_ */

Reply via email to