You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2017/11/21 20:08:11 UTC

[14/19] celix git commit: CELIX-417: Refactor for CMake usage in RSA, PSA and Docker. mostly trying to identify the api and common libraries

http://git-wip-us.apache.org/repos/asf/celix/blob/2a670f26/remote_services/discovery/private/src/discovery_activator.c
----------------------------------------------------------------------
diff --git a/remote_services/discovery/private/src/discovery_activator.c b/remote_services/discovery/private/src/discovery_activator.c
deleted file mode 100644
index 3267d25..0000000
--- a/remote_services/discovery/private/src/discovery_activator.c
+++ /dev/null
@@ -1,186 +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.
- */
-/*
- * discovery_activator.c
- *
- * \date        Aug 8, 2014
- * \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright	Apache License, Version 2.0
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-#include "bundle_activator.h"
-#include "service_tracker.h"
-#include "constants.h"
-
-#include "log_helper.h"
-#include "discovery.h"
-#include "remote_constants.h"
-
-struct activator {
-	bundle_context_pt context;
-	discovery_pt discovery;
-	log_helper_pt loghelper;
-
-	service_tracker_pt endpointListenerTracker;
-	endpoint_listener_pt endpointListener;
-	service_registration_pt endpointListenerService;
-};
-
-celix_status_t bundleActivator_createEPLTracker(struct activator *activator, service_tracker_pt *tracker) {
-	celix_status_t status;
-
-	service_tracker_customizer_pt customizer = NULL;
-
-	status = serviceTrackerCustomizer_create(activator->discovery, discovery_endpointListenerAdding, discovery_endpointListenerAdded, discovery_endpointListenerModified,
-			discovery_endpointListenerRemoved, &customizer);
-
-	if (status == CELIX_SUCCESS) {
-		status = serviceTracker_create(activator->context, (char *) OSGI_ENDPOINT_LISTENER_SERVICE, customizer, tracker);
-	}
-
-	return status;
-}
-
-celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) {
-	celix_status_t status;
-
-	struct activator* activator = calloc(1,sizeof(struct activator));
-	if (!activator) {
-		return CELIX_ENOMEM;
-	}
-
-	status = discovery_create(context, &activator->discovery);
-	if (status == CELIX_SUCCESS) {
-		activator->context = context;
-
-		logHelper_create(context, &activator->loghelper);
-
-		status = bundleActivator_createEPLTracker(activator, &activator->endpointListenerTracker);
-		if(status==CELIX_SUCCESS){
-			*userData = activator;
-		}
-		else{
-			bundleActivator_destroy(activator,context);
-		}
-	}
-	else{
-		free(activator);
-	}
-
-	return status;
-}
-
-celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) {
-	celix_status_t status;
-	struct activator *activator = userData;
-	const char *uuid = NULL;
-
-	logHelper_start(activator->loghelper);
-
-	status = bundleContext_getProperty(context, OSGI_FRAMEWORK_FRAMEWORK_UUID, &uuid);
-	if (!uuid) {
-		logHelper_log(activator->loghelper, OSGI_LOGSERVICE_DEBUG, "no framework UUID defined?!");
-		return CELIX_ILLEGAL_STATE;
-	}
-
-	size_t len = 11 + strlen(OSGI_FRAMEWORK_OBJECTCLASS) + strlen(OSGI_RSA_ENDPOINT_FRAMEWORK_UUID) + strlen(uuid);
-	char *scope = malloc(len + 1);
-	if (!scope) {
-		return CELIX_ENOMEM;
-	}
-
-	sprintf(scope, "(&(%s=*)(%s=%s))", OSGI_FRAMEWORK_OBJECTCLASS, OSGI_RSA_ENDPOINT_FRAMEWORK_UUID, uuid);
-	scope[len] = 0;
-
-	logHelper_log(activator->loghelper, OSGI_LOGSERVICE_DEBUG, "using scope %s.", scope);
-
-	properties_pt props = properties_create();
-	properties_set(props, "DISCOVERY", "true");
-	properties_set(props, (char *) OSGI_ENDPOINT_LISTENER_SCOPE, scope);
-
-	if (status == CELIX_SUCCESS) {
-		status = serviceTracker_open(activator->endpointListenerTracker);
-	}
-
-	if (status == CELIX_SUCCESS) {
-		status = discovery_start(activator->discovery);
-	}
-
-	if (status == CELIX_SUCCESS) {
-		endpoint_listener_pt endpointListener = calloc(1, sizeof(struct endpoint_listener));
-
-		if (endpointListener) {
-			endpointListener->handle = activator->discovery;
-			endpointListener->endpointAdded = discovery_endpointAdded;
-			endpointListener->endpointRemoved = discovery_endpointRemoved;
-
-			status = bundleContext_registerService(context, (char *) OSGI_ENDPOINT_LISTENER_SERVICE, endpointListener, props, &activator->endpointListenerService);
-
-			if (status == CELIX_SUCCESS) {
-				activator->endpointListener = endpointListener;
-			}
-		}
-	}
-	// We can release the scope, as properties_set makes a copy of the key & value...
-	free(scope);
-
-	return status;
-}
-
-celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) {
-	celix_status_t status;
-	struct activator *activator = userData;
-
-	status = discovery_stop(activator->discovery);
-
-	status = serviceTracker_close(activator->endpointListenerTracker);
-
-	status = serviceRegistration_unregister(activator->endpointListenerService);
-	free(activator->endpointListener);
-
-	logHelper_stop(activator->loghelper);
-
-	return status;
-}
-
-celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) {
-	celix_status_t status;
-	struct activator *activator = userData;
-
-	status = serviceTracker_destroy(activator->endpointListenerTracker);
-
-	status = discovery_destroy(activator->discovery);
-
-	logHelper_destroy(&activator->loghelper);
-
-	activator->loghelper = NULL;
-	activator->endpointListenerTracker = NULL;
-	activator->endpointListenerService = NULL;
-	activator->discovery = NULL;
-	activator->context = NULL;
-
-	free(activator);
-
-	return status;
-}

http://git-wip-us.apache.org/repos/asf/celix/blob/2a670f26/remote_services/discovery/private/src/endpoint_descriptor_reader.c
----------------------------------------------------------------------
diff --git a/remote_services/discovery/private/src/endpoint_descriptor_reader.c b/remote_services/discovery/private/src/endpoint_descriptor_reader.c
deleted file mode 100644
index ea176bf..0000000
--- a/remote_services/discovery/private/src/endpoint_descriptor_reader.c
+++ /dev/null
@@ -1,387 +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.
- */
-/*
- * endpoint_descriptor_reader.c
- *
- *  \date       24 Jul 2014
- *  \author     <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- *  \copyright  Apache License, Version 2.0
- */
-
-#include <stdbool.h>
-#include <string.h>
-#include <libxml/xmlreader.h>
-
-#include "log_helper.h"
-#include "remote_constants.h"
-
-#include "endpoint_description.h"
-#include "endpoint_descriptor_common.h"
-#include "endpoint_descriptor_reader.h"
-
-struct endpoint_descriptor_reader {
-    xmlTextReaderPtr reader;
-    log_helper_pt* loghelper;
-};
-
-static valueType valueTypeFromString(char *name);
-
-celix_status_t endpointDescriptorReader_create(endpoint_discovery_poller_pt poller, endpoint_descriptor_reader_pt *reader) {
-    celix_status_t status = CELIX_SUCCESS;
-
-    *reader = malloc(sizeof(**reader));
-    if (!*reader) {
-        status = CELIX_ENOMEM;
-    } else {
-        (*reader)->reader = NULL;
-        (*reader)->loghelper = poller->loghelper;
-    }
-
-    return status;
-}
-
-celix_status_t endpointDescriptorReader_destroy(endpoint_descriptor_reader_pt reader) {
-    celix_status_t status = CELIX_SUCCESS;
-
-    reader->loghelper = NULL;
-
-    free(reader);
-
-    return status;
-}
-
-void endpointDescriptorReader_addSingleValuedProperty(properties_pt properties, const xmlChar* name, const xmlChar* value) {
-	properties_set(properties, (char *) name, (char*) value);
-}
-
-void endpointDescriptorReader_addMultiValuedProperty(properties_pt properties, const xmlChar* name, array_list_pt values) {
-	char *value = calloc(256, sizeof(*value));
-	if (value) {
-		unsigned int size = arrayList_size(values);
-        unsigned int i;
-        for (i = 0; i < size; i++) {
-			char* item = (char*) arrayList_get(values, i);
-			if (i > 0) {
-				value = strcat(value, ",");
-			}
-			value = strcat(value, item);
-		}
-
-		properties_set(properties, (char *) name, value);
-
-		free(value);
-	}
-}
-
-celix_status_t endpointDescriptorReader_parseDocument(endpoint_descriptor_reader_pt reader, char *document, array_list_pt *endpoints) {
-    celix_status_t status = CELIX_SUCCESS;
-
-    reader->reader = xmlReaderForMemory(document, (int) strlen(document), NULL, "UTF-8", 0);
-    if (reader->reader == NULL) {
-        status = CELIX_BUNDLE_EXCEPTION;
-    } else {
-        bool inProperty = false;
-        bool inXml = false;
-        bool inArray = false;
-        bool inList = false;
-        bool inSet = false;
-        bool inValue = false;
-
-        const xmlChar *propertyName = NULL;
-        const xmlChar *propertyValue = NULL;
-        valueType propertyType = VALUE_TYPE_STRING;
-        xmlChar *valueBuffer = xmlMalloc(256);
-        valueBuffer[0] = '\0';
-
-        array_list_pt propertyValues = NULL;
-        arrayList_create(&propertyValues);
-
-        array_list_pt endpointDescriptions = NULL;
-        if (*endpoints) {
-        	// use the given arraylist...
-        	endpointDescriptions = *endpoints;
-        } else {
-			arrayList_create(&endpointDescriptions);
-			// return the read endpoints...
-			*endpoints = endpointDescriptions;
-        }
-
-        properties_pt endpointProperties = NULL;
-
-        int read = xmlTextReaderRead(reader->reader);
-        while (read == XML_TEXTREADER_MODE_INTERACTIVE) {
-            int type = xmlTextReaderNodeType(reader->reader);
-
-            if (type == XML_READER_TYPE_ELEMENT) {
-                const xmlChar *localname = xmlTextReaderConstLocalName(reader->reader);
-
-                if (inXml) {
-                    valueBuffer = xmlStrcat(valueBuffer, BAD_CAST "<");
-                    valueBuffer = xmlStrcat(valueBuffer, localname);
-
-                    int i = xmlTextReaderMoveToFirstAttribute(reader->reader);
-                    while (i == 1) {
-                        const xmlChar *name = xmlTextReaderConstName(reader->reader);
-                        const xmlChar *value = xmlTextReaderConstValue(reader->reader);
-
-                        valueBuffer = xmlStrcat(valueBuffer, BAD_CAST " ");
-                        valueBuffer = xmlStrcat(valueBuffer, name);
-                        valueBuffer = xmlStrcat(valueBuffer, BAD_CAST "=\"");
-                        valueBuffer = xmlStrcat(valueBuffer, BAD_CAST value);
-                        valueBuffer = xmlStrcat(valueBuffer, BAD_CAST "\"");
-
-                        i = xmlTextReaderMoveToNextAttribute(reader->reader);
-                    }
-
-                    valueBuffer = xmlStrcat(valueBuffer, BAD_CAST ">");
-                } else if (xmlStrcmp(localname, ENDPOINT_DESCRIPTION) == 0) {
-
-                	if (endpointProperties != NULL)
-                		properties_destroy(endpointProperties);
-
-                    endpointProperties = properties_create();
-                } else if (xmlStrcmp(localname, PROPERTY) == 0) {
-                    inProperty = true;
-
-                    propertyName = xmlTextReaderGetAttribute(reader->reader, NAME);
-                    propertyValue = xmlTextReaderGetAttribute(reader->reader, VALUE);
-                    xmlChar *vtype = xmlTextReaderGetAttribute(reader->reader, VALUE_TYPE);
-                    propertyType = valueTypeFromString((char*) vtype);
-                    arrayList_clear(propertyValues);
-
-                    if (xmlTextReaderIsEmptyElement(reader->reader)) {
-                        inProperty = false;
-
-                        if (propertyValue != NULL) {
-                        	endpointDescriptorReader_addSingleValuedProperty(endpointProperties, propertyName, propertyValue);
-                        }
-
-                        xmlFree((void *) propertyName);
-                        xmlFree((void *) propertyValue);
-                        xmlFree((void *) vtype);
-                    }
-                } else {
-                    valueBuffer[0] = 0;
-                    inArray |= inProperty && xmlStrcmp(localname, ARRAY) == 0;
-                    inList |= inProperty && xmlStrcmp(localname, LIST) == 0;
-                    inSet |= inProperty && xmlStrcmp(localname, SET) == 0;
-                    inXml |= inProperty && xmlStrcmp(localname, XML) == 0;
-                    inValue |= inProperty && xmlStrcmp(localname, VALUE) == 0;
-				}
-			} else if (type == XML_READER_TYPE_END_ELEMENT) {
-				const xmlChar *localname = xmlTextReaderConstLocalName(reader->reader);
-
-                if (inXml) {
-                    if (xmlStrcmp(localname, XML) != 0)  {
-                    	valueBuffer = xmlStrcat(valueBuffer, BAD_CAST "</");
-                    	valueBuffer = xmlStrcat(valueBuffer, localname);
-                    	valueBuffer = xmlStrcat(valueBuffer, BAD_CAST ">");
-                    }
-                    else {
-                        inXml = false;
-                    }
-                } else if (xmlStrcmp(localname, ENDPOINT_DESCRIPTION) == 0) {
-                    endpoint_description_pt endpointDescription = NULL;
-                    // Completely parsed endpoint description, add it to our list of results...
-                    if(endpointDescription_create(endpointProperties, &endpointDescription) == CELIX_SUCCESS){
-			arrayList_add(endpointDescriptions, endpointDescription);
-                    }
-
-                    endpointProperties = properties_create();
-                } else if (xmlStrcmp(localname, PROPERTY) == 0) {
-                    inProperty = false;
-
-                    if (inArray || inList || inSet) {
-						endpointDescriptorReader_addMultiValuedProperty(endpointProperties, propertyName, propertyValues);
-                    }
-                    else if (propertyValue != NULL) {
-                    	if (propertyType != VALUE_TYPE_STRING) {
-                    		logHelper_log(*reader->loghelper, OSGI_LOGSERVICE_WARNING, "ENDPOINT_DESCRIPTOR_READER: Only string support for %s\n", propertyName);
-                    	}
-                    	endpointDescriptorReader_addSingleValuedProperty(endpointProperties, propertyName, propertyValue);
-
-                        xmlFree((void *) propertyValue);
-                    }
-                    else {
-                    	endpointDescriptorReader_addSingleValuedProperty(endpointProperties, propertyName, valueBuffer);
-                    }
-
-                    xmlFree((void *) propertyName);
-					unsigned int k=0;
-					for(;k<arrayList_size(propertyValues);k++){
-						free(arrayList_get(propertyValues,k));
-					}
-                    arrayList_clear(propertyValues);
-
-                    propertyType = VALUE_TYPE_STRING;
-                    inArray = false;
-                    inList = false;
-                    inSet = false;
-                    inXml = false;
-                } else if (xmlStrcmp(localname, VALUE) == 0) {
-                    arrayList_add(propertyValues, strdup((char*) valueBuffer));
-                    valueBuffer[0] = 0;
-                    inValue = false;
-                }
-            } else if (type == XML_READER_TYPE_TEXT) {
-                if (inValue || inXml) {
-                    const xmlChar *value = xmlTextReaderValue(reader->reader);
-                    valueBuffer = xmlStrcat(valueBuffer, value);
-                    xmlFree((void *)value);
-                }
-            }
-
-            read = xmlTextReaderRead(reader->reader);
-        }
-
-		if(endpointProperties!=NULL){
-			properties_destroy(endpointProperties);
-		}
-
-		unsigned int k=0;
-		for(;k<arrayList_size(propertyValues);k++){
-			free(arrayList_get(propertyValues,k));
-		}
-        arrayList_destroy(propertyValues);
-        xmlFree(valueBuffer);
-
-        xmlFreeTextReader(reader->reader);
-    }
-
-    return status;
-}
-
-static valueType valueTypeFromString(char *name) {
-    if (name == NULL || strcmp(name, "") == 0 || strcmp(name, "String") == 0) {
-        return VALUE_TYPE_STRING;
-    } else if (strcmp(name, "long") == 0 || strcmp(name, "Long") == 0) {
-        return VALUE_TYPE_LONG;
-    } else if (strcmp(name, "double") == 0 || strcmp(name, "Double") == 0) {
-        return VALUE_TYPE_DOUBLE;
-    } else if (strcmp(name, "float") == 0 || strcmp(name, "Float") == 0) {
-        return VALUE_TYPE_FLOAT;
-    } else if (strcmp(name, "int") == 0 || strcmp(name, "integer") == 0 || strcmp(name, "Integer") == 0) {
-        return VALUE_TYPE_INTEGER;
-    } else if (strcmp(name, "short") == 0 || strcmp(name, "Short") == 0) {
-        return VALUE_TYPE_SHORT;
-    } else if (strcmp(name, "byte") == 0 || strcmp(name, "Byte") == 0) {
-        return VALUE_TYPE_BYTE;
-    } else if (strcmp(name, "char") == 0 || strcmp(name, "Character") == 0) {
-        return VALUE_TYPE_CHAR;
-    } else if (strcmp(name, "boolean") == 0 || strcmp(name, "Boolean") == 0) {
-        return VALUE_TYPE_BOOLEAN;
-    } else {
-        return VALUE_TYPE_STRING;
-    }
-}
-
-#ifdef RSA_ENDPOINT_TEST_READER
-int main() {
-    array_list_pt list = NULL;
-    endpoint_descriptor_reader_pt reader = NULL;
-
-    char *doc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-"<endpoint-descriptions xmlns=\"http://www.osgi.org/xmlns/rsa/v1.0.0\">"
-    "<endpoint-description>"
-    	"<property name=\"endpoint.service.id\" value-type=\"long\" value=\"6\"/>"
-		"<property name=\"endpoint.framework.uuid\" value=\"2983D849-93B1-4C2C-AC6D-5BCDA93ACB96\"/>"
-        "<property name=\"service.intents\">"
-            "<list>"
-                "<value>SOAP</value>"
-                "<value>HTTP</value>"
-            "</list>"
-        "</property>"
-        "<property name=\"endpoint.id\" value=\"11111111-1111-1111-1111-111111111111\" />"
-        "<property name=\"objectClass\"><array><value>com.acme.Foo</value></array></property>"
-        "<property name=\"endpoint.package.version.com.acme\" value=\"4.2\" />"
-        "<property name=\"service.imported.configs\" value=\"com.acme\" />"
-    	"<property name=\"service.imported\" value=\"true\"/>"
-        "<property name=\"com.acme.ws.xml\">"
-            "<xml>"
-                "<config xmlns=\"http://acme.com/defs\">"
-                    "<port>1029</port>"
-                    "<host>www.acme.com</host>"
-                "</config>"
-            "</xml>"
-        "</property>"
-    "</endpoint-description>"
-		"<endpoint-description>"
-        	"<property name=\"endpoint.service.id\" value-type=\"long\" value=\"5\"/>"
-    		"<property name=\"endpoint.framework.uuid\" value=\"2983D849-93B1-4C2C-AC6D-5BCDA93ACB96\"/>"
-			"<property name=\"service.intents\">"
-				"<list>"
-					"<value>SOAP</value>"
-					"<value>HTTP</value>"
-				"</list>"
-			"</property>"
-			"<property name=\"endpoint.id\" value=\"22222222-2222-2222-2222-222222222222\" />"
-            "<property name=\"objectClass\"><array><value>com.acme.Bar</value></array></property>"
-			"<property name=\"endpoint.package.version.com.acme\" value=\"4.2\" />"
-			"<property name=\"service.imported.configs\" value=\"com.acme\" />"
-			"<property name=\"com.acme.ws.xml\">"
-				"<xml>"
-					"<config xmlns=\"http://acme.com/defs\">"
-						"<port>1029</port>"
-						"<host>www.acme.com</host>"
-					"</config>"
-				"</xml>"
-			"</property>"
-		"</endpoint-description>"
-	"</endpoint-descriptions>";
-
-	endpointDescriptorReader_create(&reader);
-
-	endpointDescriptorReader_parseDocument(reader, doc, &list);
-
-	int i;
-	for (i = 0; i < arrayList_size(list); i++) {
-		printf("\nEndpoint description #%d:\n", (i+1));
-		endpoint_description_pt edp = arrayList_get(list, i);
-		printf("Id: %s\n", edp->id);
-		printf("Service Id: %lu\n", edp->serviceId);
-		printf("Framework UUID: %s\n", edp->frameworkUUID);
-		printf("Service: %s\n", edp->service);
-
-		properties_pt props = edp->properties;
-		if (props) {
-			printf("Service properties:\n");
-			hash_map_iterator_pt iter = hashMapIterator_create(props);
-			while (hashMapIterator_hasNext(iter)) {
-				hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
-
-				printf("- %s => '%s'\n", hashMapEntry_getKey(entry), hashMapEntry_getValue(entry));
-			}
-			hashMapIterator_destroy(iter);
-		} else {
-			printf("No service properties...\n");
-		}
-
-
-		endpointDescription_destroy(edp);
-	}
-
-	if (list != NULL) {
-		arrayList_destroy(list);
-	}
-
-	endpointDescriptorReader_destroy(reader);
-
-    return 0;
-}
-#endif

http://git-wip-us.apache.org/repos/asf/celix/blob/2a670f26/remote_services/discovery/private/src/endpoint_descriptor_writer.c
----------------------------------------------------------------------
diff --git a/remote_services/discovery/private/src/endpoint_descriptor_writer.c b/remote_services/discovery/private/src/endpoint_descriptor_writer.c
deleted file mode 100644
index 71b07b4..0000000
--- a/remote_services/discovery/private/src/endpoint_descriptor_writer.c
+++ /dev/null
@@ -1,233 +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.
- */
-/*
- * endpoint_descriptor_writer.c
- *
- *  \date       26 Jul 2014
- *  \author     <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- *  \copyright  Apache License, Version 2.0
- */
-#include <stdlib.h>
-#include <string.h>
-#include <libxml/xmlwriter.h>
-
-#include "constants.h"
-#include "remote_constants.h"
-
-#include "endpoint_description.h"
-#include "endpoint_descriptor_common.h"
-#include "endpoint_descriptor_writer.h"
-
-struct endpoint_descriptor_writer {
-    xmlBufferPtr buffer;
-    xmlTextWriterPtr writer;
-};
-
-static celix_status_t endpointDescriptorWriter_writeEndpoint(endpoint_descriptor_writer_pt writer, endpoint_description_pt endpoint);
-
-static char* valueTypeToString(valueType type);
-
-celix_status_t endpointDescriptorWriter_create(endpoint_descriptor_writer_pt *writer) {
-    celix_status_t status = CELIX_SUCCESS;
-
-    *writer = malloc(sizeof(**writer));
-    if (!*writer) {
-        status = CELIX_ENOMEM;
-    } else {
-        (*writer)->buffer = xmlBufferCreate();
-        if ((*writer)->buffer == NULL) {
-            status = CELIX_BUNDLE_EXCEPTION;
-        } else {
-            (*writer)->writer = xmlNewTextWriterMemory((*writer)->buffer, 0);
-            if ((*writer)->writer == NULL) {
-                status = CELIX_BUNDLE_EXCEPTION;
-            }
-        }
-    }
-
-    return status;
-}
-
-celix_status_t endpointDescriptorWriter_destroy(endpoint_descriptor_writer_pt writer) {
-    xmlFreeTextWriter(writer->writer);
-    xmlBufferFree(writer->buffer);
-    free(writer);
-    return CELIX_SUCCESS;
-}
-
-celix_status_t endpointDescriptorWriter_writeDocument(endpoint_descriptor_writer_pt writer, array_list_pt endpoints, char **document) {
-    celix_status_t status = CELIX_SUCCESS;
-    int rc;
-
-    rc = xmlTextWriterStartDocument(writer->writer, NULL, "UTF-8", NULL);
-    if (rc < 0) {
-        status = CELIX_BUNDLE_EXCEPTION;
-    } else {
-        rc = xmlTextWriterStartElementNS(writer->writer, NULL, ENDPOINT_DESCRIPTIONS, XMLNS);
-        if (rc < 0) {
-            status = CELIX_BUNDLE_EXCEPTION;
-        } else {
-            unsigned int i;
-            for (i = 0; i < arrayList_size(endpoints); i++) {
-                endpoint_description_pt endpoint = arrayList_get(endpoints, i);
-                status = endpointDescriptorWriter_writeEndpoint(writer, endpoint);
-            }
-            if (status == CELIX_SUCCESS) {
-                rc = xmlTextWriterEndElement(writer->writer);
-                if (rc < 0) {
-                    status = CELIX_BUNDLE_EXCEPTION;
-                } else {
-                    rc = xmlTextWriterEndDocument(writer->writer);
-                    if (rc < 0) {
-                        status = CELIX_BUNDLE_EXCEPTION;
-                    } else {
-                        *document = (char *) writer->buffer->content;
-                    }
-                }
-            }
-        }
-    }
-
-    return status;
-}
-
-static celix_status_t endpointDescriptorWriter_writeArrayValue(xmlTextWriterPtr writer, const xmlChar* value) {
-    xmlTextWriterStartElement(writer, ARRAY);
-    xmlTextWriterStartElement(writer, VALUE);
-    xmlTextWriterWriteString(writer, value);
-    xmlTextWriterEndElement(writer); // value
-    xmlTextWriterEndElement(writer); // array
-
-	return CELIX_SUCCESS;
-}
-
-static celix_status_t endpointDescriptorWriter_writeTypedValue(xmlTextWriterPtr writer, valueType type, const xmlChar* value) {
-	xmlTextWriterWriteAttribute(writer, VALUE_TYPE, (const xmlChar*) valueTypeToString(type));
-	xmlTextWriterWriteAttribute(writer, VALUE, value);
-
-	return CELIX_SUCCESS;
-}
-
-static celix_status_t endpointDescriptorWriter_writeUntypedValue(xmlTextWriterPtr writer, const xmlChar* value) {
-	xmlTextWriterWriteAttribute(writer, VALUE, value);
-
-	return CELIX_SUCCESS;
-}
-
-static celix_status_t endpointDescriptorWriter_writeEndpoint(endpoint_descriptor_writer_pt writer, endpoint_description_pt endpoint) {
-    celix_status_t status = CELIX_SUCCESS;
-
-    if (endpoint == NULL || writer == NULL) {
-        status = CELIX_ILLEGAL_ARGUMENT;
-    } else {
-        xmlTextWriterStartElement(writer->writer, ENDPOINT_DESCRIPTION);
-
-        hash_map_iterator_pt iter = hashMapIterator_create(endpoint->properties);
-        while (hashMapIterator_hasNext(iter)) {
-            hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
-
-            void* propertyName = hashMapEntry_getKey(entry);
-			const xmlChar* propertyValue = (const xmlChar*) hashMapEntry_getValue(entry);
-
-            xmlTextWriterStartElement(writer->writer, PROPERTY);
-            xmlTextWriterWriteAttribute(writer->writer, NAME, propertyName);
-
-            if (strcmp(OSGI_FRAMEWORK_OBJECTCLASS, (char*) propertyName) == 0) {
-            	// objectClass *must* be represented as array of string values...
-            	endpointDescriptorWriter_writeArrayValue(writer->writer, propertyValue);
-            } else if (strcmp(OSGI_RSA_ENDPOINT_SERVICE_ID, (char*) propertyName) == 0) {
-            	// endpoint.service.id *must* be represented as long value...
-            	endpointDescriptorWriter_writeTypedValue(writer->writer, VALUE_TYPE_LONG, propertyValue);
-            } else {
-            	// represent all other values as plain string values...
-            	endpointDescriptorWriter_writeUntypedValue(writer->writer, propertyValue);
-            }
-
-            xmlTextWriterEndElement(writer->writer);
-        }
-        hashMapIterator_destroy(iter);
-
-        xmlTextWriterEndElement(writer->writer);
-    }
-
-    return status;
-}
-
-
-static char* valueTypeToString(valueType type) {
-	switch (type) {
-		case VALUE_TYPE_BOOLEAN:
-			return "boolean";
-		case VALUE_TYPE_BYTE:
-			return "byte";
-		case VALUE_TYPE_CHAR:
-			return "char";
-		case VALUE_TYPE_DOUBLE:
-			return "double";
-		case VALUE_TYPE_FLOAT:
-			return "float";
-		case VALUE_TYPE_INTEGER:
-			return "int";
-		case VALUE_TYPE_LONG:
-			return "long";
-		case VALUE_TYPE_SHORT:
-			return "short";
-		case VALUE_TYPE_STRING:
-			// FALL-THROUGH!
-		default:
-			return "string";
-	}
-}
-
-#ifdef RSA_ENDPOINT_TEST_WRITER
-int main() {
-    endpoint_descriptor_writer_pt writer = NULL;
-    endpointDescriptorWriter_create(&writer);
-    array_list_pt list = NULL;
-    arrayList_create(&list);
-
-    properties_pt props = properties_create();
-    properties_set(props, "objectClass", "com.acme.Foo");
-    properties_set(props, "endpoint.service.id", "3");
-    properties_set(props, "endpoint.id", "abcdefghijklmnopqrstuvwxyz");
-    properties_set(props, "endpoint.framework.uuid", "2983D849-93B1-4C2C-AC6D-5BCDA93ACB96");
-    endpoint_description_pt epd = NULL;
-    endpointDescription_create(props, &epd);
-    arrayList_add(list, epd);
-
-    properties_pt props2 = properties_create();
-    properties_set(props2, "objectClass", "com.acme.Bar");
-    properties_set(props, "endpoint.service.id", "4");
-    properties_set(props, "endpoint.id", "abcdefghijklmnopqrstuvwxyz");
-    properties_set(props, "endpoint.framework.uuid", "2983D849-93B1-4C2C-AC6D-5BCDA93ACB96");
-    endpoint_description_pt epd2 = NULL;
-    endpointDescription_create(props2, &epd2);
-    arrayList_add(list, epd2);
-
-    char *buffer = NULL;
-    endpointDescriptorWriter_writeDocument(writer, list, &buffer);
-
-    arrayList_destroy(list);
-    endpointDescription_destroy(epd);
-    endpointDescription_destroy(epd2);
-    endpointDescriptorWriter_destroy(writer);
-
-    printf("%s\n", buffer);
-}
-#endif

http://git-wip-us.apache.org/repos/asf/celix/blob/2a670f26/remote_services/discovery/private/src/endpoint_discovery_poller.c
----------------------------------------------------------------------
diff --git a/remote_services/discovery/private/src/endpoint_discovery_poller.c b/remote_services/discovery/private/src/endpoint_discovery_poller.c
deleted file mode 100644
index 73fb7ba..0000000
--- a/remote_services/discovery/private/src/endpoint_discovery_poller.c
+++ /dev/null
@@ -1,403 +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.
- */
-/*
- * endpoint_discovery_poller.c
- *
- * \date       3 Jul 2014
- * \author     <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright  Apache License, Version 2.0
- */
-#include <stdbool.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <curl/curl.h>
-
-#include "bundle_context.h"
-#include "log_helper.h"
-#include "utils.h"
-
-#include "discovery_impl.h"
-
-#include "endpoint_descriptor_reader.h"
-
-
-#define DISCOVERY_POLL_INTERVAL "DISCOVERY_CFG_POLL_INTERVAL"
-#define DEFAULT_POLL_INTERVAL "10"
-
-
-static void *endpointDiscoveryPoller_performPeriodicPoll(void *data);
-celix_status_t endpointDiscoveryPoller_poll(endpoint_discovery_poller_pt poller, char *url, array_list_pt currentEndpoints);
-static celix_status_t endpointDiscoveryPoller_getEndpoints(endpoint_discovery_poller_pt poller, char *url, array_list_pt *updatedEndpoints);
-static celix_status_t endpointDiscoveryPoller_endpointDescriptionEquals(const void *endpointPtr, const void *comparePtr, bool *equals);
-
-/**
- * Allocates memory and initializes a new endpoint_discovery_poller instance.
- */
-celix_status_t endpointDiscoveryPoller_create(discovery_pt discovery, bundle_context_pt context, endpoint_discovery_poller_pt *poller) {
-	celix_status_t status;
-
-	*poller = malloc(sizeof(struct endpoint_discovery_poller));
-	if (!*poller) {
-		return CELIX_ENOMEM;
-	}
-
-	(*poller)->loghelper = &discovery->loghelper;
-
-	status = celixThreadMutex_create(&(*poller)->pollerLock, NULL);
-	if (status != CELIX_SUCCESS) {
-		return status;
-	}
-
-	const char* interval = NULL;
-	status = bundleContext_getProperty(context, DISCOVERY_POLL_INTERVAL, &interval);
-	if (!interval) {
-		interval = DEFAULT_POLL_INTERVAL;
-	}
-
-	const char* endpointsProp = NULL;
-	status = bundleContext_getProperty(context, DISCOVERY_POLL_ENDPOINTS, &endpointsProp);
-	if (!endpointsProp) {
-		endpointsProp = DEFAULT_POLL_ENDPOINTS;
-	}
-	// we're going to mutate the string with strtok, so create a copy...
-	char* endpoints = strdup(endpointsProp);
-
-	(*poller)->poll_interval = atoi(interval);
-	(*poller)->discovery = discovery;
-	(*poller)->running = false;
-	(*poller)->entries = hashMap_create(utils_stringHash, NULL, utils_stringEquals, NULL);
-
-	const char* sep = ",";
-	char *save_ptr = NULL;
-	char* tok = strtok_r(endpoints, sep, &save_ptr);
-	while (tok) {
-		endpointDiscoveryPoller_addDiscoveryEndpoint(*poller, utils_stringTrim(tok));
-		tok = strtok_r(NULL, sep, &save_ptr);
-	}
-	// Clean up after ourselves...
-	free(endpoints);
-
-	status = celixThreadMutex_lock(&(*poller)->pollerLock);
-	if (status != CELIX_SUCCESS) {
-		return CELIX_BUNDLE_EXCEPTION;
-	}
-
-	(*poller)->running = true;
-
-	status += celixThread_create(&(*poller)->pollerThread, NULL, endpointDiscoveryPoller_performPeriodicPoll, *poller);
-	status += celixThreadMutex_unlock(&(*poller)->pollerLock);
-
-	if(status != CELIX_SUCCESS){
-		status = CELIX_BUNDLE_EXCEPTION;
-	}
-
-	return status;
-}
-
-/**
- * Destroys and frees up memory for a given endpoint_discovery_poller struct.
- */
-celix_status_t endpointDiscoveryPoller_destroy(endpoint_discovery_poller_pt poller) {
-	celix_status_t status;
-
-	poller->running = false;
-
-	celixThread_join(poller->pollerThread, NULL);
-
-	hash_map_iterator_pt iterator = hashMapIterator_create(poller->entries);
-	while (hashMapIterator_hasNext(iterator)) {
-		hash_map_entry_pt entry = hashMapIterator_nextEntry(iterator);
-
-		if ( endpointDiscoveryPoller_removeDiscoveryEndpoint(poller, (char*) hashMapEntry_getKey(entry)) == CELIX_SUCCESS) {
-			hashMapIterator_destroy(iterator);
-			iterator = hashMapIterator_create(poller->entries);
-		}
-	}
-	hashMapIterator_destroy(iterator);
-
-	status = celixThreadMutex_lock(&poller->pollerLock);
-
-	if (status != CELIX_SUCCESS) {
-		return CELIX_BUNDLE_EXCEPTION;
-	}
-
-	hashMap_destroy(poller->entries, true, false);
-
-	status = celixThreadMutex_unlock(&poller->pollerLock);
-
-	poller->loghelper = NULL;
-
-	free(poller);
-
-	return status;
-}
-
-
-celix_status_t endpointDiscoveryPoller_getDiscoveryEndpoints(endpoint_discovery_poller_pt poller, array_list_pt urls) {
-	celixThreadMutex_lock(&(poller)->pollerLock);
-
-	hash_map_iterator_pt iterator = hashMapIterator_create(poller->entries);
-
-	while(hashMapIterator_hasNext(iterator))  {
-		hash_map_entry_pt entry = hashMapIterator_nextEntry(iterator);
-		char* toAdd = strdup((char*) hashMapEntry_getKey(entry));
-		arrayList_add(urls, toAdd);
-	}
-
-	hashMapIterator_destroy(iterator);
-
-	celixThreadMutex_unlock(&(poller)->pollerLock);
-
-	return CELIX_SUCCESS;
-}
-
-/**
- * Adds a new endpoint URL to the list of polled endpoints.
- */
-celix_status_t endpointDiscoveryPoller_addDiscoveryEndpoint(endpoint_discovery_poller_pt poller, char *url) {
-	celix_status_t status;
-
-	status = celixThreadMutex_lock(&(poller)->pollerLock);
-	if (status != CELIX_SUCCESS) {
-		return CELIX_BUNDLE_EXCEPTION;
-	}
-
-	// Avoid memory leaks when adding an already existing URL...
-	array_list_pt endpoints = hashMap_get(poller->entries, url);
-	if (endpoints == NULL) {
-		status = arrayList_createWithEquals(endpointDiscoveryPoller_endpointDescriptionEquals, &endpoints);
-
-		if (status == CELIX_SUCCESS) {
-			logHelper_log(*poller->loghelper, OSGI_LOGSERVICE_DEBUG, "ENDPOINT_POLLER: add new discovery endpoint with url %s", url);
-			hashMap_put(poller->entries, strdup(url), endpoints);
-			endpointDiscoveryPoller_poll(poller, url, endpoints);
-		}
-	}
-
-	status = celixThreadMutex_unlock(&poller->pollerLock);
-
-	return status;
-}
-
-/**
- * Removes an endpoint URL from the list of polled endpoints.
- */
-celix_status_t endpointDiscoveryPoller_removeDiscoveryEndpoint(endpoint_discovery_poller_pt poller, char *url) {
-	celix_status_t status = CELIX_SUCCESS;
-
-	if (celixThreadMutex_lock(&poller->pollerLock) != CELIX_SUCCESS) {
-		status = CELIX_BUNDLE_EXCEPTION;
-	} else {
-		hash_map_entry_pt entry = hashMap_getEntry(poller->entries, url);
-
-		if (entry == NULL) {
-			logHelper_log(*poller->loghelper, OSGI_LOGSERVICE_DEBUG, "ENDPOINT_POLLER: There was no entry found belonging to url %s - maybe already removed?", url);
-		} else {
-			char* origKey = hashMapEntry_getKey(entry);
-
-			logHelper_log(*poller->loghelper, OSGI_LOGSERVICE_DEBUG, "ENDPOINT_POLLER: remove discovery endpoint with url %s", url);
-
-			array_list_pt entries = hashMap_remove(poller->entries, url);
-
-			if (entries != NULL) {
-				for (unsigned int i = arrayList_size(entries); i > 0; i--) {
-					endpoint_description_pt endpoint = arrayList_get(entries, i - 1);
-					discovery_removeDiscoveredEndpoint(poller->discovery, endpoint);
-					arrayList_remove(entries, i - 1);
-					endpointDescription_destroy(endpoint);
-				}
-				arrayList_destroy(entries);
-			}
-
-			free(origKey);
-		}
-		status = celixThreadMutex_unlock(&poller->pollerLock);
-	}
-
-	return status;
-}
-
-
-
-
-celix_status_t endpointDiscoveryPoller_poll(endpoint_discovery_poller_pt poller, char *url, array_list_pt currentEndpoints) {
-	celix_status_t status;
-	array_list_pt updatedEndpoints = NULL;
-
-	// create an arraylist with a custom equality test to ensure we can find endpoints properly...
-	arrayList_createWithEquals(endpointDiscoveryPoller_endpointDescriptionEquals, &updatedEndpoints);
-	status = endpointDiscoveryPoller_getEndpoints(poller, url, &updatedEndpoints);
-
-	if (status == CELIX_SUCCESS) {
-		if (updatedEndpoints!=NULL) {
-			for (unsigned int i = arrayList_size(currentEndpoints); i > 0; i--) {
-				endpoint_description_pt endpoint = arrayList_get(currentEndpoints, i - 1);
-
-				if (!arrayList_contains(updatedEndpoints, endpoint)) {
-					status = discovery_removeDiscoveredEndpoint(poller->discovery, endpoint);
-					arrayList_remove(currentEndpoints, i - 1);
-					endpointDescription_destroy(endpoint);
-				}
-			}
-
-			for (int i = arrayList_size(updatedEndpoints); i > 0; i--) {
-				endpoint_description_pt endpoint = arrayList_remove(updatedEndpoints, 0);
-
-				if (!arrayList_contains(currentEndpoints, endpoint)) {
-					arrayList_add(currentEndpoints, endpoint);
-					status = discovery_addDiscoveredEndpoint(poller->discovery, endpoint);
-				} else {
-					endpointDescription_destroy(endpoint);
-
-				}
-			}
-		}
-	}
-
-	if(updatedEndpoints!=NULL){
-		arrayList_destroy(updatedEndpoints);
-	}
-
-	return status;
-}
-
-static void *endpointDiscoveryPoller_performPeriodicPoll(void *data) {
-	endpoint_discovery_poller_pt poller = (endpoint_discovery_poller_pt) data;
-
-	useconds_t interval = (useconds_t) (poller->poll_interval * 1000000L);
-
-	while (poller->running) {
-		usleep(interval);
-		celix_status_t status = celixThreadMutex_lock(&poller->pollerLock);
-
-		if (status != CELIX_SUCCESS) {
-			logHelper_log(*poller->loghelper, OSGI_LOGSERVICE_WARNING, "ENDPOINT_POLLER: failed to obtain lock; retrying...");
-		} else {
-			hash_map_iterator_pt iterator = hashMapIterator_create(poller->entries);
-
-			while (hashMapIterator_hasNext(iterator)) {
-				hash_map_entry_pt entry = hashMapIterator_nextEntry(iterator);
-
-				char *url = hashMapEntry_getKey(entry);
-				array_list_pt currentEndpoints = hashMapEntry_getValue(entry);
-
-				endpointDiscoveryPoller_poll(poller, url, currentEndpoints);
-			}
-
-			hashMapIterator_destroy(iterator);
-		}
-
-		status = celixThreadMutex_unlock(&poller->pollerLock);
-		if (status != CELIX_SUCCESS) {
-			logHelper_log(*poller->loghelper, OSGI_LOGSERVICE_WARNING, "ENDPOINT_POLLER: failed to release lock; retrying...");
-		}
-	}
-
-	return NULL;
-}
-
-
-
-struct MemoryStruct {
-	char *memory;
-	size_t size;
-};
-
-static size_t endpointDiscoveryPoller_writeMemory(void *contents, size_t size, size_t nmemb, void *memoryPtr) {
-	size_t realsize = size * nmemb;
-	struct MemoryStruct *mem = (struct MemoryStruct *)memoryPtr;
-
-	mem->memory = realloc(mem->memory, mem->size + realsize + 1);
-	if(mem->memory == NULL) {
-		printf("ENDPOINT_POLLER: not enough memory (realloc returned NULL)!");
-		return 0;
-	}
-
-	memcpy(&(mem->memory[mem->size]), contents, realsize);
-	mem->size += realsize;
-	mem->memory[mem->size] = 0;
-
-	return realsize;
-}
-
-static celix_status_t endpointDiscoveryPoller_getEndpoints(endpoint_discovery_poller_pt poller, char *url, array_list_pt *updatedEndpoints) {
-	celix_status_t status = CELIX_SUCCESS;
-
-
-	CURL *curl = NULL;
-	CURLcode res = CURLE_OK;
-
-	struct MemoryStruct chunk;
-	chunk.memory = malloc(1);
-	chunk.size = 0;
-
-	curl = curl_easy_init();
-	if (!curl) {
-		status = CELIX_ILLEGAL_STATE;
-	} else {
-		curl_easy_setopt(curl, CURLOPT_URL, url);
-		curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
-		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, endpointDiscoveryPoller_writeMemory);
-		curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
-		curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5L);
-		curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);
-		res = curl_easy_perform(curl);
-
-		curl_easy_cleanup(curl);
-	}
-
-	// process endpoints file
-	if (res == CURLE_OK) {
-		endpoint_descriptor_reader_pt reader = NULL;
-
-		status = endpointDescriptorReader_create(poller, &reader);
-		if (status == CELIX_SUCCESS) {
-			status = endpointDescriptorReader_parseDocument(reader, chunk.memory, updatedEndpoints);
-		}
-
-		if (reader) {
-			endpointDescriptorReader_destroy(reader);
-		}
-	} else {
-		logHelper_log(*poller->loghelper, OSGI_LOGSERVICE_ERROR, "ENDPOINT_POLLER: unable to read endpoints from %s, reason: %s", url, curl_easy_strerror(res));
-	}
-
-	// clean up endpoints file
-	if (chunk.memory) {
-		free(chunk.memory);
-	}
-
-	return status;
-}
-
-static celix_status_t endpointDiscoveryPoller_endpointDescriptionEquals(const void *endpointPtr, const void *comparePtr, bool *equals) {
-	endpoint_description_pt endpoint = (endpoint_description_pt) endpointPtr;
-	endpoint_description_pt compare = (endpoint_description_pt) comparePtr;
-
-	if (strcmp(endpoint->id, compare->id) == 0) {
-		*equals = true;
-	} else {
-		*equals = false;
-	}
-
-	return CELIX_SUCCESS;
-}

http://git-wip-us.apache.org/repos/asf/celix/blob/2a670f26/remote_services/discovery/private/src/endpoint_discovery_server.c
----------------------------------------------------------------------
diff --git a/remote_services/discovery/private/src/endpoint_discovery_server.c b/remote_services/discovery/private/src/endpoint_discovery_server.c
deleted file mode 100644
index f5f82af..0000000
--- a/remote_services/discovery/private/src/endpoint_discovery_server.c
+++ /dev/null
@@ -1,450 +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.
- */
-/*
- * endpoint_discovery_server.c
- *
- * \date		Aug 12, 2014
- * \author		<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright	Apache License, Version 2.0
- */
-#include <stdlib.h>
-#include <string.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#ifndef ANDROID
-#include <ifaddrs.h>
-#endif
-#include "civetweb.h"
-#include "celix_errno.h"
-#include "utils.h"
-#include "log_helper.h"
-#include "discovery.h"
-#include "discovery_impl.h"
-
-#include "endpoint_descriptor_writer.h"
-
-// defines how often the webserver is restarted (with an increased port number)
-#define MAX_NUMBER_OF_RESTARTS 	15
-#define DEFAULT_SERVER_THREADS "1"
-
-#define CIVETWEB_REQUEST_NOT_HANDLED 0
-#define CIVETWEB_REQUEST_HANDLED 1
-
-static const char *response_headers =
-		"HTTP/1.1 200 OK\r\n"
-		"Cache: no-cache\r\n"
-		"Content-Type: application/xml;charset=utf-8\r\n"
-		"\r\n";
-
-struct endpoint_discovery_server {
-	log_helper_pt* loghelper;
-	hash_map_pt entries; // key = endpointId, value = endpoint_descriptor_pt
-
-	celix_thread_mutex_t serverLock;
-
-	const char* path;
-	const char *port;
-	const char* ip;
-	struct mg_context* ctx;
-};
-
-// Forward declarations...
-static int endpointDiscoveryServer_callback(struct mg_connection *conn);
-static char* format_path(const char* path);
-
-#ifndef ANDROID
-static celix_status_t endpointDiscoveryServer_getIpAdress(char* interface, char** ip);
-#endif
-
-celix_status_t endpointDiscoveryServer_create(discovery_pt discovery, bundle_context_pt context, endpoint_discovery_server_pt *server) {
-	celix_status_t status;
-
-	const char *port = NULL;
-	const char *ip = NULL;
-	char *detectedIp = NULL;
-	const char *path = NULL;
-	const char *retries = NULL;
-
-	int max_ep_num = MAX_NUMBER_OF_RESTARTS;
-
-	*server = malloc(sizeof(struct endpoint_discovery_server));
-	if (!*server) {
-		return CELIX_ENOMEM;
-	}
-
-	(*server)->loghelper = &discovery->loghelper;
-	(*server)->entries = hashMap_create(&utils_stringHash, NULL, &utils_stringEquals, NULL);
-	if (!(*server)->entries) {
-		return CELIX_ENOMEM;
-	}
-
-	status = celixThreadMutex_create(&(*server)->serverLock, NULL);
-	if (status != CELIX_SUCCESS) {
-		return CELIX_BUNDLE_EXCEPTION;
-	}
-
-	bundleContext_getProperty(context, DISCOVERY_SERVER_IP, &ip);
-#ifndef ANDROID
-	if (ip == NULL) {
-		const char *interface = NULL;
-
-		bundleContext_getProperty(context, DISCOVERY_SERVER_INTERFACE, &interface);
-		if ((interface != NULL) && (endpointDiscoveryServer_getIpAdress((char*)interface, &detectedIp) != CELIX_SUCCESS)) {
-			logHelper_log(*(*server)->loghelper, OSGI_LOGSERVICE_WARNING, "Could not retrieve IP adress for interface %s", interface);
-		}
-
-		if (detectedIp == NULL) {
-			endpointDiscoveryServer_getIpAdress(NULL, &detectedIp);
-		}
-
-		ip = detectedIp;
-	}
-#endif
-
-	if (ip != NULL) {
-		logHelper_log(*(*server)->loghelper, OSGI_LOGSERVICE_INFO, "Using %s for service annunciation", ip);
-		(*server)->ip = strdup(ip);
-	}
-	else {
-		logHelper_log(*(*server)->loghelper, OSGI_LOGSERVICE_WARNING, "No IP address for service annunciation set. Using %s", DEFAULT_SERVER_IP);
-		(*server)->ip = strdup((char*) DEFAULT_SERVER_IP);
-	}
-
-	if (detectedIp != NULL) {
-		free(detectedIp);
-	}
-
-	bundleContext_getProperty(context, DISCOVERY_SERVER_PORT, &port);
-	if (port == NULL) {
-		port = DEFAULT_SERVER_PORT;
-	}
-
-	bundleContext_getProperty(context, DISCOVERY_SERVER_PATH, &path);
-	if (path == NULL) {
-		path = DEFAULT_SERVER_PATH;
-	}
-
-	bundleContext_getProperty(context, DISCOVERY_SERVER_MAX_EP, &retries);
-	if (retries != NULL) {
-		errno=0;
-		max_ep_num = strtol(retries,NULL,10);
-		if(errno!=0 || max_ep_num<=0){
-			max_ep_num=MAX_NUMBER_OF_RESTARTS;
-		}
-	}
-
-	(*server)->path = format_path(path);
-
-	const struct mg_callbacks callbacks = {
-			.begin_request = endpointDiscoveryServer_callback,
-	};
-
-	unsigned int port_counter = 0;
-	char newPort[10];
-
-	do {
-		const char *options[] = {
-				"listening_ports", port,
-				"num_threads", DEFAULT_SERVER_THREADS,
-				NULL
-		};
-
-		(*server)->ctx = mg_start(&callbacks, (*server), options);
-
-		if ((*server)->ctx != NULL)
-		{
-			logHelper_log(discovery->loghelper, OSGI_LOGSERVICE_INFO, "Starting discovery server on port %s...", port);
-		}
-		else {
-			errno = 0;
-			char* endptr = (char*)port;
-			long currentPort = strtol(port, &endptr, 10);
-
-			if (*endptr || errno != 0) {
-				currentPort = strtol(DEFAULT_SERVER_PORT, NULL, 10);
-			}
-
-			port_counter++;
-			snprintf(&newPort[0], 10,  "%ld", (currentPort+1));
-
-			logHelper_log(discovery->loghelper, OSGI_LOGSERVICE_ERROR, "Error while starting discovery server on port %s - retrying on port %s...", port, newPort);
-			port = newPort;
-
-		}
-
-	} while(((*server)->ctx == NULL) && (port_counter < max_ep_num));
-
-	(*server)->port = strdup(port);
-
-	return status;
-}
-
-celix_status_t endpointDiscoveryServer_getUrl(endpoint_discovery_server_pt server, char* url)
-{
-	celix_status_t status = CELIX_BUNDLE_EXCEPTION;
-
-	if (server->ip && server->port && server->path) {
-		sprintf(url, "http://%s:%s/%s", server->ip, server->port, server->path);
-		status = CELIX_SUCCESS;
-	}
-
-	return status;
-}
-
-celix_status_t endpointDiscoveryServer_destroy(endpoint_discovery_server_pt server) {
-	celix_status_t status;
-
-	// stop & block until the actual server is shut down...
-	if (server->ctx != NULL) {
-		mg_stop(server->ctx);
-		server->ctx = NULL;
-	}
-
-	status = celixThreadMutex_lock(&server->serverLock);
-
-	hashMap_destroy(server->entries, true /* freeKeys */, false /* freeValues */);
-
-	status = celixThreadMutex_unlock(&server->serverLock);
-	status = celixThreadMutex_destroy(&server->serverLock);
-
-	free((void*) server->path);
-	free((void*) server->port);
-	free((void*) server->ip);
-
-	free(server);
-
-	return status;
-}
-
-celix_status_t endpointDiscoveryServer_addEndpoint(endpoint_discovery_server_pt server, endpoint_description_pt endpoint) {
-	celix_status_t status;
-
-	status = celixThreadMutex_lock(&server->serverLock);
-	if (status != CELIX_SUCCESS) {
-		return CELIX_BUNDLE_EXCEPTION;
-	}
-
-	// create a local copy of the endpointId which we can control...
-	char* endpointId = strdup(endpoint->id);
-	endpoint_description_pt cur_value = hashMap_get(server->entries, endpointId);
-	if (!cur_value) {
-		logHelper_log(*server->loghelper, OSGI_LOGSERVICE_INFO, "exposing new endpoint \"%s\"...", endpointId);
-
-		hashMap_put(server->entries, endpointId, endpoint);
-	}
-
-	status = celixThreadMutex_unlock(&server->serverLock);
-	if (status != CELIX_SUCCESS) {
-		return CELIX_BUNDLE_EXCEPTION;
-	}
-
-	return status;
-}
-
-celix_status_t endpointDiscoveryServer_removeEndpoint(endpoint_discovery_server_pt server, endpoint_description_pt endpoint) {
-	celix_status_t status;
-
-	status = celixThreadMutex_lock(&server->serverLock);
-	if (status != CELIX_SUCCESS) {
-		return CELIX_BUNDLE_EXCEPTION;
-	}
-
-	hash_map_entry_pt entry = hashMap_getEntry(server->entries, endpoint->id);
-	if (entry) {
-		char* key = hashMapEntry_getKey(entry);
-
-		logHelper_log(*server->loghelper, OSGI_LOGSERVICE_INFO, "removing endpoint \"%s\"...\n", key);
-
-		hashMap_remove(server->entries, key);
-
-		// we've made this key, see _addEnpoint above...
-		free((void*) key);
-	}
-
-	status = celixThreadMutex_unlock(&server->serverLock);
-	if (status != CELIX_SUCCESS) {
-		return CELIX_BUNDLE_EXCEPTION;
-	}
-
-	return status;
-}
-
-static char* format_path(const char* path) {
-	char* result = strdup(path);
-	result = utils_stringTrim(result);
-	// check whether the path starts with a leading slash...
-	if (result[0] != '/') {
-		size_t len = strlen(result);
-		result = realloc(result, len + 2);
-		memmove(result + 1, result, len);
-		result[0] = '/';
-		result[len + 1] = 0;
-	}
-	return result;
-}
-
-static celix_status_t endpointDiscoveryServer_getEndpoints(endpoint_discovery_server_pt server, const char* the_endpoint_id, array_list_pt *endpoints) {
-	celix_status_t status;
-
-	status = arrayList_create(endpoints);
-	if (status != CELIX_SUCCESS) {
-		return CELIX_ENOMEM;
-	}
-
-
-	hash_map_iterator_pt iter = hashMapIterator_create(server->entries);
-	while (hashMapIterator_hasNext(iter)) {
-		hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
-
-		char* endpoint_id = hashMapEntry_getKey(entry);
-		if (the_endpoint_id == NULL || strcmp(the_endpoint_id, endpoint_id) == 0) {
-			endpoint_description_pt endpoint = hashMapEntry_getValue(entry);
-
-			arrayList_add(*endpoints, endpoint);
-		}
-	}
-	hashMapIterator_destroy(iter);
-
-	return status;
-}
-
-static int endpointDiscoveryServer_writeEndpoints(struct mg_connection* conn, array_list_pt endpoints) {
-	celix_status_t status;
-	int rv = CIVETWEB_REQUEST_NOT_HANDLED;
-
-	endpoint_descriptor_writer_pt writer = NULL;
-	status = endpointDescriptorWriter_create(&writer);
-	if (status == CELIX_SUCCESS) {
-
-		char *buffer = NULL;
-		status = endpointDescriptorWriter_writeDocument(writer, endpoints, &buffer);
-		if (buffer) {
-			mg_write(conn, response_headers, strlen(response_headers));
-			mg_write(conn, buffer, strlen(buffer));
-		}
-
-		rv = CIVETWEB_REQUEST_HANDLED;
-	}
-
-	if(writer!=NULL){
-		endpointDescriptorWriter_destroy(writer);
-	}
-
-	return rv;
-}
-
-// returns all endpoints as XML...
-static int endpointDiscoveryServer_returnAllEndpoints(endpoint_discovery_server_pt server, struct mg_connection* conn) {
-	int status = CIVETWEB_REQUEST_NOT_HANDLED;
-
-	array_list_pt endpoints = NULL;
-
-	if (celixThreadMutex_lock(&server->serverLock) == CELIX_SUCCESS) {
-		endpointDiscoveryServer_getEndpoints(server, NULL, &endpoints);
-		if (endpoints) {
-			status = endpointDiscoveryServer_writeEndpoints(conn, endpoints);
-
-			arrayList_destroy(endpoints);
-		}
-
-
-		celixThreadMutex_unlock(&server->serverLock);
-	}
-
-	return status;
-}
-
-// returns a single endpoint as XML...
-static int endpointDiscoveryServer_returnEndpoint(endpoint_discovery_server_pt server, struct mg_connection* conn, const char* endpoint_id) {
-	int status = CIVETWEB_REQUEST_NOT_HANDLED;
-
-	array_list_pt endpoints = NULL;
-
-	if (celixThreadMutex_lock(&server->serverLock) == CELIX_SUCCESS) {
-		endpointDiscoveryServer_getEndpoints(server, endpoint_id, &endpoints);
-		if (endpoints) {
-			status = endpointDiscoveryServer_writeEndpoints(conn, endpoints);
-
-			arrayList_destroy(endpoints);
-		}
-
-		celixThreadMutex_unlock(&server->serverLock);
-	}
-
-	return status;
-}
-
-static int endpointDiscoveryServer_callback(struct mg_connection* conn) {
-	int status = CIVETWEB_REQUEST_NOT_HANDLED;
-
-	const struct mg_request_info *request_info = mg_get_request_info(conn);
-	if (request_info->uri != NULL && strcmp("GET", request_info->request_method) == 0) {
-		endpoint_discovery_server_pt server = request_info->user_data;
-
-		const char *uri = request_info->uri;
-		const size_t path_len = strlen(server->path);
-		const size_t uri_len = strlen(uri);
-
-		if (strncmp(server->path, uri, strlen(server->path)) == 0) {
-			// Be lenient when it comes to the trailing slash...
-			if (path_len == uri_len || (uri_len == (path_len + 1) && uri[path_len] == '/')) {
-				status = endpointDiscoveryServer_returnAllEndpoints(server, conn);
-			} else {
-				const char* endpoint_id = uri + path_len + 1; // right after the slash...
-
-				status = endpointDiscoveryServer_returnEndpoint(server, conn, endpoint_id);
-			}
-		}
-	}
-
-	return status;
-}
-
-#ifndef ANDROID
-static celix_status_t endpointDiscoveryServer_getIpAdress(char* interface, char** ip) {
-	celix_status_t status = CELIX_BUNDLE_EXCEPTION;
-
-	struct ifaddrs *ifaddr, *ifa;
-	char host[NI_MAXHOST];
-
-	if (getifaddrs(&ifaddr) != -1)
-	{
-		for (ifa = ifaddr; ifa != NULL && status != CELIX_SUCCESS; ifa = ifa->ifa_next)
-		{
-			if (ifa->ifa_addr == NULL)
-				continue;
-
-			if ((getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0) && (ifa->ifa_addr->sa_family == AF_INET)) {
-				if (interface == NULL) {
-					*ip = strdup(host);
-					status = CELIX_SUCCESS;
-				}
-				else if (strcmp(ifa->ifa_name, interface) == 0) {
-					*ip = strdup(host);
-					status = CELIX_SUCCESS;
-				}
-			}
-		}
-
-		freeifaddrs(ifaddr);
-	}
-
-	return status;
-}
-#endif

http://git-wip-us.apache.org/repos/asf/celix/blob/2a670f26/remote_services/discovery_common/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/discovery_common/CMakeLists.txt b/remote_services/discovery_common/CMakeLists.txt
new file mode 100644
index 0000000..9388c90
--- /dev/null
+++ b/remote_services/discovery_common/CMakeLists.txt
@@ -0,0 +1,33 @@
+# 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.
+
+
+find_package(LibXml2 REQUIRED)
+
+add_library(discovery_common STATIC
+		src/discovery.c
+		src/discovery_activator.c
+		src/endpoint_descriptor_reader.c
+		src/endpoint_descriptor_writer.c
+		src/endpoint_discovery_poller.c
+		src/endpoint_discovery_server.c
+        src/civetweb.c
+)
+target_include_directories(discovery_common PUBLIC include)
+target_include_directories(discovery_common PRIVATE src ${LIBXML2_INCLUDE_DIR})
+target_link_libraries(discovery_common PRIVATE ${LIBXML2_LIBRARIES} Celix::framework)
+target_link_libraries(discovery_common PUBLIC Celix::log_helper Celix::remote_service_admin_api)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/celix/blob/2a670f26/remote_services/discovery_common/include/civetweb.h
----------------------------------------------------------------------
diff --git a/remote_services/discovery_common/include/civetweb.h b/remote_services/discovery_common/include/civetweb.h
new file mode 100644
index 0000000..61a8e98
--- /dev/null
+++ b/remote_services/discovery_common/include/civetweb.h
@@ -0,0 +1,657 @@
+/* Copyright (c) 2013-2014 the Civetweb developers
+ * Copyright (c) 2004-2013 Sergey Lyubka
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef CIVETWEB_HEADER_INCLUDED
+#define CIVETWEB_HEADER_INCLUDED
+
+#ifndef CIVETWEB_VERSION
+#define CIVETWEB_VERSION "1.7"
+#endif
+
+#ifndef CIVETWEB_API
+    #if defined(_WIN32)
+        #if defined(CIVETWEB_DLL_EXPORTS)
+            #define CIVETWEB_API __declspec(dllexport)
+        #elif defined(CIVETWEB_DLL_IMPORTS)
+            #define CIVETWEB_API __declspec(dllimport)
+        #else
+            #define CIVETWEB_API
+        #endif
+    #else
+        #define CIVETWEB_API
+    #endif
+#endif
+
+#include <stdio.h>
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+struct mg_context;     /* Handle for the HTTP service itself */
+struct mg_connection;  /* Handle for the individual connection */
+
+
+/* This structure contains information about the HTTP request. */
+struct mg_request_info {
+    const char *request_method; /* "GET", "POST", etc */
+    const char *uri;            /* URL-decoded URI */
+    const char *http_version;   /* E.g. "1.0", "1.1" */
+    const char *query_string;   /* URL part after '?', not including '?', or
+                                   NULL */
+    const char *remote_user;    /* Authenticated user, or NULL if no auth
+                                   used */
+    char remote_addr[48];       /* Client's IP address as a string. */
+    long remote_ip;             /* Client's IP address. Deprecated: use remote_addr instead */
+
+    long long content_length;   /* Length (in bytes) of the request body,
+                                   can be -1 if no length was given. */
+    int remote_port;            /* Client's port */
+    int is_ssl;                 /* 1 if SSL-ed, 0 if not */
+    void *user_data;            /* User data pointer passed to mg_start() */
+    void *conn_data;            /* Connection-specific user data */
+
+    int num_headers;            /* Number of HTTP headers */
+    struct mg_header {
+        const char *name;       /* HTTP header name */
+        const char *value;      /* HTTP header value */
+    } http_headers[64];         /* Maximum 64 headers */
+};
+
+
+/* This structure needs to be passed to mg_start(), to let civetweb know
+   which callbacks to invoke. For a detailed description, see
+   https://github.com/bel2125/civetweb/blob/master/docs/UserManual.md */
+struct mg_callbacks {
+    /* Called when civetweb has received new HTTP request.
+       If the callback returns one, it must process the request
+       by sending valid HTTP headers and a body. Civetweb will not do
+       any further processing. Otherwise it must return zero.
+       Note that since V1.7 the "begin_request" function is called
+       before an authorization check. If an authorization check is
+       required, use a request_handler instead.
+       Return value:
+         0: civetweb will process the request itself. In this case,
+            the callback must not send any data to the client.
+         1: callback already processed the request. Civetweb will
+            not send any data after the callback returned. */
+    int  (*begin_request)(struct mg_connection *);
+
+    /* Called when civetweb has finished processing request. */
+    void (*end_request)(const struct mg_connection *, int reply_status_code);
+
+    /* Called when civetweb is about to log a message. If callback returns
+       non-zero, civetweb does not log anything. */
+    int  (*log_message)(const struct mg_connection *, const char *message);
+
+    /* Called when civetweb initializes SSL library.
+       Parameters:
+         user_data: parameter user_data passed when starting the server.
+       Return value:
+         0: civetweb will set up the SSL certificate.
+         1: civetweb assumes the callback already set up the certificate.
+        -1: initializing ssl fails. */
+    int  (*init_ssl)(void *ssl_context, void *user_data);
+
+    /* Called when websocket request is received, before websocket handshake.
+       Return value:
+         0: civetweb proceeds with websocket handshake.
+         1: connection is closed immediately. */
+    int (*websocket_connect)(const struct mg_connection *);
+
+    /* Called when websocket handshake is successfully completed, and
+       connection is ready for data exchange. */
+    void (*websocket_ready)(struct mg_connection *);
+
+    /* Called when data frame has been received from the client.
+       Parameters:
+         bits: first byte of the websocket frame, see websocket RFC at
+               http://tools.ietf.org/html/rfc6455, section 5.2
+         data, data_len: payload, with mask (if any) already applied.
+       Return value:
+         1: keep this websocket connection open.
+         0: close this websocket connection. */
+    int  (*websocket_data)(struct mg_connection *, int bits,
+                           char *data, size_t data_len);
+
+    /* Called when civetweb is closing a connection.  The per-context mutex is
+       locked when this is invoked.  This is primarily useful for noting when
+       a websocket is closing and removing it from any application-maintained
+       list of clients. */
+    void (*connection_close)(struct mg_connection *);
+
+    /* Called when civetweb tries to open a file. Used to intercept file open
+       calls, and serve file data from memory instead.
+       Parameters:
+          path:     Full path to the file to open.
+          data_len: Placeholder for the file size, if file is served from
+                    memory.
+       Return value:
+         NULL: do not serve file from memory, proceed with normal file open.
+         non-NULL: pointer to the file contents in memory. data_len must be
+           initilized with the size of the memory block. */
+    const char * (*open_file)(const struct mg_connection *,
+                              const char *path, size_t *data_len);
+
+    /* Called when civetweb is about to serve Lua server page, if
+       Lua support is enabled.
+       Parameters:
+         lua_context: "lua_State *" pointer. */
+    void (*init_lua)(struct mg_connection *, void *lua_context);
+
+    /* Called when civetweb has uploaded a file to a temporary directory as a
+       result of mg_upload() call.
+       Parameters:
+         file_name: full path name to the uploaded file. */
+    void (*upload)(struct mg_connection *, const char *file_name);
+
+    /* Called when civetweb is about to send HTTP error to the client.
+       Implementing this callback allows to create custom error pages.
+       Parameters:
+         status: HTTP error status code.
+       Return value:
+         1: run civetweb error handler.
+         0: callback already handled the error. */
+    int  (*http_error)(struct mg_connection *, int status);
+
+    /* Called after civetweb context has been created, before requests
+       are processed.
+       Parameters:
+         ctx: context handle */
+    void (*init_context)(struct mg_context * ctx);
+
+    /* Called when civetweb context is deleted.
+       Parameters:
+         ctx: context handle */
+    void (*exit_context)(struct mg_context * ctx);
+};
+
+
+/* Start web server.
+
+   Parameters:
+     callbacks: mg_callbacks structure with user-defined callbacks.
+     options: NULL terminated list of option_name, option_value pairs that
+              specify Civetweb configuration parameters.
+
+   Side-effects: on UNIX, ignores SIGCHLD and SIGPIPE signals. If custom
+      processing is required for these, signal handlers must be set up
+      after calling mg_start().
+
+
+   Example:
+     const char *options[] = {
+       "document_root", "/var/www",
+       "listening_ports", "80,443s",
+       NULL
+     };
+     struct mg_context *ctx = mg_start(&my_func, NULL, options);
+
+   Refer to https://github.com/bel2125/civetweb/blob/master/docs/UserManual.md
+   for the list of valid option and their possible values.
+
+   Return:
+     web server context, or NULL on error. */
+CIVETWEB_API struct mg_context *mg_start(const struct mg_callbacks *callbacks,
+                            void *user_data,
+                            const char **configuration_options);
+
+
+/* Stop the web server.
+
+   Must be called last, when an application wants to stop the web server and
+   release all associated resources. This function blocks until all Civetweb
+   threads are stopped. Context pointer becomes invalid. */
+CIVETWEB_API void mg_stop(struct mg_context *);
+
+
+/* mg_request_handler
+
+   Called when a new request comes in.  This callback is URI based
+   and configured with mg_set_request_handler().
+
+   Parameters:
+      conn: current connection information.
+      cbdata: the callback data configured with mg_set_request_handler().
+   Returns:
+      0: the handler could not handle the request, so fall through.
+      1: the handler processed the request. */
+typedef int (* mg_request_handler)(struct mg_connection *conn, void *cbdata);
+
+
+/* mg_set_request_handler
+
+   Sets or removes a URI mapping for a request handler.
+
+   URI's are ordered and prefixed URI's are supported. For example,
+   consider two URIs: /a/b and /a
+           /a   matches /a
+           /a/b matches /a/b
+           /a/c matches /a
+
+   Parameters:
+      ctx: server context
+      uri: the URI to configure
+      handler: the callback handler to use when the URI is requested.
+               If NULL, the URI will be removed.
+      cbdata: the callback data to give to the handler when it s requested. */
+CIVETWEB_API void mg_set_request_handler(struct mg_context *ctx, const char *uri, mg_request_handler handler, void *cbdata);
+
+
+/* Get the value of particular configuration parameter.
+   The value returned is read-only. Civetweb does not allow changing
+   configuration at run time.
+   If given parameter name is not valid, NULL is returned. For valid
+   names, return value is guaranteed to be non-NULL. If parameter is not
+   set, zero-length string is returned. */
+CIVETWEB_API const char *mg_get_option(const struct mg_context *ctx, const char *name);
+
+
+/* Get context from connection. */
+CIVETWEB_API struct mg_context *mg_get_context(struct mg_connection *conn);
+
+
+/* Get user data passed to mg_start from context. */
+CIVETWEB_API void *mg_get_user_data(struct mg_context *ctx);
+
+
+#if defined(MG_LEGACY_INTERFACE)
+/* Return array of strings that represent valid configuration options.
+   For each option, option name and default value is returned, i.e. the
+   number of entries in the array equals to number_of_options x 2.
+   Array is NULL terminated. */
+/* Deprecated: Use mg_get_valid_options instead. */
+CIVETWEB_API const char **mg_get_valid_option_names(void);
+#endif
+
+
+struct mg_option {
+    const char * name;
+    int type;
+    const char * default_value;
+};
+
+enum {
+    CONFIG_TYPE_UNKNOWN = 0x0,
+    CONFIG_TYPE_NUMBER = 0x1,
+    CONFIG_TYPE_STRING = 0x2,
+    CONFIG_TYPE_FILE = 0x3,
+    CONFIG_TYPE_DIRECTORY = 0x4,
+    CONFIG_TYPE_BOOLEAN = 0x5,
+    CONFIG_TYPE_EXT_PATTERN = 0x6
+};
+
+
+/* Return array of struct mg_option, representing all valid configuration
+   options of civetweb.c.
+   The array is terminated by a NULL name option. */
+CIVETWEB_API const struct mg_option *mg_get_valid_options(void);
+
+
+/* Get the list of ports that civetweb is listening on.
+   size is the size of the ports int array and ssl int array to fill.
+   It is the caller's responsibility to make sure ports and ssl each
+   contain at least size int elements worth of memory to write into.
+   Return value is the number of ports and ssl information filled in.
+   The value returned is read-only. Civetweb does not allow changing
+   configuration at run time. */
+CIVETWEB_API size_t mg_get_ports(const struct mg_context *ctx, size_t size, int* ports, int* ssl);
+
+
+/* Add, edit or delete the entry in the passwords file.
+
+   This function allows an application to manipulate .htpasswd files on the
+   fly by adding, deleting and changing user records. This is one of the
+   several ways of implementing authentication on the server side. For another,
+   cookie-based way please refer to the examples/chat in the source tree.
+
+   If password is not NULL, entry is added (or modified if already exists).
+   If password is NULL, entry is deleted.
+
+   Return:
+     1 on success, 0 on error. */
+CIVETWEB_API int mg_modify_passwords_file(const char *passwords_file_name,
+                                          const char *domain,
+                                          const char *user,
+                                          const char *password);
+
+
+/* Return information associated with the request. */
+CIVETWEB_API struct mg_request_info *mg_get_request_info(struct mg_connection *);
+
+
+/* Send data to the client.
+   Return:
+    0   when the connection has been closed
+    -1  on error
+    >0  number of bytes written on success */
+CIVETWEB_API int mg_write(struct mg_connection *, const void *buf, size_t len);
+
+
+/* Send data to a websocket client wrapped in a websocket frame.  Uses mg_lock
+   to ensure that the transmission is not interrupted, i.e., when the
+   application is proactively communicating and responding to a request
+   simultaneously.
+
+   Send data to a websocket client wrapped in a websocket frame.
+   This function is available when civetweb is compiled with -DUSE_WEBSOCKET
+
+   Return:
+    0   when the connection has been closed
+    -1  on error
+    >0  number of bytes written on success */
+CIVETWEB_API int mg_websocket_write(struct mg_connection* conn, int opcode,
+                                    const char *data, size_t data_len);
+
+
+/* Blocks until unique access is obtained to this connection. Intended for use
+   with websockets only.
+   Invoke this before mg_write or mg_printf when communicating with a
+   websocket if your code has server-initiated communication as well as
+   communication in direct response to a message. */
+CIVETWEB_API void mg_lock_connection(struct mg_connection* conn);
+CIVETWEB_API void mg_unlock_connection(struct mg_connection* conn);
+
+#if defined(MG_LEGACY_INTERFACE)
+#define mg_lock mg_lock_connection
+#define mg_unlock mg_unlock_connection
+#endif
+
+/* Lock server context.  This lock may be used to protect ressources
+   that are shared between different connection/worker threads. */
+CIVETWEB_API void mg_lock_context(struct mg_context* ctx);
+CIVETWEB_API void mg_unlock_context(struct mg_context* ctx);
+
+
+/* Opcodes, from http://tools.ietf.org/html/rfc6455 */
+enum {
+    WEBSOCKET_OPCODE_CONTINUATION = 0x0,
+    WEBSOCKET_OPCODE_TEXT = 0x1,
+    WEBSOCKET_OPCODE_BINARY = 0x2,
+    WEBSOCKET_OPCODE_CONNECTION_CLOSE = 0x8,
+    WEBSOCKET_OPCODE_PING = 0x9,
+    WEBSOCKET_OPCODE_PONG = 0xa
+};
+
+
+/* Macros for enabling compiler-specific checks forprintf-like arguments. */
+#undef PRINTF_FORMAT_STRING
+#if defined(_MSC_VER) && _MSC_VER >= 1400
+#include <sal.h>
+#if defined(_MSC_VER) && _MSC_VER > 1400
+#define PRINTF_FORMAT_STRING(s) _Printf_format_string_ s
+#else
+#define PRINTF_FORMAT_STRING(s) __format_string s
+#endif
+#else
+#define PRINTF_FORMAT_STRING(s) s
+#endif
+
+#ifdef __GNUC__
+#define PRINTF_ARGS(x, y) __attribute__((format(printf, x, y)))
+#else
+#define PRINTF_ARGS(x, y)
+#endif
+
+/* Send data to the client usingprintf() semantics.
+   Works exactly like mg_write(), but allows to do message formatting. */
+CIVETWEB_API int mg_printf(struct mg_connection *,
+                           PRINTF_FORMAT_STRING(const char *fmt), ...) PRINTF_ARGS(2, 3);
+
+
+/* Send contents of the entire file together with HTTP headers. */
+CIVETWEB_API void mg_send_file(struct mg_connection *conn, const char *path);
+
+
+/* Read data from the remote end, return number of bytes read.
+   Return:
+     0     connection has been closed by peer. No more data could be read.
+     < 0   read error. No more data could be read from the connection.
+     > 0   number of bytes read into the buffer. */
+CIVETWEB_API int mg_read(struct mg_connection *, void *buf, size_t len);
+
+
+/* Get the value of particular HTTP header.
+
+   This is a helper function. It traverses request_info->http_headers array,
+   and if the header is present in the array, returns its value. If it is
+   not present, NULL is returned. */
+CIVETWEB_API const char *mg_get_header(const struct mg_connection *, const char *name);
+
+
+/* Get a value of particular form variable.
+
+   Parameters:
+     data: pointer to form-uri-encoded buffer. This could be either POST data,
+           or request_info.query_string.
+     data_len: length of the encoded data.
+     var_name: variable name to decode from the buffer
+     dst: destination buffer for the decoded variable
+     dst_len: length of the destination buffer
+
+   Return:
+     On success, length of the decoded variable.
+     On error:
+        -1 (variable not found).
+        -2 (destination buffer is NULL, zero length or too small to hold the
+            decoded variable).
+
+   Destination buffer is guaranteed to be '\0' - terminated if it is not
+   NULL or zero length. */
+CIVETWEB_API int mg_get_var(const char *data, size_t data_len,
+                            const char *var_name, char *dst, size_t dst_len);
+
+
+/* Get a value of particular form variable.
+
+   Parameters:
+     data: pointer to form-uri-encoded buffer. This could be either POST data,
+           or request_info.query_string.
+     data_len: length of the encoded data.
+     var_name: variable name to decode from the buffer
+     dst: destination buffer for the decoded variable
+     dst_len: length of the destination buffer
+     occurrence: which occurrence of the variable, 0 is the first, 1 the
+                 second...
+                this makes it possible to parse a query like
+                b=x&a=y&a=z which will have occurrence values b:0, a:0 and a:1
+
+   Return:
+     On success, length of the decoded variable.
+     On error:
+        -1 (variable not found).
+        -2 (destination buffer is NULL, zero length or too small to hold the
+            decoded variable).
+
+   Destination buffer is guaranteed to be '\0' - terminated if it is not
+   NULL or zero length. */
+CIVETWEB_API int mg_get_var2(const char *data, size_t data_len,
+                             const char *var_name, char *dst, size_t dst_len, size_t occurrence);
+
+
+/* Fetch value of certain cookie variable into the destination buffer.
+
+   Destination buffer is guaranteed to be '\0' - terminated. In case of
+   failure, dst[0] == '\0'. Note that RFC allows many occurrences of the same
+   parameter. This function returns only first occurrence.
+
+   Return:
+     On success, value length.
+     On error:
+        -1 (either "Cookie:" header is not present at all or the requested
+            parameter is not found).
+        -2 (destination buffer is NULL, zero length or too small to hold the
+            value). */
+CIVETWEB_API int mg_get_cookie(const char *cookie, const char *var_name,
+                               char *buf, size_t buf_len);
+
+
+/* Download data from the remote web server.
+     host: host name to connect to, e.g. "foo.com", or "10.12.40.1".
+     port: port number, e.g. 80.
+     use_ssl: wether to use SSL connection.
+     error_buffer, error_buffer_size: error message placeholder.
+     request_fmt,...: HTTP request.
+   Return:
+     On success, valid pointer to the new connection, suitable for mg_read().
+     On error, NULL. error_buffer contains error message.
+   Example:
+     char ebuf[100];
+     struct mg_connection *conn;
+     conn = mg_download("google.com", 80, 0, ebuf, sizeof(ebuf),
+                        "%s", "GET / HTTP/1.0\r\nHost: google.com\r\n\r\n");
+ */
+CIVETWEB_API struct mg_connection *mg_download(const char *host, int port, int use_ssl,
+                                               char *error_buffer, size_t error_buffer_size,
+                                               PRINTF_FORMAT_STRING(const char *request_fmt),
+                                               ...) PRINTF_ARGS(6, 7);
+
+
+/* Close the connection opened by mg_download(). */
+CIVETWEB_API void mg_close_connection(struct mg_connection *conn);
+
+
+/* File upload functionality. Each uploaded file gets saved into a temporary
+   file and MG_UPLOAD event is sent.
+   Return number of uploaded files. */
+CIVETWEB_API int mg_upload(struct mg_connection *conn, const char *destination_dir);
+
+
+/* Convenience function -- create detached thread.
+   Return: 0 on success, non-0 on error. */
+typedef void * (*mg_thread_func_t)(void *);
+CIVETWEB_API int mg_start_thread(mg_thread_func_t f, void *p);
+
+
+/* Return builtin mime type for the given file name.
+   For unrecognized extensions, "text/plain" is returned. */
+CIVETWEB_API const char *mg_get_builtin_mime_type(const char *file_name);
+
+
+/* Return Civetweb version. */
+CIVETWEB_API const char *mg_version(void);
+
+
+/* URL-decode input buffer into destination buffer.
+   0-terminate the destination buffer.
+   form-url-encoded data differs from URI encoding in a way that it
+   uses '+' as character for space, see RFC 1866 section 8.2.1
+   http://ftp.ics.uci.edu/pub/ietf/html/rfc1866.txt
+   Return: length of the decoded data, or -1 if dst buffer is too small. */
+CIVETWEB_API int mg_url_decode(const char *src, int src_len, char *dst,
+                               int dst_len, int is_form_url_encoded);
+
+
+/* URL-encode input buffer into destination buffer.
+   returns the length of the resulting buffer or -1
+   is the buffer is too small. */
+CIVETWEB_API int mg_url_encode(const char *src, char *dst, size_t dst_len);
+
+
+/* MD5 hash given strings.
+   Buffer 'buf' must be 33 bytes long. Varargs is a NULL terminated list of
+   ASCIIz strings. When function returns, buf will contain human-readable
+   MD5 hash. Example:
+     char buf[33];
+     mg_md5(buf, "aa", "bb", NULL); */
+CIVETWEB_API char *mg_md5(char buf[33], ...);
+
+
+/* Print error message to the opened error log stream.
+   This utilizes the provided logging configuration.
+     conn: connection
+     fmt: format string without the line return
+     ...: variable argument list
+   Example:
+     mg_cry(conn,"i like %s", "logging"); */
+CIVETWEB_API void mg_cry(struct mg_connection *conn,
+                         PRINTF_FORMAT_STRING(const char *fmt), ...) PRINTF_ARGS(2, 3);
+
+
+/* utility method to compare two buffers, case incensitive. */
+CIVETWEB_API int mg_strncasecmp(const char *s1, const char *s2, size_t len);
+
+/* Connect to a websocket as a client
+   Parameters:
+     host: host to connect to, i.e. "echo.websocket.org" or "192.168.1.1" or "localhost"
+     port: server port
+     use_ssl: make a secure connection to server
+     error_buffer, error_buffer_size: buffer for an error message
+     path: server path you are trying to connect to, i.e. if connection to localhost/app, path should be "/app"
+     origin: value of the Origin HTTP header
+     data_func: callback that should be used when data is received from the server
+     user_data: user supplied argument
+
+   Return:
+     On success, valid mg_connection object.
+     On error, NULL. Se error_buffer for details.
+*/
+
+typedef int  (*websocket_data_func)(struct mg_connection *, int bits,
+                           char *data, size_t data_len);
+
+typedef void (*websocket_close_func)(struct mg_connection *);
+
+CIVETWEB_API struct mg_connection *mg_connect_websocket_client(const char *host, int port, int use_ssl,
+                                               char *error_buffer, size_t error_buffer_size,
+                                               const char *path, const char *origin,
+                                               websocket_data_func data_func, websocket_close_func close_func,
+                                               void * user_data);
+
+/* Connect to a TCP server as a client (can be used to connect to a HTTP server)
+   Parameters:
+     host: host to connect to, i.e. "www.wikipedia.org" or "192.168.1.1" or "localhost"
+     port: server port
+     use_ssl: make a secure connection to server
+     error_buffer, error_buffer_size: buffer for an error message
+
+   Return:
+     On success, valid mg_connection object.
+     On error, NULL. Se error_buffer for details.
+*/
+CIVETWEB_API struct mg_connection *mg_connect_client(const char *host, int port, int use_ssl,
+                                               char *error_buffer, size_t error_buffer_size);
+
+
+enum {
+    TIMEOUT_INFINITE = -1
+};
+
+/* Wait for a response from the server
+   Parameters:
+     conn: connection
+     ebuf, ebuf_len: error message placeholder.
+     timeout: time to wait for a response in milliseconds (if < 0 then wait forever)
+
+   Return:
+     On success, >= 0
+     On error/timeout, < 0
+*/
+CIVETWEB_API int mg_get_response(struct mg_connection *conn, char *ebuf, size_t ebuf_len, int timeout);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* CIVETWEB_HEADER_INCLUDED */

http://git-wip-us.apache.org/repos/asf/celix/blob/2a670f26/remote_services/discovery_common/include/discovery.h
----------------------------------------------------------------------
diff --git a/remote_services/discovery_common/include/discovery.h b/remote_services/discovery_common/include/discovery.h
new file mode 100644
index 0000000..ee79caf
--- /dev/null
+++ b/remote_services/discovery_common/include/discovery.h
@@ -0,0 +1,67 @@
+/**
+ *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.
+ */
+/*
+ * discovery.h
+ *
+ *  \date       Sep 29, 2011
+ *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ *  \copyright	Apache License, Version 2.0
+ */
+
+#ifndef DISCOVERY_H_
+#define DISCOVERY_H_
+
+#include "bundle_context.h"
+#include "service_reference.h"
+
+#include "endpoint_description.h"
+#include "endpoint_listener.h"
+
+#define DISCOVERY_SERVER_INTERFACE	"DISCOVERY_CFG_SERVER_INTERFACE"
+#define DISCOVERY_SERVER_IP 		"DISCOVERY_CFG_SERVER_IP"
+#define DISCOVERY_SERVER_PORT 		"DISCOVERY_CFG_SERVER_PORT"
+#define DISCOVERY_SERVER_PATH 		"DISCOVERY_CFG_SERVER_PATH"
+#define DISCOVERY_POLL_ENDPOINTS 	"DISCOVERY_CFG_POLL_ENDPOINTS"
+#define DISCOVERY_SERVER_MAX_EP	"DISCOVERY_CFG_SERVER_MAX_EP"
+
+typedef struct discovery *discovery_pt;
+
+
+/* those one could be put into a general discovery.h - file */
+celix_status_t discovery_create(bundle_context_pt context, discovery_pt *discovery);
+celix_status_t discovery_destroy(discovery_pt discovery);
+
+celix_status_t discovery_start(discovery_pt discovery);
+celix_status_t discovery_stop(discovery_pt discovery);
+
+celix_status_t discovery_endpointAdded(void *handle, endpoint_description_pt endpoint, char *machtedFilter);
+celix_status_t discovery_endpointRemoved(void *handle, endpoint_description_pt endpoint, char *machtedFilter);
+
+celix_status_t discovery_endpointListenerAdding(void * handle, service_reference_pt reference, void **service);
+celix_status_t discovery_endpointListenerAdded(void * handle, service_reference_pt reference, void * service);
+celix_status_t discovery_endpointListenerModified(void * handle, service_reference_pt reference, void * service);
+celix_status_t discovery_endpointListenerRemoved(void * handle, service_reference_pt reference, void * service);
+
+celix_status_t discovery_informEndpointListeners(discovery_pt discovery, endpoint_description_pt endpoint, bool endpointAdded);
+celix_status_t discovery_updateEndpointListener(discovery_pt discovery, service_reference_pt reference, endpoint_listener_pt service);
+
+celix_status_t discovery_addDiscoveredEndpoint(discovery_pt discovery, endpoint_description_pt endpoint);
+celix_status_t discovery_removeDiscoveredEndpoint(discovery_pt discovery, endpoint_description_pt endpoint);
+
+#endif /* DISCOVERY_H_ */