CELIX-237: A lot of work on the rsa dfi bundle and some needed refactoring for 
the remote_service_admin setup to support an non proxy approach.

- Fixed issue in launcher (cleared curl to soon)
- update service registry/registration so that error status for the factory 
will be returned.
- Fixed issue in log_factory, concerning a wrong assumption of the provided 
struct.
- Added rpath for the launcher. Have to see if this works with install, but for 
now this make running deployment from ide (clion) possible.
    Just set the workdir to the deploy location and use celix as executable
- Removed schema properties from calculator example
- Created a generic export/import_registration header for the (OSGi) generic api
- Moved some export/import_registration/reference code the 
import/export_registration source files
- Small updated to dfi for additional getters
- Updated rsa_dfi. rsa_dfi now creates a proxy based on dfi and also dfi for 
export
- Added rsa_dfi cpputest

Note: Still alot of work is needed in the dfi. Also rsa etcd deployment has 
problem. shm not tested, cfg works fine.


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

Branch: refs/heads/feature/CELIX-237_rsa-ffi
Commit: da86474fb187707d8443a3aeb30ac965b74b1d43
Parents: 55e75be
Author: Pepijn Noltes <pepijnnol...@gmail.com>
Authored: Fri Aug 7 16:19:05 2015 +0200
Committer: Pepijn Noltes <pepijnnol...@gmail.com>
Committed: Fri Aug 7 16:19:05 2015 +0200

----------------------------------------------------------------------
 framework/private/src/service_registration.c    |    5 +-
 framework/private/src/service_registry.c        |    2 +-
 launcher/CMakeLists.txt                         |    4 +
 launcher/private/src/launcher.c                 |   29 +-
 log_service/private/src/log_factory.c           |    2 +-
 .../examples/calculator_service/CMakeLists.txt  |    5 +-
 ....apache.celix.calc.api.Calculator.descriptor |   11 +
 .../private/src/calculator_activator.c          |    1 -
 .../public/include/calculator_service.h         |   25 -
 remote_services/examples/deploy.cmake           |   40 +-
 .../private/include/export_registration_impl.h  |    3 -
 .../private/include/remote_service_admin_impl.h |   17 -
 .../private/src/export_registration_impl.c      |   22 +-
 .../private/src/import_registration_impl.c      |   17 +
 .../public/include/export_registration.h        |   22 +
 .../public/include/import_registration.h        |   22 +
 .../public/include/remote_service_admin.h       |    6 +-
 .../remote_service_admin_dfi/CMakeLists.txt     |   21 +-
 .../dynamic_function_interface/CMakeLists.txt   |   10 +-
 .../dynamic_function_interface/dyn_function.c   |   31 +-
 .../dynamic_function_interface/dyn_function.h   |    5 +-
 .../dynamic_function_interface/dyn_interface.c  |   22 +
 .../dynamic_function_interface/dyn_interface.h  |    9 +-
 .../dynamic_function_interface/dyn_type.c       |    2 +
 .../json_serializer.c                           |   21 +-
 .../json_serializer.h                           |    3 +
 .../tst/dyn_function_tests.cpp                  |   29 +
 .../tst/dyn_interface_tests.cpp                 |   10 +-
 .../private/include/export_registration_dfi.h   |   21 +
 .../private/include/import_registration_dfi.h   |   20 +
 .../include/remote_service_admin_http_impl.h    |   23 +-
 .../private/src/export_registration_dfi.c       |  159 +++
 .../private/src/import_registration_dfi.c       |  231 ++++
 .../src/remote_service_admin_activator.c        |    4 +-
 .../private/src/remote_service_admin_dfi.c      |  783 +++++++++++++
 .../private/src/remote_service_admin_impl.c     | 1085 ------------------
 .../remote_service_admin_dfi/tst/CMakeLists.txt |   18 +-
 .../tst/config.properties.in                    |    3 +-
 .../remote_service_admin_dfi/tst/rsa_tests.cpp  |  182 ++-
 .../private/src/remote_service_admin_impl.c     |  129 +--
 .../private/src/remote_service_admin_impl.c     |   26 +-
 41 files changed, 1734 insertions(+), 1346 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/framework/private/src/service_registration.c
----------------------------------------------------------------------
diff --git a/framework/private/src/service_registration.c 
b/framework/private/src/service_registration.c
index 8e84d1a..c7eb010 100644
--- a/framework/private/src/service_registration.c
+++ b/framework/private/src/service_registration.c
@@ -146,13 +146,14 @@ celix_status_t 
serviceRegistration_unregister(service_registration_pt registrati
 }
 
 celix_status_t serviceRegistration_getService(service_registration_pt 
registration, bundle_pt bundle, void **service) {
+       int status = CELIX_SUCCESS;
     if (registration->isServiceFactory) {
         service_factory_pt factory = registration->serviceFactory;
-        factory->getService(registration->serviceFactory, bundle, 
registration, service);
+        status = factory->getService(factory->factory, bundle, registration, 
service);
     } else {
         (*service) = registration->svcObj;
     }
-    return CELIX_SUCCESS;
+    return status;
 }
 
 celix_status_t serviceRegistration_ungetService(service_registration_pt 
registration, bundle_pt bundle, void **service) {

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/framework/private/src/service_registry.c
----------------------------------------------------------------------
diff --git a/framework/private/src/service_registry.c 
b/framework/private/src/service_registry.c
index 85639b4..ca1641b 100644
--- a/framework/private/src/service_registry.c
+++ b/framework/private/src/service_registry.c
@@ -502,7 +502,7 @@ celix_status_t 
serviceRegistry_getService(service_registry_pt registry, bundle_p
        celixThreadMutex_unlock(&registry->mutex);
 
        if ((usage != NULL) && (*service == NULL)) {
-               serviceRegistration_getService(registration, bundle, service);
+               status = serviceRegistration_getService(registration, bundle, 
service);
        }
        celixThreadMutex_lock(&registry->mutex);
        if ((!serviceRegistration_isValid(registration)) || (*service == NULL)) 
{

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/launcher/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt
index 6001eaf..dac0ce7 100644
--- a/launcher/CMakeLists.txt
+++ b/launcher/CMakeLists.txt
@@ -18,6 +18,10 @@ celix_subproject(LAUNCHER "Option to build the launcher" 
"ON" DEPS UTILS FRAMEWO
 if (LAUNCHER) 
     find_package(CURL REQUIRED)
 
+    SET(CMAKE_SKIP_BUILD_RPATH  FALSE) #TODO needed?
+    SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) #TODO needed?
+    SET(CMAKE_INSTALL_RPATH "${PROJECT_BINARY_DIR}/framework" 
"${PROJECT_BINARY_DIR}/utils")
+
     include_directories(public/include)
     
     add_executable(celix

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/launcher/private/src/launcher.c
----------------------------------------------------------------------
diff --git a/launcher/private/src/launcher.c b/launcher/private/src/launcher.c
index 432c709..a6297a0 100644
--- a/launcher/private/src/launcher.c
+++ b/launcher/private/src/launcher.c
@@ -113,7 +113,6 @@ int celixLauncher_launchWithStream(FILE *stream, 
framework_pt *framework) {
                 char *save_ptr = NULL;
                 linked_list_pt bundles;
                 array_list_pt installed = NULL;
-                bundle_pt bundle = NULL;
                 bundle_context_pt context = NULL;
                 linked_list_iterator_pt iter = NULL;
                 unsigned int i;
@@ -128,8 +127,7 @@ int celixLauncher_launchWithStream(FILE *stream, 
framework_pt *framework) {
                 // First install all bundles
                 // Afterwards start them
                 arrayList_create(&installed);
-                framework_getFrameworkBundle(*framework, &bundle);
-                bundle_getContext(bundle, &context);
+                bundle_getContext(fwBundle, &context);
                 iter = linkedListIterator_create(bundles, 0);
                 while (linkedListIterator_hasNext(iter)) {
                     bundle_pt current = NULL;
@@ -159,18 +157,7 @@ int celixLauncher_launchWithStream(FILE *stream, 
framework_pt *framework) {
             printf("Problem creating framework\n");
         }
 
-#ifdef WITH_APR
-       apr_pool_destroy(memoryPool);
-       apr_terminate();
-#endif
-
-
-#ifndef CELIX_NO_CURLINIT
-        // Cleanup Curl
-        curl_global_cleanup();
-#endif
-
-        printf("Launcher: Exit\n");
+        printf("Launcher: Framework Started\n");
     }
 
     return status;
@@ -182,6 +169,18 @@ void celixLauncher_waitForShutdown(framework_pt framework) 
{
 
 void celixLauncher_destroy(framework_pt framework) {
     framework_destroy(framework);
+
+    #ifdef WITH_APR
+        apr_pool_destroy(memoryPool);
+        apr_terminate();
+    #endif
+
+    #ifndef CELIX_NO_CURLINIT
+        // Cleanup Curl
+        curl_global_cleanup();
+    #endif
+
+    printf("Launcher: Exit\n");
 }
 
 void celixLauncher_stop(framework_pt framework) {

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/log_service/private/src/log_factory.c
----------------------------------------------------------------------
diff --git a/log_service/private/src/log_factory.c 
b/log_service/private/src/log_factory.c
index 7ea5b2f..d188044 100644
--- a/log_service/private/src/log_factory.c
+++ b/log_service/private/src/log_factory.c
@@ -72,7 +72,7 @@ celix_status_t logFactory_destroy(service_factory_pt 
*factory) {
 
 
 celix_status_t logFactory_getService(void *factory, bundle_pt bundle, 
service_registration_pt registration, void **service) {
-    log_service_factory_pt log_factory = ((service_factory_pt) 
factory)->factory;
+    log_service_factory_pt log_factory = factory;
     log_service_pt log_service = NULL;
     log_service_data_pt log_service_data = NULL;
 

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/examples/calculator_service/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/examples/calculator_service/CMakeLists.txt 
b/remote_services/examples/calculator_service/CMakeLists.txt
index e17153e..91596ab 100644
--- a/remote_services/examples/calculator_service/CMakeLists.txt
+++ b/remote_services/examples/calculator_service/CMakeLists.txt
@@ -24,11 +24,14 @@ include_directories("public/include")
 SET(BUNDLE_SYMBOLICNAME "apache_celix_remoting_calculator_impl")
 SET(BUNDLE_VERSION "0.0.1")
 
-bundle(calculator SOURCES 
+    bundle(calculator SOURCES
        private/src/calculator_impl
        private/src/calculator_activator
     
     private/include/calculator_impl.h
+
+    FILES
+        org.apache.celix.calc.api.Calculator.descriptor
 )
 
 target_link_libraries(calculator celix_framework)

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/examples/calculator_service/org.apache.celix.calc.api.Calculator.descriptor
----------------------------------------------------------------------
diff --git 
a/remote_services/examples/calculator_service/org.apache.celix.calc.api.Calculator.descriptor
 
b/remote_services/examples/calculator_service/org.apache.celix.calc.api.Calculator.descriptor
new file mode 100644
index 0000000..711df0b
--- /dev/null
+++ 
b/remote_services/examples/calculator_service/org.apache.celix.calc.api.Calculator.descriptor
@@ -0,0 +1,11 @@
+:header
+type=interface
+name=calculator
+version=1.0.0
+:annotations
+classname=org.example.Calculator
+:types
+:methods
+add(DD)D=add(PDD*D)N
+sub(DD)D=sub(PDD*D)N
+sqrt(D)D=sqrt(PD*D)N

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/examples/calculator_service/private/src/calculator_activator.c
----------------------------------------------------------------------
diff --git 
a/remote_services/examples/calculator_service/private/src/calculator_activator.c
 
b/remote_services/examples/calculator_service/private/src/calculator_activator.c
index a4dfa46..13ea995 100644
--- 
a/remote_services/examples/calculator_service/private/src/calculator_activator.c
+++ 
b/remote_services/examples/calculator_service/private/src/calculator_activator.c
@@ -75,7 +75,6 @@ celix_status_t bundleActivator_start(void * userData, 
bundle_context_pt context)
 
                        properties = properties_create();
                        properties_set(properties, (char *) 
OSGI_RSA_SERVICE_EXPORTED_INTERFACES, (char *) CALCULATOR_SERVICE);
-      properties_set(properties, (char *) "protocol.schema", (char 
*)CALC_SCHEMA);
 
                         bundleContext_registerService(context, (char *) 
CALCULATOR_SERVICE, activator->service, properties, &activator->calculatorReg);
 

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/examples/calculator_service/public/include/calculator_service.h
----------------------------------------------------------------------
diff --git 
a/remote_services/examples/calculator_service/public/include/calculator_service.h
 
b/remote_services/examples/calculator_service/public/include/calculator_service.h
index 964653e..8e2f0dc 100644
--- 
a/remote_services/examples/calculator_service/public/include/calculator_service.h
+++ 
b/remote_services/examples/calculator_service/public/include/calculator_service.h
@@ -35,31 +35,6 @@ typedef struct calculator *calculator_pt;
 
 typedef struct calculator_service *calculator_service_pt;
 
-#define CALC_SCHEMA "[\"add(DD)D\",\"sub(DD)D\",\"sqrt(D)D\"]"
-
-/*
-purpose different schema setup
-{
-  "methods" : [ "add(DD)D", "sub(DD)D", "sqrt(D)D", abc(Labc_input;)D", 
sum([D)D" ],
-  "types" : {
-    "abc_input" : "DDD a b c"
-  }
-} 
-
-struct abc_input {
-    double a;
-    double b;
-    double c;
-}
-
-//for [D the following struct layout will be assumed
-struct double_sequence {
-    size_t _max;
-    size_t _length;
-    double *buffer;
-};
-*/
-
 /*
  * The calculator service definition corresponds to the following Java 
interface:
  *

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/examples/deploy.cmake
----------------------------------------------------------------------
diff --git a/remote_services/examples/deploy.cmake 
b/remote_services/examples/deploy.cmake
index 0b17811..0515917 100644
--- a/remote_services/examples/deploy.cmake
+++ b/remote_services/examples/deploy.cmake
@@ -16,10 +16,44 @@
 # under the License.
 is_enabled(RSA_EXAMPLES)
 if (RSA_EXAMPLES)
+    is_enabled(RSA_REMOTE_SERVICE_ADMIN_HTTP)
+    if (RSA_REMOTE_SERVICE_ADMIN_HTTP)
+        is_enabled(RSA_DISCOVERY_CONFIGURED)
+        if (RSA_DISCOVERY_CONFIGURED)
+            deploy("remote-services-cfg" BUNDLES discovery_configured 
topology_manager remote_service_admin_http calculator shell shell_tui 
log_service log_writer
+                                         ENDPOINTS
+                                            
org.apache.celix.calc.api.Calculator_endpoint
+                                            
org.apache.celix.calc.api.Calculator2_endpoint
+                                         PROPERTIES
+                                            RSA_PORT=8001
+                                            
DISCOVERY_CFG_POLL_ENDPOINTS=http://localhost:8082/org.apache.celix.discovery.configured
+                                            DISCOVERY_CFG_SERVER_PORT=8081)
+            deploy("remote-services-cfg-client" BUNDLES topology_manager 
remote_service_admin_http shell shell_tui log_service log_writer 
calculator_shell discovery_configured
+                                                ENDPOINTS 
org.apache.celix.calc.api.Calculator_proxy 
org.apache.celix.calc.api.Calculator2_proxy
+                                            PROPERTIES
+                                                RSA_PORT=8002
+                                                
DISCOVERY_CFG_POLL_ENDPOINTS=http://localhost:8081/org.apache.celix.discovery.configured
+                                                DISCOVERY_CFG_SERVER_PORT=8082)
+        endif ()
+    endif ()
+
+    is_enabled(RSA_REMOTE_SERVICE_ADMIN_SHM)
+    if (RSA_REMOTE_SERVICE_ADMIN_SHM)
+        is_enabled(RSA_DISCOVERY_SHM)
+        if (RSA_DISCOVERY_SHM)
+            deploy("remote-services-shm" BUNDLES discovery_shm 
topology_manager remote_service_admin_shm calculator shell shell_tui 
log_service log_writer
+                                         ENDPOINTS 
org.apache.celix.calc.api.Calculator_endpoint)
+            deploy("remote-services-shm-client" BUNDLES topology_manager 
remote_service_admin_shm shell shell_tui log_service log_writer 
calculator_shell discovery_shm
+                                                ENDPOINTS 
org.apache.celix.calc.api.Calculator_proxy)
+        endif ()
+    endif ()
+
     is_enabled(RSA_DISCOVERY_ETCD)
     if (RSA_DISCOVERY_ETCD)
-        deploy("remote-services-etcd" BUNDLES discovery_etcd topology_manager 
remote_service_admin_http calculator shell shell_tui log_service log_writer)
-        deploy("remote-services-etcd-client" BUNDLES topology_manager 
remote_service_admin_http shell shell_tui log_service log_writer 
calculator_shell discovery_etcd)
+        deploy("remote-services-etcd" BUNDLES discovery_etcd topology_manager 
remote_service_admin_http calculator shell shell_tui log_service log_writer
+                                     ENDPOINTS 
org.apache.celix.calc.api.Calculator_endpoint)
+        deploy("remote-services-etcd-client" BUNDLES topology_manager 
remote_service_admin_http shell shell_tui log_service log_writer 
calculator_shell discovery_etcd
+                                            ENDPOINTS 
org.apache.celix.calc.api.Calculator_proxy)
     endif ()
 
-endif (RSA_EXAMPLES)
+endif (RSA_EXAMPLES)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin/private/include/export_registration_impl.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin/private/include/export_registration_impl.h
 
b/remote_services/remote_service_admin/private/include/export_registration_impl.h
index ed38684..bb276f9 100644
--- 
a/remote_services/remote_service_admin/private/include/export_registration_impl.h
+++ 
b/remote_services/remote_service_admin/private/include/export_registration_impl.h
@@ -53,9 +53,6 @@ struct export_registration {
 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_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 
exportRegistration_setEndpointDescription(export_registration_pt registration, 
endpoint_description_pt endpointDescription);
 celix_status_t exportRegistration_startTracking(export_registration_pt 
registration);

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h
 
b/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h
index 10b012e..b28757b 100644
--- 
a/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h
+++ 
b/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h
@@ -32,16 +32,6 @@
 #define BUNDLE_STORE_PROPERTY_NAME "ENDPOINTS"
 #define DEFAULT_BUNDLE_STORE "endpoints"
 
-struct export_reference {
-       endpoint_description_pt endpoint;
-       service_reference_pt reference;
-};
-
-struct import_reference {
-       endpoint_description_pt endpoint;
-       service_reference_pt reference;
-};
-
 celix_status_t remoteServiceAdmin_create(bundle_context_pt context, 
remote_service_admin_pt *admin);
 celix_status_t remoteServiceAdmin_destroy(remote_service_admin_pt *admin);
 
@@ -54,13 +44,6 @@ celix_status_t 
remoteServiceAdmin_getImportedEndpoints(remote_service_admin_pt a
 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 exportReference_getExportedEndpoint(export_reference_pt 
reference, endpoint_description_pt *endpoint);
-celix_status_t exportReference_getExportedService(export_reference_pt 
reference);
-
-celix_status_t importReference_getImportedEndpoint(import_reference_pt 
reference);
-celix_status_t importReference_getImportedService(import_reference_pt 
reference);
-
 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/da86474f/remote_services/remote_service_admin/private/src/export_registration_impl.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin/private/src/export_registration_impl.c 
b/remote_services/remote_service_admin/private/src/export_registration_impl.c
index d6ce934..18cff6c 100644
--- 
a/remote_services/remote_service_admin/private/src/export_registration_impl.c
+++ 
b/remote_services/remote_service_admin/private/src/export_registration_impl.c
@@ -32,6 +32,12 @@
 #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);
@@ -175,7 +181,6 @@ celix_status_t exportRegistration_endpointRemoved(void * 
handle, service_referen
 
 celix_status_t exportRegistration_open(export_registration_pt registration) {
        celix_status_t status = CELIX_SUCCESS;
-  /*
        char *bundleStore = NULL;
 
        bundleContext_getProperty(registration->context, 
BUNDLE_STORE_PROPERTY_NAME, &bundleStore);
@@ -193,7 +198,6 @@ celix_status_t 
exportRegistration_open(export_registration_pt registration) {
                if (status == CELIX_SUCCESS) {
                }
        }
-  */
 
        return status;
 }
@@ -240,3 +244,17 @@ celix_status_t 
exportRegistration_setEndpointDescription(export_registration_pt
 
        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) {
+       celix_status_t status = CELIX_SUCCESS;
+       return status;
+}
+

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin/private/src/import_registration_impl.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin/private/src/import_registration_impl.c 
b/remote_services/remote_service_admin/private/src/import_registration_impl.c
index ecf6e09..a9eb70e 100644
--- 
a/remote_services/remote_service_admin/private/src/import_registration_impl.c
+++ 
b/remote_services/remote_service_admin/private/src/import_registration_impl.c
@@ -34,6 +34,12 @@
 #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);
@@ -254,3 +260,14 @@ celix_status_t 
importRegistration_getImportReference(import_registration_pt regi
 
        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/da86474f/remote_services/remote_service_admin/public/include/export_registration.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin/public/include/export_registration.h 
b/remote_services/remote_service_admin/public/include/export_registration.h
new file mode 100644
index 0000000..9332274
--- /dev/null
+++ b/remote_services/remote_service_admin/public/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);
+
+#endif //CELIX_EXPORT_REGISTRATION_H

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin/public/include/import_registration.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin/public/include/import_registration.h 
b/remote_services/remote_service_admin/public/include/import_registration.h
new file mode 100644
index 0000000..ef8193f
--- /dev/null
+++ b/remote_services/remote_service_admin/public/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/da86474f/remote_services/remote_service_admin/public/include/remote_service_admin.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin/public/include/remote_service_admin.h 
b/remote_services/remote_service_admin/public/include/remote_service_admin.h
index b5b42ae..274f2e4 100644
--- a/remote_services/remote_service_admin/public/include/remote_service_admin.h
+++ b/remote_services/remote_service_admin/public/include/remote_service_admin.h
@@ -29,13 +29,11 @@
 
 #include "endpoint_listener.h"
 #include "service_reference.h"
+#include "export_registration.h"
+#include "import_registration.h"
 
 #define OSGI_RSA_REMOTE_SERVICE_ADMIN "remote_service_admin"
 
-typedef struct export_reference *export_reference_pt;
-typedef struct export_registration *export_registration_pt;
-typedef struct import_reference *import_reference_pt;
-typedef struct import_registration *import_registration_pt;
 typedef struct import_registration_factory *import_registration_factory_pt;
 typedef struct remote_service_admin *remote_service_admin_pt;
 

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/CMakeLists.txt 
b/remote_services/remote_service_admin_dfi/CMakeLists.txt
index 3937605..b7a66f3 100644
--- a/remote_services/remote_service_admin_dfi/CMakeLists.txt
+++ b/remote_services/remote_service_admin_dfi/CMakeLists.txt
@@ -22,27 +22,38 @@ if (RSA_REMOTE_SERVICE_ADMIN_DFI)
 
     add_subdirectory(dynamic_function_interface)
 
+    include_directories(private/include)
+
     include_directories(${FFI_INCLUDE_DIRS})
     include_directories(${CURL_INCLUDE_DIRS})
     include_directories(${JANSSON_INCLUDE_DIRS})
+
     include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
+
     include_directories("${PROJECT_SOURCE_DIR}/log_service/public/include")
+
     
include_directories("${PROJECT_SOURCE_DIR}/remote_services/utils/private/include")
     
include_directories("${PROJECT_SOURCE_DIR}/remote_services/utils/public/include")
+
     
include_directories("${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/public/include")
-    
include_directories("${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/private/include")
     
include_directories("${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin_http/private/include")
+
     
include_directories("${PROJECT_SOURCE_DIR}/remote_services/endpoint_listener/public/include")
+    
include_directories("${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin_dfi/dynamic_function_interface")
+    
include_directories("${PROJECT_SOURCE_DIR}/remote_services/examples/calculator_service/public/include")
     
     SET_HEADER(BUNDLE_SYMBOLICNAME "apache_celix_remote_service_admin_dfi")
     SET(BUNDLE_VERSION "0.0.1")
     SET_HEADERS("Bundle-Name: Apache Celix Remote Service Admin HTTP for 
dynamic function interface")
     
     bundle(remote_service_admin_dfi SOURCES
-        private/src/remote_service_admin_impl
-        private/src/remote_service_admin_activator
-        
${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/private/src/export_registration_impl
-        
${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/private/src/import_registration_impl
+        private/src/remote_service_admin_dfi.c
+        private/src/remote_service_admin_activator.c
+        private/src/export_registration_dfi.c
+        private/src/import_registration_dfi.c
+
+        
${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/private/src/endpoint_description.c
+
         ${PROJECT_SOURCE_DIR}/remote_services/utils/private/src/civetweb.c
         ${PROJECT_SOURCE_DIR}/log_service/public/src/log_helper.c
     )

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/dynamic_function_interface/CMakeLists.txt
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/CMakeLists.txt
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/CMakeLists.txt
index ae1d5c3..0dad5e1 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/CMakeLists.txt
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/CMakeLists.txt
@@ -31,7 +31,7 @@ target_link_libraries(dfi ${FFI_LIBRARIES} ${JANSSON_LIBRARY})
 
 
 #if (FRAMEWORK_TESTS) TODO
-       add_executable(dfi_tests
+       add_executable(test_dfi
            tst/dyn_type_tests.cpp
            tst/dyn_function_tests.cpp
            tst/dyn_closure_tests.cpp
@@ -39,14 +39,14 @@ target_link_libraries(dfi ${FFI_LIBRARIES} 
${JANSSON_LIBRARY})
            tst/json_serializer_tests.cpp
            tst/run_tests.cpp
        )
-       target_link_libraries(dfi_tests dfi ${FFI_LIBRARIES} 
${CPPUTEST_LIBRARY} ${JANSSON_LIBRARY}) 
+       target_link_libraries(test_dfi dfi ${FFI_LIBRARIES} ${CPPUTEST_LIBRARY} 
${JANSSON_LIBRARY})
 
        add_custom_target(copy-input 
            COMMAND ${CMAKE_COMMAND} -E copy_directory 
${CMAKE_CURRENT_LIST_DIR}/schemas schemas
            COMMAND ${CMAKE_COMMAND} -E copy_directory 
${CMAKE_CURRENT_LIST_DIR}/descriptors descriptors
        )
-       add_dependencies(dfi_tests copy-input)
+       add_dependencies(test_dfi copy-input)
 
-    add_test(NAME run_dfi_tests COMMAND dfi_tests)
-       SETUP_TARGET_FOR_COVERAGE(dfi_tests_cov dfi_tests 
${CMAKE_BINARY_DIR}/coverage/dfi)
+    add_test(NAME run_test_dfi COMMAND test_dfi)
+       SETUP_TARGET_FOR_COVERAGE(test_dfi_cov test_dfi 
${CMAKE_BINARY_DIR}/coverage/dfi)
 #endif()

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_function.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_function.c
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_function.c
index 0ae2a8a..f80d26f 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_function.c
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_function.c
@@ -15,8 +15,6 @@
 #include "dyn_type.h"
 #include "dfi_log_util.h"
 
-DFI_SETUP_LOG(dynFunction)
-
 struct _dyn_function_type {
     char *name;
     struct types_head *refTypes; //NOTE not owned
@@ -45,6 +43,8 @@ static const int MEM_ERROR = 1;
 static const int PARSE_ERROR = 2;
 static const int ERROR = 2;
 
+DFI_SETUP_LOG(dynFunction)
+
 static int dynFunction_initCif(dyn_function_type *dynFunc);
 static int dynFunction_parseDescriptor(dyn_function_type *dynFunc, FILE 
*descriptor);
 static void dynFunction_ffiBind(ffi_cif *cif, void *ret, void *args[], void 
*userData); 
@@ -240,4 +240,31 @@ int dynFunction_getFnPointer(dyn_function_type *dynFunc, 
void (**fn)(void)) {
     return status;
 }
 
+int dynFunction_nrOfArguments(dyn_function_type *dynFunc) {
+    int count = 0;
+    dyn_function_argument_type *entry = NULL;
+    TAILQ_FOREACH(entry, &dynFunc->arguments, entries) {
+        count += 1;
+    }
+    return count;
+}
+
+dyn_type *dynFunction_argumentTypeForIndex(dyn_function_type *dynFunc, int 
argumentNr) {
+    dyn_type *result = NULL;
+    int index = 0;
+    dyn_function_argument_type *entry = NULL;
+    TAILQ_FOREACH(entry, &dynFunc->arguments, entries) {
+        if (index == argumentNr) {
+            result = entry->type;
+            break;
+        }
+        index +=1;
+    }
+    return result;
+}
+
+dyn_type * dynFunction_returnType(dyn_function_type *dynFunction) {
+    return dynFunction->funcReturn;
+}
+
 

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_function.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_function.h
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_function.h
index 2d5d6bb..b1abfb6 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_function.h
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_function.h
@@ -15,13 +15,16 @@
  */
 
 typedef struct _dyn_function_type dyn_function_type;
-typedef struct _dyn_closure_type dyn_closure_type;
 
 DFI_SETUP_LOG_HEADER(dynFunction);
 
 int dynFunction_parse(FILE *descriptorStream, struct types_head *refTypes, 
dyn_function_type **dynFunc);
 int dynFunction_parseWithStr(const char *descriptor, struct types_head 
*refTypes, dyn_function_type **dynFunc);
 
+int dynFunction_nrOfArguments(dyn_function_type *dynFunc);
+dyn_type *dynFunction_argumentTypeForIndex(dyn_function_type *dynFunc, int 
argumentNr);
+dyn_type * dynFunction_returnType(dyn_function_type *dynFunction);
+
 void dynFunction_destroy(dyn_function_type *dynFunc);
 int dynFunction_call(dyn_function_type *dynFunc, void(*fn)(void), void 
*returnValue, void **argValues);
 

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_interface.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_interface.c
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_interface.c
index 878cfea..5cd7104 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_interface.c
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_interface.c
@@ -12,6 +12,13 @@
 
 DFI_SETUP_LOG(dynInterface);
 
+struct _dyn_interface_type {
+    struct namvals_head header;
+    struct namvals_head annotations;
+    struct types_head types;
+    struct methods_head methods;
+};
+
 const int OK = 0;
 const int ERROR = 1;
 
@@ -369,3 +376,18 @@ static int dynInterface_getEntryForHead(struct 
namvals_head *head, const char *n
     }
     return status;
 }
+
+int dynInterface_methods(dyn_interface_type *intf, struct methods_head **list) 
{
+    int status = OK;
+    *list = &intf->methods;
+    return status;
+}
+
+int dynInterface_nrOfMethods(dyn_interface_type *intf) {
+    int count = 0;
+    struct method_entry *entry = NULL;
+    TAILQ_FOREACH(entry, &intf->methods, entries) {
+        count +=1;
+    }
+    return count;
+}

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_interface.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_interface.h
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_interface.h
index 0b0898f..f005bff 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_interface.h
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_interface.h
@@ -29,18 +29,11 @@ TAILQ_HEAD(methods_head, method_entry);
 
 typedef struct _dyn_interface_type dyn_interface_type;
 
-struct _dyn_interface_type {
-    struct namvals_head header;
-    struct namvals_head annotations;
-    struct types_head types;
-    struct methods_head methods;
-};
 
 struct method_entry {
     int index;
     char *id;
     char *name;
-
     dyn_function_type *dynFunc;
 
     TAILQ_ENTRY(method_entry) entries; 
@@ -53,6 +46,8 @@ int dynInterface_getName(dyn_interface_type *intf, char 
**name);
 int dynInterface_getVersion(dyn_interface_type *intf, char **version);
 int dynInterface_getHeaderEntry(dyn_interface_type *intf, const char *name, 
char **value);
 int dynInterface_getAnnotationEntry(dyn_interface_type *intf, const char 
*name, char **value);
+int dynInterface_methods(dyn_interface_type *intf, struct methods_head **list);
+int dynInterface_nrOfMethods(dyn_interface_type *intf);
 
 
 #endif

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_type.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_type.c
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_type.c
index 2946607..c8a9adb 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_type.c
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_type.c
@@ -763,6 +763,8 @@ static ffi_type * dynType_ffiTypeFor(int c) {
             break;
         case 'P' :
             type = &ffi_type_pointer;
+        case 'V' :
+            type = &ffi_type_void;
             break;
     }
     return type;

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_serializer.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_serializer.c
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_serializer.c
index 614e948..c6bda91 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_serializer.c
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_serializer.c
@@ -9,7 +9,7 @@
 #include <stdint.h>
 #include <string.h>
 
-static int jsonSerializer_createObject(dyn_type *type, json_t *object, void 
**result);
+static int jsonSerializer_createType(dyn_type *type, json_t *object, void 
**result);
 static int jsonSerializer_parseObject(dyn_type *type, json_t *object, void 
*inst);
 static int jsonSerializer_parseObjectMember(dyn_type *type, const char *name, 
json_t *val, void *inst);
 static int jsonSerializer_parseSequence(dyn_type *seq, json_t *array, void 
*seqLoc);
@@ -34,12 +34,7 @@ int jsonSerializer_deserialize(dyn_type *type, const char 
*input, void **result)
     json_t *root = json_loads(input, JSON_DECODE_ANY, &error);
 
     if (root != NULL) {
-        if (json_is_object(root)) {
-            status = jsonSerializer_createObject(type, root, result);
-        } else {
-            status = ERROR;
-            LOG_ERROR("Error expected root element to be an object");
-        }
+        status = jsonSerializer_deserializeJson(type, root, result);
         json_decref(root);
     } else {
         status = ERROR;
@@ -49,8 +44,12 @@ int jsonSerializer_deserialize(dyn_type *type, const char 
*input, void **result)
     return status;
 }
 
-static int jsonSerializer_createObject(dyn_type *type, json_t *object, void 
**result) {
-    assert(object != NULL);
+int jsonSerializer_deserializeJson(dyn_type *type, json_t *input, void **out) {
+    return jsonSerializer_createType(type, input, out);
+}
+
+static int jsonSerializer_createType(dyn_type *type, json_t *val, void 
**result) {
+    assert(val != NULL);
     int status = OK;
 
     void *inst = NULL;
@@ -58,7 +57,7 @@ static int jsonSerializer_createObject(dyn_type *type, json_t 
*object, void **re
 
     if (status == OK) {
         assert(inst != NULL);
-        status = jsonSerializer_parseObject(type, object, inst);
+        status = jsonSerializer_parseAny(type, inst, val);
 
         if (status != OK) {
             dynType_free(type, inst);
@@ -189,7 +188,7 @@ static int jsonSerializer_parseAny(dyn_type *type, void 
*loc, json_t *val) {
         case '*' :
             status = dynType_typedPointer_getTypedType(type, &subType);
             if (status == OK) {
-                status = jsonSerializer_createObject(subType, val, (void 
**)loc);
+                status = jsonSerializer_createType(subType, val, (void **) 
loc);
             }
             break;
         case 'P' :

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_serializer.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_serializer.h
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_serializer.h
index eb2e629..abfdd03 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_serializer.h
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_serializer.h
@@ -4,6 +4,7 @@
 #ifndef __JSON_SERIALIZER_H_
 #define __JSON_SERIALIZER_H_
 
+#include <jansson.h>
 #include "dfi_log_util.h"
 #include "dyn_type.h"
 
@@ -11,6 +12,8 @@
 DFI_SETUP_LOG_HEADER(jsonSerializer);
 
 int jsonSerializer_deserialize(dyn_type *type, const char *input, void 
**result);
+int jsonSerializer_deserializeJson(dyn_type *type, json_t *input, void 
**result);
+
 int jsonSerializer_serialize(dyn_type *type, void *input, char **output);
 
 #endif

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/dynamic_function_interface/tst/dyn_function_tests.cpp
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/tst/dyn_function_tests.cpp
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/tst/dyn_function_tests.cpp
index 410b3ec..9b681de 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/tst/dyn_function_tests.cpp
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/tst/dyn_function_tests.cpp
@@ -96,6 +96,31 @@ extern "C" {
         CHECK_EQUAL(2.2, returnVal);
         dynFunction_destroy(dynFunc);
     }
+
+    static void test_access_functions(void) {
+        dyn_function_type *dynFunc = NULL;
+        int rc;
+        rc = dynFunction_parseWithStr("add(D{DD a b}*D)V", NULL, &dynFunc);
+
+        CHECK_EQUAL(0, rc);
+
+        int nrOfArgs = dynFunction_nrOfArguments(dynFunc);
+        CHECK_EQUAL(3, nrOfArgs);
+
+        dyn_type *arg1 = dynFunction_argumentTypeForIndex(dynFunc, 1);
+        CHECK(arg1 != NULL);
+        CHECK_EQUAL('{', (char) dynType_descriptorType(arg1));
+
+        dyn_type *nonExist = dynFunction_argumentTypeForIndex(dynFunc, 10);
+        CHECK(nonExist == NULL);
+
+        dyn_type *returnType = dynFunction_returnType(dynFunc);
+        CHECK_EQUAL('V', (char) dynType_descriptorType(returnType));
+
+        dynFunction_destroy(dynFunc);
+    }
+
+
 }
 
 TEST_GROUP(DynFunctionTests) {
@@ -113,3 +138,7 @@ TEST(DynFunctionTests, DynFuncTest1) {
 TEST(DynFunctionTests, DynFuncTest2) {
     test_example2();
 }
+
+TEST(DynFunctionTests, DynFuncAccTest) {
+    test_access_functions();
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/dynamic_function_interface/tst/dyn_interface_tests.cpp
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/tst/dyn_interface_tests.cpp
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/tst/dyn_interface_tests.cpp
index 6453afd..679260f 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/tst/dyn_interface_tests.cpp
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/tst/dyn_interface_tests.cpp
@@ -57,7 +57,15 @@ extern "C" {
         status = dynInterface_getHeaderEntry(dynIntf, "nonExisting", 
&nonExist);
         CHECK(status != 0);
         CHECK(nonExist == NULL);
-        
+
+        struct methods_head *list = NULL;
+        status = dynInterface_methods(dynIntf, &list);
+        CHECK(status == 0);
+        CHECK(list != NULL);
+
+        int count = dynInterface_nrOfMethods(dynIntf);
+        CHECK_EQUAL(4, count);
+
         dynInterface_destroy(dynIntf);
     }
 

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/private/include/export_registration_dfi.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/private/include/export_registration_dfi.h
 
b/remote_services/remote_service_admin_dfi/private/include/export_registration_dfi.h
new file mode 100644
index 0000000..4faf9b9
--- /dev/null
+++ 
b/remote_services/remote_service_admin_dfi/private/include/export_registration_dfi.h
@@ -0,0 +1,21 @@
+/**
+ * Licensed under Apache License v2. See LICENSE for more information.
+ */
+#ifndef CELIX_EXPORT_REGISTRATION_DFI_H
+#define CELIX_EXPORT_REGISTRATION_DFI_H
+
+
+#include "export_registration.h"
+#include "log_helper.h"
+#include "endpoint_description.h"
+
+celix_status_t exportRegistration_create(log_helper_pt helper, 
service_reference_pt reference, endpoint_description_pt endpoint, 
bundle_context_pt context, export_registration_pt *registration);
+celix_status_t exportRegistration_destroy(export_registration_pt registration);
+
+celix_status_t exportRegistration_start(export_registration_pt registration);
+celix_status_t exportRegistration_stop(export_registration_pt registration);
+
+celix_status_t exportRegistration_call(export_registration_pt export, char 
*data, int datalength, char **response, int *responseLength);
+
+
+#endif //CELIX_EXPORT_REGISTRATION_DFI_H

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/private/include/import_registration_dfi.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/private/include/import_registration_dfi.h
 
b/remote_services/remote_service_admin_dfi/private/include/import_registration_dfi.h
new file mode 100644
index 0000000..d05375d
--- /dev/null
+++ 
b/remote_services/remote_service_admin_dfi/private/include/import_registration_dfi.h
@@ -0,0 +1,20 @@
+/**
+ * Licensed under Apache License v2. See LICENSE for more information.
+ */
+#ifndef CELIX_IMPORT_REGISTRATION_DFI_H
+#define CELIX_IMPORT_REGISTRATION_DFI_H
+
+#include "import_registration.h"
+
+#include <celix_errno.h>
+
+celix_status_t importRegistration_create(bundle_context_pt context, 
endpoint_description_pt  description, const char *classObject, 
import_registration_pt *import);
+void importRegistration_destroy(import_registration_pt import);
+
+celix_status_t importRegistration_start(import_registration_pt import);
+celix_status_t importRegistration_stop(import_registration_pt import);
+
+celix_status_t importRegistration_getService(import_registration_pt import, 
bundle_pt bundle, service_registration_pt registration, void **service);
+celix_status_t importRegistration_ungetService(import_registration_pt import, 
bundle_pt bundle, service_registration_pt registration, void **service);
+
+#endif //CELIX_IMPORT_REGISTRATION_DFI_H

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/private/include/remote_service_admin_http_impl.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/private/include/remote_service_admin_http_impl.h
 
b/remote_services/remote_service_admin_dfi/private/include/remote_service_admin_http_impl.h
index dbf71c9..65ca83b 100644
--- 
a/remote_services/remote_service_admin_dfi/private/include/remote_service_admin_http_impl.h
+++ 
b/remote_services/remote_service_admin_dfi/private/include/remote_service_admin_http_impl.h
@@ -27,7 +27,7 @@
 #ifndef REMOTE_SERVICE_ADMIN_HTTP_IMPL_H_
 #define REMOTE_SERVICE_ADMIN_HTTP_IMPL_H_
 
-#include "remote_service_admin_impl.h"
+#include "remote_service_admin.h"
 #include "log_helper.h"
 #include "civetweb.h"
 
@@ -47,6 +47,27 @@ struct remote_service_admin {
        struct mg_context *ctx;
 };
 
+
+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_stop(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(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 exportReference_getExportedEndpoint(export_reference_pt 
reference, endpoint_description_pt *endpoint);
+celix_status_t exportReference_getExportedService(export_reference_pt 
reference);
+
+celix_status_t importReference_getImportedEndpoint(import_reference_pt 
reference);
+celix_status_t importReference_getImportedService(import_reference_pt 
reference);
+
+celix_status_t 
remoteServiceAdmin_destroyEndpointDescription(endpoint_description_pt 
*description);
 
 #endif /* REMOTE_SERVICE_ADMIN_HTTP_IMPL_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/private/src/export_registration_dfi.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/private/src/export_registration_dfi.c
 
b/remote_services/remote_service_admin_dfi/private/src/export_registration_dfi.c
new file mode 100644
index 0000000..7814d0d
--- /dev/null
+++ 
b/remote_services/remote_service_admin_dfi/private/src/export_registration_dfi.c
@@ -0,0 +1,159 @@
+/**
+ * Licensed under Apache License v2. See LICENSE for more information.
+ */
+#include <jansson.h>
+#include <dyn_interface.h>
+#include <json_serializer.h>
+#include "export_registration.h"
+#include "export_registration_dfi.h"
+#include "endpoint_description.h"
+
+struct export_registration {
+    endpoint_description_pt endpointDescription;
+    service_reference_pt reference;
+    dyn_interface_type *intf;
+    void *service;
+    bundle_pt bundle;
+
+    bool closed;
+};
+
+struct export_reference {
+    endpoint_description_pt endpoint;
+    service_reference_pt reference;
+};
+
+typedef void (*GEN_FUNC_TYPE)(void);
+
+struct generic_service_layout {
+    void *handle;
+    GEN_FUNC_TYPE methods[];
+};
+
+celix_status_t exportRegistration_create(log_helper_pt helper, 
service_reference_pt reference, endpoint_description_pt endpoint, 
bundle_context_pt context, export_registration_pt *registration) {
+    celix_status_t status = CELIX_SUCCESS;
+    //TODO
+    return status;
+}
+
+celix_status_t exportRegistration_call(export_registration_pt export, char 
*data, int datalength, char **response, int *responseLength) {
+    int status = CELIX_SUCCESS;
+    //TODO lock/sema export
+
+    printf("Parsing data: %s\n", data);
+    json_error_t error;
+    json_t *js_request = json_loads(data, 0, &error);
+    const char *sig;
+    if (js_request) {
+        if (json_unpack(js_request, "{s:s}", "m", &sig) != 0) {
+            printf("RSA: Got error '%s'\n", error.text);
+        }
+    } else {
+        printf("RSA: got error '%s' for '%s'\n", error.text, data);
+        return 0;
+    }
+
+    printf("RSA: Looking for method %s\n", sig);
+
+    struct methods_head *methods = NULL;
+    dynInterface_methods(export->intf, &methods);
+    struct method_entry *entry = NULL;
+    struct method_entry *method = NULL;
+    TAILQ_FOREACH(entry, methods, entries) {
+        if (strcmp(sig, entry->id) == 0) {
+            method = entry;
+            break;
+        }
+    }
+
+    if (method == NULL) {
+        status = CELIX_ILLEGAL_STATE;
+    }
+
+    if (method != NULL) {
+
+        int nrOfArgs = dynFunction_nrOfArguments(method->dynFunc);
+        void *args[nrOfArgs + 1]; //arg 0 is handle
+        dyn_type *returnType = dynFunction_returnType(method->dynFunc);
+
+        json_t *arguments = json_object_get(js_request, "a");
+        json_t *value;
+        size_t index;
+        json_array_foreach(arguments, index, value) {
+            dyn_type *argType = 
dynFunction_argumentTypeForIndex(method->dynFunc, index + 1);
+            status = jsonSerializer_deserializeJson(argType, value, 
&(args[index + 1]));
+            index += 1;
+            if (status != 0) {
+                break;
+            }
+        }
+
+        json_decref(js_request);
+
+        struct generic_service_layout *serv = export->service;
+        args[0] = serv->handle;
+        void *returnVal = NULL;
+        dynType_alloc(returnType, &returnVal);
+        dynFunction_call(method->dynFunc, serv->methods[method->index], 
returnVal, args);
+
+        status = jsonSerializer_serialize(returnType, returnVal, response);
+        if (returnVal != NULL) {
+            dynType_free(returnType, returnVal);
+        }
+
+        ///TODO add more status checks
+    }
+
+    //TODO unlock/sema export
+    return status;
+}
+
+celix_status_t exportRegistration_destroy(export_registration_pt registration) 
{
+    celix_status_t status = CELIX_SUCCESS;
+    //TODO
+    return status;
+}
+
+celix_status_t exportRegistration_start(export_registration_pt registration) {
+    celix_status_t status = CELIX_SUCCESS;
+    //TODO
+    return status;
+}
+
+celix_status_t exportRegistration_stop(export_registration_pt registration) {
+    celix_status_t status = CELIX_SUCCESS;
+    //TODO
+    return status;
+}
+
+celix_status_t exportRegistration_close(export_registration_pt registration) {
+    celix_status_t status = CELIX_SUCCESS;
+    //TODO
+    return status;
+}
+
+celix_status_t exportRegistration_getException(export_registration_pt 
registration) {
+    celix_status_t status = CELIX_SUCCESS;
+    //TODO
+    return status;
+}
+
+celix_status_t exportRegistration_getExportReference(export_registration_pt 
registration, export_reference_pt *reference) {
+    celix_status_t status = CELIX_SUCCESS;
+    //TODO
+    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) {
+    celix_status_t status = CELIX_SUCCESS;
+    return status;
+}
+
+
+

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/private/src/import_registration_dfi.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/private/src/import_registration_dfi.c
 
b/remote_services/remote_service_admin_dfi/private/src/import_registration_dfi.c
new file mode 100644
index 0000000..f8c544c
--- /dev/null
+++ 
b/remote_services/remote_service_admin_dfi/private/src/import_registration_dfi.c
@@ -0,0 +1,231 @@
+#include <malloc.h>
+#include "dyn_interface.h"
+#include "import_registration.h"
+#include "import_registration_dfi.h"
+
+struct import_registration {
+    bundle_context_pt context;
+    endpoint_description_pt  endpoint; //TODO owner? -> free when destroyed
+    const char *classObject; //NOTE owned by endpoint
+
+    service_factory_pt factory;
+    service_registration_pt factoryReg;
+
+    hash_map_pt proxies; //key -> bundle, value -> service_proxy
+};
+
+struct service_proxy {
+    dyn_interface_type *intf;
+    void *service;
+    int count;
+};
+
+static celix_status_t importRegistration_createProxy(import_registration_pt 
import, bundle_pt bundle,
+                                              struct service_proxy **proxy);
+static void importRegistration_proxyFunc(void *userData, void *args[], void 
*returnVal);
+static void importRegistration_destroyProxy(struct service_proxy *proxy);
+
+celix_status_t importRegistration_create(bundle_context_pt context, 
endpoint_description_pt  endpoint, const char *classObject, 
import_registration_pt *out) {
+    celix_status_t status = CELIX_SUCCESS;
+    import_registration_pt reg = calloc(1, sizeof(*reg));
+
+    if (reg != NULL) {
+        reg->factory = calloc(1, sizeof(*reg->factory));
+    }
+
+    if (reg != NULL && reg->factory != NULL) {
+        reg->context = context;
+        reg->endpoint = endpoint;
+        reg->classObject = classObject;
+        reg->proxies = hashMap_create(NULL, NULL, NULL, NULL);
+
+        reg->factory->factory = reg;
+        reg->factory->getService = (void *)importRegistration_getService;
+        reg->factory->ungetService = (void *)importRegistration_ungetService;
+    } else {
+        status = CELIX_ENOMEM;
+    }
+
+    if (status == CELIX_SUCCESS) {
+        *out = reg;
+    }
+
+    return status;
+}
+
+void importRegistration_destroy(import_registration_pt import) {
+    if (import != NULL) {
+        if (import->factory != NULL) {
+            free(import->factory);
+        }
+        free(import);
+    }
+}
+
+celix_status_t importRegistration_start(import_registration_pt import) {
+    celix_status_t  status = CELIX_SUCCESS;
+    if (import->factoryReg == NULL && import->factory != NULL) {
+        status = bundleContext_registerServiceFactory(import->context, (char 
*)import->classObject, import->factory, NULL /*TODO*/, &import->factoryReg);
+    } else {
+        status = CELIX_ILLEGAL_STATE;
+    }
+    return status;
+}
+
+celix_status_t importRegistration_stop(import_registration_pt import) {
+    celix_status_t status = CELIX_SUCCESS;
+    if (import->factoryReg != NULL) {
+        serviceRegistration_unregister(import->factoryReg);
+    }
+    //TODO unregister every serv instance?
+    return status;
+}
+
+
+celix_status_t importRegistration_getService(import_registration_pt import, 
bundle_pt bundle, service_registration_pt registration, void **out) {
+    celix_status_t  status = CELIX_SUCCESS;
+    struct service_proxy *proxy = hashMap_get(import->proxies, bundle); //TODO 
lock
+    if (proxy == NULL) {
+        status = importRegistration_createProxy(import, bundle, &proxy);
+        if (status == CELIX_SUCCESS) {
+            hashMap_put(import->proxies, bundle, proxy); //TODO lock
+        }
+    }
+
+    if (status == CELIX_SUCCESS) {
+        proxy->count += 1;
+        *out = proxy->service;
+    }
+
+    return status;
+}
+
+static celix_status_t importRegistration_createProxy(import_registration_pt 
import, bundle_pt bundle, struct service_proxy **out) {
+    celix_status_t  status = CELIX_SUCCESS;
+
+    char *descriptorFile = NULL;
+    char name[128];
+    snprintf(name, 128, "%s.descriptor", import->classObject);
+    status = bundle_getEntry(bundle, name, &descriptorFile);
+    if (status != CELIX_SUCCESS) {
+        printf("Cannot find entry '%s'\n", name);
+    }
+
+    struct service_proxy *proxy = NULL;
+    if (status == CELIX_SUCCESS) {
+        proxy = calloc(1, sizeof(*proxy));
+        if (proxy != NULL) {
+
+        } else {
+            status = CELIX_ENOMEM;
+        }
+    }
+
+    if (status == CELIX_SUCCESS) {
+        FILE *df = fopen(descriptorFile, "r");
+        if (df != NULL) {
+            int rc = dynInterface_parse(df, &proxy->intf);
+            fclose(df);
+            if (rc != 0) {
+                status = CELIX_BUNDLE_EXCEPTION;
+            }
+        }
+    }
+
+    void **serv = NULL;
+    if (status == CELIX_SUCCESS) {
+        size_t count = dynInterface_nrOfMethods(proxy->intf);
+        serv = calloc(1 + count, sizeof(void *));
+        serv[0] = proxy;
+
+        struct methods_head *list = NULL;
+        dynInterface_methods(proxy->intf, &list);
+        struct method_entry *entry = NULL;
+        void (*fn)(void);
+        int index = 0;
+        TAILQ_FOREACH(entry, list, entries) {
+            int rc = dynFunction_createClosure(entry->dynFunc, 
importRegistration_proxyFunc, entry, &fn);
+            serv[index + 1] = fn;
+            index += 1;
+
+            if (rc != 0) {
+                status = CELIX_BUNDLE_EXCEPTION;
+                break;
+            }
+        }
+    }
+
+    if (status == CELIX_SUCCESS) {
+        proxy->service = serv;
+    } else {
+        if (serv != NULL) {
+            free(serv);
+        }
+    }
+
+    if (status == CELIX_SUCCESS) {
+        *out = proxy;
+    }
+
+    return status;
+}
+
+static void importRegistration_proxyFunc(void *userData, void *args[], void 
*returnVal) {
+    struct method_entry *entry = userData;
+    //struct proxy_service *proxy = args[0];
+
+    printf("Calling function '%s'\n", entry->id);
+
+    //TODO
+}
+
+celix_status_t importRegistration_ungetService(import_registration_pt import, 
bundle_pt bundle, service_registration_pt registration, void **out) {
+    celix_status_t  status = CELIX_SUCCESS;
+    struct service_proxy *proxy = hashMap_get(import->proxies, bundle); //TODO 
lock
+    if (proxy != NULL) {
+        if (*out == proxy->service) {
+            proxy->count -= 1;
+        } else {
+            status = CELIX_ILLEGAL_ARGUMENT;
+        }
+
+        if (proxy->count == 0) {
+            importRegistration_destroyProxy(proxy);
+        }
+    }
+
+    return status;
+}
+
+static void importRegistration_destroyProxy(struct service_proxy *proxy) {
+    //TODO
+}
+
+
+celix_status_t importRegistration_close(import_registration_pt registration) {
+    celix_status_t status = CELIX_SUCCESS;
+    //TODO
+    return status;
+}
+
+celix_status_t importRegistration_getException(import_registration_pt 
registration) {
+    celix_status_t status = CELIX_SUCCESS;
+    //TODO
+    return status;
+}
+
+celix_status_t importRegistration_getImportReference(import_registration_pt 
registration, import_reference_pt *reference) {
+    celix_status_t status = CELIX_SUCCESS;
+    //TODO
+    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;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/celix/blob/da86474f/remote_services/remote_service_admin_dfi/private/src/remote_service_admin_activator.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/private/src/remote_service_admin_activator.c
 
b/remote_services/remote_service_admin_dfi/private/src/remote_service_admin_activator.c
index e4125fc..9961a9b 100644
--- 
a/remote_services/remote_service_admin_dfi/private/src/remote_service_admin_activator.c
+++ 
b/remote_services/remote_service_admin_dfi/private/src/remote_service_admin_activator.c
@@ -29,8 +29,8 @@
 #include "service_registration.h"
 
 #include "remote_service_admin_http_impl.h"
-#include "export_registration_impl.h"
-#include "import_registration_impl.h"
+#include "export_registration_dfi.h"
+#include "import_registration_dfi.h"
 
 struct activator {
        remote_service_admin_pt admin;

Reply via email to