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/20 20:33:07 UTC
[10/46] celix git commit: CELIX-417: Initial refactoring for CMake
usage
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/public/include/log_listener.h
----------------------------------------------------------------------
diff --git a/log_service/public/include/log_listener.h b/log_service/public/include/log_listener.h
deleted file mode 100644
index b726994..0000000
--- a/log_service/public/include/log_listener.h
+++ /dev/null
@@ -1,43 +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.
- */
-/*
- * log_listener.h
- *
- * \date Jul 4, 2011
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-
-#ifndef LOG_LISTENER_H_
-#define LOG_LISTENER_H_
-
-#include "log_entry.h"
-#include "celix_errno.h"
-
-struct log_listener {
- void *handle;
- celix_status_t (*logged)(struct log_listener *listener, log_entry_pt entry);
-};
-
-typedef struct log_listener log_listener_t;
-typedef log_listener_t* log_listener_pt;
-
-celix_status_t logListener_logged(log_listener_pt listener, log_entry_pt entry);
-
-#endif /* LOG_LISTENER_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/public/include/log_reader_service.h
----------------------------------------------------------------------
diff --git a/log_service/public/include/log_reader_service.h b/log_service/public/include/log_reader_service.h
deleted file mode 100644
index 6815123..0000000
--- a/log_service/public/include/log_reader_service.h
+++ /dev/null
@@ -1,50 +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.
- */
-/*
- * log_reader_service.h
- *
- * \date Jun 26, 2011
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-
-#ifndef LOG_READER_SERVICE_H_
-#define LOG_READER_SERVICE_H_
-
-
-#include "celix_errno.h"
-#include "linked_list.h"
-#include "log_listener.h"
-
-static const char * const OSGI_LOGSERVICE_READER_SERVICE_NAME = "log_reader_service";
-
-typedef struct log_reader_data log_reader_data_t;
-typedef log_reader_data_t* log_reader_data_pt;
-
-struct log_reader_service {
- log_reader_data_pt reader;
- celix_status_t (*getLog)(log_reader_data_pt reader, linked_list_pt *list);
- celix_status_t (*addLogListener)(log_reader_data_pt reader, log_listener_pt listener);
- celix_status_t (*removeLogListener)(log_reader_data_pt reader, log_listener_pt listener);
- celix_status_t (*removeAllLogListener)(log_reader_data_pt reader);
-};
-
-typedef struct log_reader_service * log_reader_service_pt;
-
-#endif /* LOG_READER_SERVICE_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/public/include/log_service.h
----------------------------------------------------------------------
diff --git a/log_service/public/include/log_service.h b/log_service/public/include/log_service.h
deleted file mode 100644
index 2691e35..0000000
--- a/log_service/public/include/log_service.h
+++ /dev/null
@@ -1,58 +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.
- */
-/*
- * log_service.h
- *
- * \date Jun 22, 2011
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-
-#ifndef LOG_SERVICE_H_
-#define LOG_SERVICE_H_
-
-#include "celix_errno.h"
-#include "service_reference.h"
-
-static const char * const OSGI_LOGSERVICE_NAME = "log_service";
-
-typedef struct log_service_data *log_service_data_pt;
-
-enum log_level
-{
- OSGI_LOGSERVICE_ERROR = 0x00000001,
- OSGI_LOGSERVICE_WARNING = 0x00000002,
- OSGI_LOGSERVICE_INFO = 0x00000003,
- OSGI_LOGSERVICE_DEBUG = 0x00000004,
-};
-
-typedef enum log_level log_level_t;
-
-struct log_service {
- log_service_data_pt logger;
- celix_status_t (*log)(log_service_data_pt logger, log_level_t level, char * message);
- celix_status_t (*logSr)(log_service_data_pt logger, service_reference_pt reference, log_level_t level, char * message);
-};
-
-typedef struct log_service log_service_t;
-typedef log_service_t* log_service_pt;
-
-
-
-#endif /* LOG_SERVICE_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/public/src/log_helper.c
----------------------------------------------------------------------
diff --git a/log_service/public/src/log_helper.c b/log_service/public/src/log_helper.c
deleted file mode 100644
index c0cd309..0000000
--- a/log_service/public/src/log_helper.c
+++ /dev/null
@@ -1,211 +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.
- */
-/*
- * log_helper.c
- *
- * \date Nov 10, 2014
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-
-#include <stdlib.h>
-#include <stdarg.h>
-
-#include "bundle_context.h"
-#include "service_tracker.h"
-#include "celix_threads.h"
-#include "array_list.h"
-
-#include "celix_errno.h"
-#include "log_service.h"
-
-#include "log_helper.h"
-
-#define LOGHELPER_ENABLE_STDOUT_FALLBACK_PROPERTY_NAME "LOGHELPER_ENABLE_STDOUT_FALLBACK"
-
-
-struct log_helper {
- bundle_context_pt bundleContext;
- service_tracker_pt logServiceTracker;
- celix_thread_mutex_t logListLock;
- array_list_pt logServices;
- bool stdOutFallback;
-};
-
-celix_status_t logHelper_logServiceAdded(void *handle, service_reference_pt reference, void *service);
-celix_status_t logHelper_logServiceRemoved(void *handle, service_reference_pt reference, void *service);
-
-
-celix_status_t logHelper_create(bundle_context_pt context, log_helper_pt* loghelper)
-{
- celix_status_t status = CELIX_SUCCESS;
-
- (*loghelper) = calloc(1, sizeof(**loghelper));
-
- if (!(*loghelper))
- {
- status = CELIX_ENOMEM;
- }
- else
- {
- const char* stdOutFallbackStr = NULL;
- (*loghelper)->bundleContext = context;
- (*loghelper)->logServiceTracker = NULL;
- (*loghelper)->stdOutFallback = false;
-
- bundleContext_getProperty(context, LOGHELPER_ENABLE_STDOUT_FALLBACK_PROPERTY_NAME, &stdOutFallbackStr);
-
- if (stdOutFallbackStr != NULL) {
- (*loghelper)->stdOutFallback = true;
- }
-
- pthread_mutex_init(&(*loghelper)->logListLock, NULL);
- arrayList_create(&(*loghelper)->logServices);
- }
-
- return status;
-}
-
-celix_status_t logHelper_start(log_helper_pt loghelper)
-{
- celix_status_t status;
- service_tracker_customizer_pt logTrackerCustomizer = NULL;
-
- status = serviceTrackerCustomizer_create(loghelper, NULL, logHelper_logServiceAdded, NULL, logHelper_logServiceRemoved, &logTrackerCustomizer);
-
- if (status == CELIX_SUCCESS) {
- loghelper->logServiceTracker = NULL;
- status = serviceTracker_create(loghelper->bundleContext, (char*) OSGI_LOGSERVICE_NAME, logTrackerCustomizer, &loghelper->logServiceTracker);
- }
-
- if (status == CELIX_SUCCESS) {
- status = serviceTracker_open(loghelper->logServiceTracker);
- }
-
- return status;
-}
-
-
-
-celix_status_t logHelper_logServiceAdded(void *handle, service_reference_pt reference, void *service)
-{
- log_helper_pt loghelper = handle;
-
- pthread_mutex_lock(&loghelper->logListLock);
- arrayList_add(loghelper->logServices, service);
- pthread_mutex_unlock(&loghelper->logListLock);
-
- return CELIX_SUCCESS;
-}
-
-celix_status_t logHelper_logServiceRemoved(void *handle, service_reference_pt reference, void *service)
-{
- log_helper_pt loghelper = handle;
-
- pthread_mutex_lock(&loghelper->logListLock);
- arrayList_removeElement(loghelper->logServices, service);
- pthread_mutex_unlock(&loghelper->logListLock);
-
- return CELIX_SUCCESS;
-}
-
-
-celix_status_t logHelper_stop(log_helper_pt loghelper) {
- celix_status_t status;
-
- status = serviceTracker_close(loghelper->logServiceTracker);
-
- return status;
-}
-
-celix_status_t logHelper_destroy(log_helper_pt* loghelper) {
- celix_status_t status = CELIX_SUCCESS;
-
- if((*loghelper)->logServiceTracker){
- serviceTracker_destroy((*loghelper)->logServiceTracker);
- }
-
- pthread_mutex_lock(&(*loghelper)->logListLock);
- arrayList_destroy((*loghelper)->logServices);
- pthread_mutex_unlock(&(*loghelper)->logListLock);
-
- pthread_mutex_destroy(&(*loghelper)->logListLock);
-
- free(*loghelper);
- *loghelper = NULL;
- return status;
-}
-
-
-
-
-celix_status_t logHelper_log(log_helper_pt loghelper, log_level_t level, char* message, ... )
-{
- celix_status_t status = CELIX_SUCCESS;
- va_list listPointer;
- char msg[1024];
- msg[0] = '\0';
- bool logged = false;
-
- if(loghelper == NULL){
- return CELIX_ILLEGAL_ARGUMENT;
- }
-
- va_start(listPointer, message);
- vsnprintf(msg, 1024, message, listPointer);
-
- pthread_mutex_lock(&loghelper->logListLock);
-
- int i = 0;
- for (; i < arrayList_size(loghelper->logServices); i++) {
- log_service_pt logService = arrayList_get(loghelper->logServices, i);
- if (logService != NULL) {
- (logService->log)(logService->logger, level, msg);
- logged = true;
- }
- }
-
- pthread_mutex_unlock(&loghelper->logListLock);
-
- if (!logged && loghelper->stdOutFallback) {
- char *levelStr = NULL;
-
- switch (level) {
- case OSGI_LOGSERVICE_ERROR:
- levelStr = "ERROR";
- break;
- case OSGI_LOGSERVICE_WARNING:
- levelStr = "WARNING";
- break;
- case OSGI_LOGSERVICE_INFO:
- levelStr = "INFO";
- break;
- case OSGI_LOGSERVICE_DEBUG:
- default:
- levelStr = "DEBUG";
- break;
- }
-
- printf("%s: %s\n", levelStr, msg);
- }
-
- va_end(listPointer);
-
- return status;
-}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/src/log.c
----------------------------------------------------------------------
diff --git a/log_service/src/log.c b/log_service/src/log.c
new file mode 100644
index 0000000..5b29318
--- /dev/null
+++ b/log_service/src/log.c
@@ -0,0 +1,375 @@
+/**
+ *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.
+ */
+/*
+ * log.c
+ *
+ * \date Jun 26, 2011
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+#include <stdlib.h>
+
+#include "log.h"
+#include "linked_list_iterator.h"
+#include "array_list.h"
+
+struct log {
+ linked_list_pt entries;
+ celix_thread_mutex_t lock;
+
+ array_list_pt listeners;
+ array_list_pt listenerEntries;
+
+ celix_thread_t listenerThread;
+ bool running;
+
+ celix_thread_cond_t entriesToDeliver;
+ celix_thread_mutex_t deliverLock;
+ celix_thread_mutex_t listenerLock;
+
+ int max_size;
+ bool store_debug;
+};
+
+static celix_status_t log_startListenerThread(log_pt logger);
+static celix_status_t log_stopListenerThread(log_pt logger);
+
+
+static void *log_listenerThread(void *data);
+
+celix_status_t log_create(int max_size, bool store_debug, log_pt *logger) {
+ celix_status_t status = CELIX_ENOMEM;
+
+ *logger = calloc(1, sizeof(**logger));
+
+ if (*logger != NULL) {
+ linkedList_create(&(*logger)->entries);
+
+ status = celixThreadMutex_create(&(*logger)->lock, NULL);
+
+ (*logger)->listeners = NULL;
+ (*logger)->listenerEntries = NULL;
+ (*logger)->listenerThread = celix_thread_default;
+ (*logger)->running = false;
+
+ (*logger)->max_size = max_size;
+ (*logger)->store_debug = store_debug;
+
+ arrayList_create(&(*logger)->listeners);
+ arrayList_create(&(*logger)->listenerEntries);
+
+ if (celixThreadCondition_init(&(*logger)->entriesToDeliver, NULL) != CELIX_SUCCESS) {
+ status = CELIX_INVALID_SYNTAX;
+ }
+ else if (celixThreadMutex_create(&(*logger)->deliverLock, NULL) != CELIX_SUCCESS) {
+ status = CELIX_INVALID_SYNTAX;
+ }
+ else if (celixThreadMutex_create(&(*logger)->listenerLock, NULL) != CELIX_SUCCESS) {
+ status = CELIX_INVALID_SYNTAX;
+ }
+ else {
+ status = CELIX_SUCCESS;
+ }
+ }
+
+ return status;
+}
+
+celix_status_t log_destroy(log_pt logger) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ celixThreadMutex_destroy(&logger->listenerLock);
+ celixThreadMutex_destroy(&logger->deliverLock);
+ celixThreadCondition_destroy(&logger->entriesToDeliver);
+
+ arrayList_destroy(logger->listeners);
+ linked_list_iterator_pt iter = linkedListIterator_create(logger->entries, 0);
+ while (linkedListIterator_hasNext(iter)) {
+ log_entry_pt entry = linkedListIterator_next(iter);
+ if (arrayList_contains(logger->listenerEntries, entry)) {
+ arrayList_removeElement(logger->listenerEntries, entry);
+ }
+ logEntry_destroy(&entry);
+ }
+ linkedListIterator_destroy(iter);
+
+ array_list_iterator_pt entryIter = arrayListIterator_create(logger->listenerEntries);
+
+ while (arrayListIterator_hasNext(entryIter)) {
+ log_entry_pt entry = arrayListIterator_next(entryIter);
+ logEntry_destroy(&entry);
+ }
+ arrayListIterator_destroy(entryIter);
+
+ arrayList_destroy(logger->listenerEntries);
+ linkedList_destroy(logger->entries);
+
+ celixThreadMutex_destroy(&logger->lock);
+
+ free(logger);
+
+ return status;
+}
+
+celix_status_t log_addEntry(log_pt log, log_entry_pt entry) {
+ celixThreadMutex_lock(&log->lock);
+
+ if (log->max_size != 0) {
+ if (log->store_debug || entry->level != OSGI_LOGSERVICE_DEBUG) {
+ linkedList_addElement(log->entries, entry);
+ }
+ }
+
+ celixThreadMutex_lock(&log->deliverLock);
+ arrayList_add(log->listenerEntries, entry);
+ celixThreadMutex_unlock(&log->deliverLock);
+
+ celixThreadCondition_signal(&log->entriesToDeliver);
+
+ if (log->max_size != 0) {
+ if (log->max_size != -1) {
+ if (linkedList_size(log->entries) > log->max_size) {
+ log_entry_pt rentry = linkedList_removeFirst(log->entries);
+ if (rentry) {
+ celixThreadMutex_lock(&log->deliverLock);
+ arrayList_removeElement(log->listenerEntries, rentry);
+ logEntry_destroy(&rentry);
+ celixThreadMutex_unlock(&log->deliverLock);
+ }
+ }
+ }
+ }
+
+ celixThreadMutex_unlock(&log->lock);
+
+ return CELIX_SUCCESS;
+}
+
+celix_status_t log_getEntries(log_pt log, linked_list_pt *list) {
+ linked_list_pt entries = NULL;
+ if (linkedList_create(&entries) == CELIX_SUCCESS) {
+ linked_list_iterator_pt iter = NULL;
+
+ celixThreadMutex_lock(&log->lock);
+
+ iter = linkedListIterator_create(log->entries, 0);
+ while (linkedListIterator_hasNext(iter)) {
+ linkedList_addElement(entries, linkedListIterator_next(iter));
+ }
+ linkedListIterator_destroy(iter);
+
+ *list = entries;
+
+ celixThreadMutex_unlock(&log->lock);
+
+ return CELIX_SUCCESS;
+ } else {
+ return CELIX_ENOMEM;
+ }
+}
+
+celix_status_t log_bundleChanged(void *listener, bundle_event_pt event) {
+ celix_status_t status = CELIX_SUCCESS;
+ log_pt logger = ((bundle_listener_pt) listener)->handle;
+ log_entry_pt entry = NULL;
+
+ int messagesLength = 10;
+ char *messages[] = {
+ "BUNDLE_EVENT_INSTALLED",
+ "BUNDLE_EVENT_STARTED",
+ "BUNDLE_EVENT_STOPPED",
+ "BUNDLE_EVENT_UPDATED",
+ "BUNDLE_EVENT_UNINSTALLED",
+ "BUNDLE_EVENT_RESOLVED",
+ "BUNDLE_EVENT_UNRESOLVED",
+ "BUNDLE_EVENT_STARTING",
+ "BUNDLE_EVENT_STOPPING",
+ "BUNDLE_EVENT_LAZY_ACTIVATION"
+ };
+
+ char *message = NULL;
+ int i = 0;
+ for (i = 0; i < messagesLength; i++) {
+ if (event->type >> i == 1) {
+ message = messages[i];
+ }
+ }
+
+ if (message != NULL) {
+ status = logEntry_create(event->bundleId, event->bundleSymbolicName, NULL, OSGI_LOGSERVICE_INFO, message, 0, &entry);
+ if (status == CELIX_SUCCESS) {
+ status = log_addEntry(logger, entry);
+ }
+ }
+
+ return status;
+}
+
+celix_status_t log_frameworkEvent(void *listener, framework_event_pt event) {
+ celix_status_t status;
+ log_pt logger = ((framework_listener_pt) listener)->handle;
+ log_entry_pt entry = NULL;
+
+ status = logEntry_create(event->bundleId, event->bundleSymbolicName, NULL, (event->type == OSGI_FRAMEWORK_EVENT_ERROR) ? OSGI_LOGSERVICE_ERROR : OSGI_LOGSERVICE_INFO, event->error, event->errorCode, &entry);
+ if (status == CELIX_SUCCESS) {
+ status = log_addEntry(logger, entry);
+ }
+
+ return status;
+}
+
+celix_status_t log_addLogListener(log_pt logger, log_listener_pt listener) {
+ celix_status_t status;
+
+ status = celixThreadMutex_lock(&logger->listenerLock);
+
+ if (status == CELIX_SUCCESS) {
+ arrayList_add(logger->listeners, listener);
+ log_startListenerThread(logger);
+
+ status = celixThreadMutex_unlock(&logger->listenerLock);
+ }
+
+ return status;
+}
+
+celix_status_t log_removeLogListener(log_pt logger, log_listener_pt listener) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ status += celixThreadMutex_lock(&logger->deliverLock);
+ status += celixThreadMutex_lock(&logger->listenerLock);
+
+ if (status == CELIX_SUCCESS) {
+ bool last = false;
+
+ arrayList_removeElement(logger->listeners, listener);
+ if (arrayList_size(logger->listeners) == 0) {
+ status = log_stopListenerThread(logger);
+ last = true;
+ }
+
+ status += celixThreadMutex_unlock(&logger->listenerLock);
+ status += celixThreadMutex_unlock(&logger->deliverLock);
+
+ if (last) {
+ status += celixThread_join(logger->listenerThread, NULL);
+ }
+ }
+
+ if (status != CELIX_SUCCESS) {
+ status = CELIX_SERVICE_EXCEPTION;
+ }
+
+ return status;
+}
+
+celix_status_t log_removeAllLogListener(log_pt logger) {
+ celix_status_t status;
+
+ status = celixThreadMutex_lock(&logger->listenerLock);
+
+ if (status == CELIX_SUCCESS) {
+ arrayList_clear(logger->listeners);
+
+ status = celixThreadMutex_unlock(&logger->listenerLock);
+ }
+
+ return status;
+}
+
+static celix_status_t log_startListenerThread(log_pt logger) {
+ celix_status_t status;
+
+ logger->running = true;
+ logger->running = true;
+ status = celixThread_create(&logger->listenerThread, NULL, log_listenerThread, logger);
+
+ return status;
+}
+
+static celix_status_t log_stopListenerThread(log_pt logger) {
+ celix_status_t status;
+
+ logger->running = false;
+
+ status = celixThreadCondition_signal(&logger->entriesToDeliver);
+
+ return status;
+}
+
+static void * log_listenerThread(void *data) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ log_pt logger = data;
+
+ while (logger->running) {
+
+ status = celixThreadMutex_lock(&logger->deliverLock);
+
+ if ( status != CELIX_SUCCESS) {
+ logger->running = false;
+ }
+ else {
+ if (!arrayList_isEmpty(logger->listenerEntries)) {
+ log_entry_pt entry = (log_entry_pt) arrayList_remove(logger->listenerEntries, 0);
+
+ if (entry) {
+ status = celixThreadMutex_lock(&logger->listenerLock);
+ if (status != CELIX_SUCCESS) {
+ logger->running = false;
+ break;
+ } else {
+ array_list_iterator_pt it = arrayListIterator_create(logger->listeners);
+ while (arrayListIterator_hasNext(it)) {
+ log_listener_pt listener = arrayListIterator_next(it);
+ listener->logged(listener, entry);
+ }
+ arrayListIterator_destroy(it);
+
+ // destroy not-stored entries
+ if (!(logger->store_debug || entry->level != OSGI_LOGSERVICE_DEBUG)) {
+ logEntry_destroy(&entry);
+ }
+
+ status = celixThreadMutex_unlock(&logger->listenerLock);
+ if (status != CELIX_SUCCESS) {
+ logger->running = false;
+ break;
+ }
+ }
+ }
+ }
+
+ if (arrayList_isEmpty(logger->listenerEntries) && logger->running) {
+ celixThreadCondition_wait(&logger->entriesToDeliver, &logger->deliverLock);
+ }
+
+ status = celixThreadMutex_unlock(&logger->deliverLock);
+
+ if (status != CELIX_SUCCESS) {
+ logger->running = false;
+ break;
+ }
+ }
+
+ }
+
+ celixThread_exit(NULL);
+ return NULL;
+}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/src/log.h
----------------------------------------------------------------------
diff --git a/log_service/src/log.h b/log_service/src/log.h
new file mode 100644
index 0000000..e0d7b87
--- /dev/null
+++ b/log_service/src/log.h
@@ -0,0 +1,48 @@
+/**
+ *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.
+ */
+/*
+ * log.h
+ *
+ * \date Jun 26, 2011
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#ifndef LOG_H_
+#define LOG_H_
+
+#include "linked_list.h"
+#include "log_entry.h"
+#include "log_listener.h"
+
+typedef struct log * log_pt;
+
+celix_status_t log_create(int max_size, bool store_debug, log_pt *logger);
+celix_status_t log_destroy(log_pt logger);
+celix_status_t log_addEntry(log_pt log, log_entry_pt entry);
+celix_status_t log_getEntries(log_pt log, linked_list_pt *list);
+
+celix_status_t log_bundleChanged(void *listener, bundle_event_pt event);
+celix_status_t log_frameworkEvent(void *listener, framework_event_pt event);
+
+celix_status_t log_addLogListener(log_pt logger, log_listener_pt listener);
+celix_status_t log_removeLogListener(log_pt logger, log_listener_pt listener);
+celix_status_t log_removeAllLogListener(log_pt logger);
+
+#endif /* LOG_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/src/log_entry.c
----------------------------------------------------------------------
diff --git a/log_service/src/log_entry.c b/log_service/src/log_entry.c
new file mode 100644
index 0000000..3a8603a
--- /dev/null
+++ b/log_service/src/log_entry.c
@@ -0,0 +1,94 @@
+/**
+ *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.
+ */
+/*
+ * log_entry.c
+ *
+ * \date Jun 26, 2011
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "celix_errno.h"
+#include "log_service.h"
+#include "log_entry.h"
+
+celix_status_t logEntry_create(long bundleId, const char* bundleSymbolicName , service_reference_pt reference,
+ log_level_t level, char *message, int errorCode,
+ log_entry_pt *entry) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ *entry = malloc(sizeof(**entry));
+ if (*entry == NULL) {
+ status = CELIX_ENOMEM;
+ } else {
+ (*entry)->level = level;
+ (*entry)->message = strdup(message);
+ (*entry)->errorCode = errorCode;
+ (*entry)->time = time(NULL);
+
+ (*entry)->bundleSymbolicName = strdup(bundleSymbolicName);
+ (*entry)->bundleId = bundleId;
+ }
+
+ return status;
+}
+
+celix_status_t logEntry_destroy(log_entry_pt *entry) {
+ if (*entry) {
+ free((*entry)->bundleSymbolicName);
+ free((*entry)->message);
+ free(*entry);
+ *entry = NULL;
+ }
+ return CELIX_SUCCESS;
+}
+
+celix_status_t logEntry_getBundleSymbolicName(log_entry_pt entry, const char** bundleSymbolicName) {
+ *bundleSymbolicName = entry->bundleSymbolicName;
+ return CELIX_SUCCESS;
+}
+
+celix_status_t logEntry_getBundleId(log_entry_pt entry, long *bundleId) {
+ *bundleId = entry->bundleId;
+ return CELIX_SUCCESS;
+}
+
+celix_status_t logEntry_getErrorCode(log_entry_pt entry, int *errorCode) {
+ *errorCode = entry->errorCode;
+ return CELIX_SUCCESS;
+}
+
+celix_status_t logEntry_getLevel(log_entry_pt entry, log_level_t *level) {
+ *level = entry->level;
+ return CELIX_SUCCESS;
+}
+
+celix_status_t logEntry_getMessage(log_entry_pt entry, const char **message) {
+ *message = entry->message;
+ return CELIX_SUCCESS;
+}
+
+celix_status_t logEntry_getTime(log_entry_pt entry, time_t *time) {
+ *time = entry->time;
+ return CELIX_SUCCESS;
+}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/src/log_factory.c
----------------------------------------------------------------------
diff --git a/log_service/src/log_factory.c b/log_service/src/log_factory.c
new file mode 100644
index 0000000..1c0a17a
--- /dev/null
+++ b/log_service/src/log_factory.c
@@ -0,0 +1,100 @@
+/**
+ *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.
+ */
+/*
+ * log_factory.c
+ *
+ * \date Jun 26, 2011
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#include <stddef.h>
+#include <stdlib.h>
+
+
+#include "service_factory.h"
+#include "log_factory.h"
+#include "log_service_impl.h"
+
+struct log_service_factory {
+ log_pt log;
+};
+
+celix_status_t logFactory_create(log_pt log, service_factory_pt *factory) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ *factory = calloc(1, sizeof(**factory));
+ if (*factory == NULL) {
+ status = CELIX_ENOMEM;
+ } else {
+ log_service_factory_pt factoryData = calloc(1, sizeof(*factoryData));
+ if (factoryData == NULL) {
+ status = CELIX_ENOMEM;
+ } else {
+ factoryData->log = log;
+
+ (*factory)->handle = factoryData;
+ (*factory)->getService = logFactory_getService;
+ (*factory)->ungetService = logFactory_ungetService;
+ }
+ }
+
+ return status;
+}
+
+celix_status_t logFactory_destroy(service_factory_pt *factory) {
+ celix_status_t status = CELIX_SUCCESS;
+
+
+ free((*factory)->handle);
+ free(*factory);
+
+ factory = NULL;
+
+ return status;
+}
+
+
+celix_status_t logFactory_getService(void *factory, bundle_pt bundle, service_registration_pt registration, void **service) {
+ log_service_factory_pt log_factory = factory;
+ log_service_pt log_service = NULL;
+ log_service_data_pt log_service_data = NULL;
+
+ logService_create(log_factory->log, bundle, &log_service_data);
+
+ log_service = calloc(1, sizeof(*log_service));
+ log_service->logger = log_service_data;
+ log_service->log = logService_log;
+ // log_service->logSr = logService_logSr;
+
+ (*service) = log_service;
+
+ return CELIX_SUCCESS;
+}
+
+celix_status_t logFactory_ungetService(void *factory, bundle_pt bundle, service_registration_pt registration, void **service) {
+ log_service_pt log_service = *service;
+
+ logService_destroy(&log_service->logger);
+
+ free(*service);
+ *service = NULL;
+
+ return CELIX_SUCCESS;
+}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/src/log_factory.h
----------------------------------------------------------------------
diff --git a/log_service/src/log_factory.h b/log_service/src/log_factory.h
new file mode 100644
index 0000000..8ebe5f8
--- /dev/null
+++ b/log_service/src/log_factory.h
@@ -0,0 +1,40 @@
+/**
+ *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.
+ */
+/*
+ * log_factory.h
+ *
+ * \date Jun 26, 2011
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#ifndef LOG_FACTORY_H_
+#define LOG_FACTORY_H_
+
+#include "log.h"
+
+typedef struct log_service_factory * log_service_factory_pt;
+
+celix_status_t logFactory_create(log_pt log, service_factory_pt *factory);
+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);
+celix_status_t logFactory_ungetService(void *factory, bundle_pt bundle, service_registration_pt registration, void **service);
+
+
+#endif /* LOG_FACTORY_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/src/log_helper.c
----------------------------------------------------------------------
diff --git a/log_service/src/log_helper.c b/log_service/src/log_helper.c
new file mode 100644
index 0000000..c0cd309
--- /dev/null
+++ b/log_service/src/log_helper.c
@@ -0,0 +1,211 @@
+/**
+ *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.
+ */
+/*
+ * log_helper.c
+ *
+ * \date Nov 10, 2014
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "bundle_context.h"
+#include "service_tracker.h"
+#include "celix_threads.h"
+#include "array_list.h"
+
+#include "celix_errno.h"
+#include "log_service.h"
+
+#include "log_helper.h"
+
+#define LOGHELPER_ENABLE_STDOUT_FALLBACK_PROPERTY_NAME "LOGHELPER_ENABLE_STDOUT_FALLBACK"
+
+
+struct log_helper {
+ bundle_context_pt bundleContext;
+ service_tracker_pt logServiceTracker;
+ celix_thread_mutex_t logListLock;
+ array_list_pt logServices;
+ bool stdOutFallback;
+};
+
+celix_status_t logHelper_logServiceAdded(void *handle, service_reference_pt reference, void *service);
+celix_status_t logHelper_logServiceRemoved(void *handle, service_reference_pt reference, void *service);
+
+
+celix_status_t logHelper_create(bundle_context_pt context, log_helper_pt* loghelper)
+{
+ celix_status_t status = CELIX_SUCCESS;
+
+ (*loghelper) = calloc(1, sizeof(**loghelper));
+
+ if (!(*loghelper))
+ {
+ status = CELIX_ENOMEM;
+ }
+ else
+ {
+ const char* stdOutFallbackStr = NULL;
+ (*loghelper)->bundleContext = context;
+ (*loghelper)->logServiceTracker = NULL;
+ (*loghelper)->stdOutFallback = false;
+
+ bundleContext_getProperty(context, LOGHELPER_ENABLE_STDOUT_FALLBACK_PROPERTY_NAME, &stdOutFallbackStr);
+
+ if (stdOutFallbackStr != NULL) {
+ (*loghelper)->stdOutFallback = true;
+ }
+
+ pthread_mutex_init(&(*loghelper)->logListLock, NULL);
+ arrayList_create(&(*loghelper)->logServices);
+ }
+
+ return status;
+}
+
+celix_status_t logHelper_start(log_helper_pt loghelper)
+{
+ celix_status_t status;
+ service_tracker_customizer_pt logTrackerCustomizer = NULL;
+
+ status = serviceTrackerCustomizer_create(loghelper, NULL, logHelper_logServiceAdded, NULL, logHelper_logServiceRemoved, &logTrackerCustomizer);
+
+ if (status == CELIX_SUCCESS) {
+ loghelper->logServiceTracker = NULL;
+ status = serviceTracker_create(loghelper->bundleContext, (char*) OSGI_LOGSERVICE_NAME, logTrackerCustomizer, &loghelper->logServiceTracker);
+ }
+
+ if (status == CELIX_SUCCESS) {
+ status = serviceTracker_open(loghelper->logServiceTracker);
+ }
+
+ return status;
+}
+
+
+
+celix_status_t logHelper_logServiceAdded(void *handle, service_reference_pt reference, void *service)
+{
+ log_helper_pt loghelper = handle;
+
+ pthread_mutex_lock(&loghelper->logListLock);
+ arrayList_add(loghelper->logServices, service);
+ pthread_mutex_unlock(&loghelper->logListLock);
+
+ return CELIX_SUCCESS;
+}
+
+celix_status_t logHelper_logServiceRemoved(void *handle, service_reference_pt reference, void *service)
+{
+ log_helper_pt loghelper = handle;
+
+ pthread_mutex_lock(&loghelper->logListLock);
+ arrayList_removeElement(loghelper->logServices, service);
+ pthread_mutex_unlock(&loghelper->logListLock);
+
+ return CELIX_SUCCESS;
+}
+
+
+celix_status_t logHelper_stop(log_helper_pt loghelper) {
+ celix_status_t status;
+
+ status = serviceTracker_close(loghelper->logServiceTracker);
+
+ return status;
+}
+
+celix_status_t logHelper_destroy(log_helper_pt* loghelper) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ if((*loghelper)->logServiceTracker){
+ serviceTracker_destroy((*loghelper)->logServiceTracker);
+ }
+
+ pthread_mutex_lock(&(*loghelper)->logListLock);
+ arrayList_destroy((*loghelper)->logServices);
+ pthread_mutex_unlock(&(*loghelper)->logListLock);
+
+ pthread_mutex_destroy(&(*loghelper)->logListLock);
+
+ free(*loghelper);
+ *loghelper = NULL;
+ return status;
+}
+
+
+
+
+celix_status_t logHelper_log(log_helper_pt loghelper, log_level_t level, char* message, ... )
+{
+ celix_status_t status = CELIX_SUCCESS;
+ va_list listPointer;
+ char msg[1024];
+ msg[0] = '\0';
+ bool logged = false;
+
+ if(loghelper == NULL){
+ return CELIX_ILLEGAL_ARGUMENT;
+ }
+
+ va_start(listPointer, message);
+ vsnprintf(msg, 1024, message, listPointer);
+
+ pthread_mutex_lock(&loghelper->logListLock);
+
+ int i = 0;
+ for (; i < arrayList_size(loghelper->logServices); i++) {
+ log_service_pt logService = arrayList_get(loghelper->logServices, i);
+ if (logService != NULL) {
+ (logService->log)(logService->logger, level, msg);
+ logged = true;
+ }
+ }
+
+ pthread_mutex_unlock(&loghelper->logListLock);
+
+ if (!logged && loghelper->stdOutFallback) {
+ char *levelStr = NULL;
+
+ switch (level) {
+ case OSGI_LOGSERVICE_ERROR:
+ levelStr = "ERROR";
+ break;
+ case OSGI_LOGSERVICE_WARNING:
+ levelStr = "WARNING";
+ break;
+ case OSGI_LOGSERVICE_INFO:
+ levelStr = "INFO";
+ break;
+ case OSGI_LOGSERVICE_DEBUG:
+ default:
+ levelStr = "DEBUG";
+ break;
+ }
+
+ printf("%s: %s\n", levelStr, msg);
+ }
+
+ va_end(listPointer);
+
+ return status;
+}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/src/log_reader_service_impl.c
----------------------------------------------------------------------
diff --git a/log_service/src/log_reader_service_impl.c b/log_service/src/log_reader_service_impl.c
new file mode 100644
index 0000000..2a46ea7
--- /dev/null
+++ b/log_service/src/log_reader_service_impl.c
@@ -0,0 +1,82 @@
+/**
+ *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.
+ */
+ /*
+ * log_reader_service_impl.c
+ *
+ * \date Jun 26, 2011
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#include <stdlib.h>
+#include <stddef.h>
+
+#include "log_reader_service_impl.h"
+#include "celixbool.h"
+
+struct log_reader_data {
+ log_pt log;
+};
+
+celix_status_t logReaderService_create(log_pt log, log_reader_data_pt *reader) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ *reader = (log_reader_data_pt) calloc(1, sizeof(**reader));
+
+ if (*reader == NULL) {
+ status = CELIX_ENOMEM;
+ } else {
+ (*reader)->log = log;
+ }
+
+ return status;
+}
+
+celix_status_t logReaderService_destroy(log_reader_data_pt *reader) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ free(*reader);
+ reader = NULL;
+
+ return status;
+}
+
+
+
+celix_status_t logReaderService_getLog(log_reader_data_pt reader, linked_list_pt *list) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ status = log_getEntries(reader->log, list);
+
+ return status;
+}
+
+celix_status_t logReaderService_addLogListener(log_reader_data_pt reader, log_listener_pt listener) {
+ return log_addLogListener(reader->log, listener);
+}
+
+celix_status_t logReaderService_removeLogListener(log_reader_data_pt reader, log_listener_pt listener) {
+ return log_removeLogListener(reader->log, listener);
+}
+
+celix_status_t logReaderService_removeAllLogListener(log_reader_data_pt reader) {
+ return log_removeAllLogListener(reader->log);
+}
+
+
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/src/log_reader_service_impl.h
----------------------------------------------------------------------
diff --git a/log_service/src/log_reader_service_impl.h b/log_service/src/log_reader_service_impl.h
new file mode 100644
index 0000000..71829f2
--- /dev/null
+++ b/log_service/src/log_reader_service_impl.h
@@ -0,0 +1,43 @@
+/**
+ *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.
+ */
+/*
+ * log_reader_service_impl.h
+ *
+ * \date Jun 26, 2011
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#ifndef LOG_READER_SERVICE_IMPL_H_
+#define LOG_READER_SERVICE_IMPL_H_
+
+#include "log_reader_service.h"
+#include "log.h"
+
+celix_status_t logReaderService_create(log_pt log, log_reader_data_pt *reader);
+celix_status_t logReaderService_destroy(log_reader_data_pt *reader);
+
+celix_status_t logReaderService_getLog(log_reader_data_pt reader, linked_list_pt *list);
+
+celix_status_t logReaderService_addLogListener(log_reader_data_pt reader, log_listener_pt listener);
+celix_status_t logReaderService_removeLogListener(log_reader_data_pt reader, log_listener_pt listener);
+celix_status_t logReaderService_removeAllLogListener(log_reader_data_pt reader);
+
+
+#endif /* LOG_READER_SERVICE_IMPL_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/src/log_service_activator.c
----------------------------------------------------------------------
diff --git a/log_service/src/log_service_activator.c b/log_service/src/log_service_activator.c
new file mode 100644
index 0000000..8c72fb1
--- /dev/null
+++ b/log_service/src/log_service_activator.c
@@ -0,0 +1,198 @@
+/**
+ *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.
+ */
+/*
+ * log_service_activator.c
+ *
+ * \date Jun 25, 2011
+ * \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 <constants.h>
+
+#include "bundle_activator.h"
+#include "log_service_impl.h"
+#include "service_factory.h"
+#include "log_factory.h"
+#include "log.h"
+#include "log_reader_service_impl.h"
+#include "service_registration.h"
+
+#define DEFAULT_MAX_SIZE 100
+#define DEFAULT_STORE_DEBUG false
+
+#define MAX_SIZE_PROPERTY "CELIX_LOG_MAX_SIZE"
+#define STORE_DEBUG_PROPERTY "CELIX_LOG_STORE_DEBUG"
+
+struct logActivator {
+ bundle_context_pt bundleContext;
+ service_registration_pt logServiceFactoryReg;
+ service_registration_pt logReaderServiceReg;
+
+ bundle_listener_pt bundleListener;
+ framework_listener_pt frameworkListener;
+
+ log_pt logger;
+ service_factory_pt factory;
+ log_reader_data_pt reader;
+ log_reader_service_pt reader_service;
+};
+
+static celix_status_t bundleActivator_getMaxSize(struct logActivator *activator, int *max_size);
+static celix_status_t bundleActivator_getStoreDebug(struct logActivator *activator, bool *store_debug);
+
+celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) {
+ celix_status_t status = CELIX_SUCCESS;
+ struct logActivator * activator = NULL;
+
+ activator = (struct logActivator *) calloc(1, sizeof(struct logActivator));
+
+ if (activator == NULL) {
+ status = CELIX_ENOMEM;
+ } else {
+ activator->bundleContext = context;
+ activator->logServiceFactoryReg = NULL;
+ activator->logReaderServiceReg = NULL;
+
+ activator->logger = NULL;
+ activator->factory = NULL;
+ activator->reader = NULL;
+ activator->reader_service = NULL;
+
+ *userData = activator;
+ }
+
+ return status;
+}
+
+celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) {
+ struct logActivator * activator = (struct logActivator *) userData;
+ celix_status_t status = CELIX_SUCCESS;
+
+ int max_size = 0;
+ bool store_debug = false;
+
+ bundleActivator_getMaxSize(activator, &max_size);
+ bundleActivator_getStoreDebug(activator, &store_debug);
+
+ log_create(max_size, store_debug, &activator->logger);
+
+ // Add logger as Bundle- and FrameworkEvent listener
+ activator->bundleListener = calloc(1, sizeof(*activator->bundleListener));
+ activator->bundleListener->handle = activator->logger;
+ activator->bundleListener->bundleChanged = log_bundleChanged;
+ bundleContext_addBundleListener(context, activator->bundleListener);
+
+ activator->frameworkListener = calloc(1, sizeof(*activator->frameworkListener));
+ activator->frameworkListener->handle = activator->logger;
+ activator->frameworkListener->frameworkEvent = log_frameworkEvent;
+ bundleContext_addFrameworkListener(context, activator->frameworkListener);
+
+ logFactory_create(activator->logger, &activator->factory);
+
+ properties_pt props = properties_create();
+ properties_set(props, CELIX_FRAMEWORK_SERVICE_LANGUAGE, CELIX_FRAMEWORK_SERVICE_C_LANGUAGE);
+
+
+ bundleContext_registerServiceFactory(context, (char *) OSGI_LOGSERVICE_NAME, activator->factory, props, &activator->logServiceFactoryReg);
+
+ logReaderService_create(activator->logger, &activator->reader);
+
+ activator->reader_service = calloc(1, sizeof(*activator->reader_service));
+ activator->reader_service->reader = activator->reader;
+ activator->reader_service->getLog = logReaderService_getLog;
+ activator->reader_service->addLogListener = logReaderService_addLogListener;
+ activator->reader_service->removeLogListener = logReaderService_removeLogListener;
+ activator->reader_service->removeAllLogListener = logReaderService_removeAllLogListener;
+
+ props = properties_create();
+ properties_set(props, CELIX_FRAMEWORK_SERVICE_LANGUAGE, CELIX_FRAMEWORK_SERVICE_C_LANGUAGE);
+
+ bundleContext_registerService(context, (char *) OSGI_LOGSERVICE_READER_SERVICE_NAME, activator->reader_service, props, &activator->logReaderServiceReg);
+
+ return status;
+}
+
+celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) {
+ struct logActivator * activator = (struct logActivator *) userData;
+
+ serviceRegistration_unregister(activator->logReaderServiceReg);
+ activator->logReaderServiceReg = NULL;
+ serviceRegistration_unregister(activator->logServiceFactoryReg);
+ activator->logServiceFactoryReg = NULL;
+
+ logReaderService_destroy(&activator->reader);
+ free(activator->reader_service);
+
+ logFactory_destroy(&activator->factory);
+
+ bundleContext_removeBundleListener(context, activator->bundleListener);
+ bundleContext_removeFrameworkListener(context, activator->frameworkListener);
+
+ free(activator->bundleListener);
+ free(activator->frameworkListener);
+
+ log_destroy(activator->logger);
+
+ return CELIX_SUCCESS;
+}
+
+celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) {
+ struct logActivator * activator = (struct logActivator *) userData;
+
+ free(activator);
+
+ return CELIX_SUCCESS;
+}
+
+static celix_status_t bundleActivator_getMaxSize(struct logActivator *activator, int *max_size) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ const char *max_size_str = NULL;
+
+ *max_size = DEFAULT_MAX_SIZE;
+
+ bundleContext_getProperty(activator->bundleContext, MAX_SIZE_PROPERTY, &max_size_str);
+ if (max_size_str) {
+ *max_size = atoi(max_size_str);
+ }
+
+ return status;
+}
+
+static celix_status_t bundleActivator_getStoreDebug(struct logActivator *activator, bool *store_debug) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ const char *store_debug_str = NULL;
+
+ *store_debug = DEFAULT_STORE_DEBUG;
+
+ bundleContext_getProperty(activator->bundleContext, STORE_DEBUG_PROPERTY, &store_debug_str);
+ if (store_debug_str) {
+ if (strcasecmp(store_debug_str, "true") == 0) {
+ *store_debug = true;
+ } else if (strcasecmp(store_debug_str, "false") == 0) {
+ *store_debug = false;
+ }
+ }
+
+ return status;
+}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/src/log_service_impl.c
----------------------------------------------------------------------
diff --git a/log_service/src/log_service_impl.c b/log_service/src/log_service_impl.c
new file mode 100644
index 0000000..a77e9ad
--- /dev/null
+++ b/log_service/src/log_service_impl.c
@@ -0,0 +1,96 @@
+/**
+ *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.
+ */
+/*
+ * log_service_impl.c
+ *
+ * \date Jun 22, 2011
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+#include <stdlib.h>
+
+#include "log_service_impl.h"
+#include "module.h"
+#include "bundle.h"
+
+struct log_service_data {
+ log_pt log;
+ bundle_pt bundle;
+};
+
+celix_status_t logService_create(log_pt log, bundle_pt bundle, log_service_data_pt *logger) {
+ celix_status_t status = CELIX_SUCCESS;
+ *logger = calloc(1, sizeof(struct log_service_data));
+ if (*logger == NULL) {
+ status = CELIX_ENOMEM;
+ } else {
+ (*logger)->bundle = bundle;
+ (*logger)->log = log;
+ }
+
+ return status;
+}
+
+celix_status_t logService_destroy(log_service_data_pt *logger) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ free(*logger);
+ logger = NULL;
+
+ return status;
+}
+
+celix_status_t logService_log(log_service_data_pt logger, log_level_t level, char * message) {
+ return logService_logSr(logger, NULL, level, message);
+}
+
+celix_status_t logService_logSr(log_service_data_pt logger, service_reference_pt reference, log_level_t level, char * message) {
+ celix_status_t status;
+ log_entry_pt entry = NULL;
+ bundle_pt bundle = logger->bundle;
+ bundle_archive_pt archive = NULL;
+ module_pt module = NULL;
+ const char *symbolicName = NULL;
+ long bundleId = -1;
+
+ if (reference != NULL) {
+ serviceReference_getBundle(reference, &bundle);
+ }
+
+ status = bundle_getArchive(bundle, &archive);
+
+ if (status == CELIX_SUCCESS) {
+ status = bundleArchive_getId(archive, &bundleId);
+ }
+
+ if (status == CELIX_SUCCESS) {
+ status = bundle_getCurrentModule(bundle, &module);
+
+ if (status == CELIX_SUCCESS) {
+ status = module_getSymbolicName(module, &symbolicName);
+ }
+ }
+
+ if(status == CELIX_SUCCESS && symbolicName != NULL && message != NULL){
+ status = logEntry_create(bundleId, symbolicName, reference, level, message, 0, &entry);
+ log_addEntry(logger->log, entry);
+ }
+
+ return status;
+}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_service/src/log_service_impl.h
----------------------------------------------------------------------
diff --git a/log_service/src/log_service_impl.h b/log_service/src/log_service_impl.h
new file mode 100644
index 0000000..04c986e
--- /dev/null
+++ b/log_service/src/log_service_impl.h
@@ -0,0 +1,39 @@
+/**
+ *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.
+ */
+/*
+ * log_service_impl.h
+ *
+ * \date Jun 22, 2011
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#ifndef LOG_SERVICE_IMPL_H_
+#define LOG_SERVICE_IMPL_H_
+
+#include "log_service.h"
+#include "log.h"
+
+celix_status_t logService_create(log_pt log, bundle_pt bundle, log_service_data_pt *logger);
+celix_status_t logService_destroy(log_service_data_pt *logger);
+celix_status_t logService_log(log_service_data_pt logger, log_level_t level, char * message);
+celix_status_t logService_logSr(log_service_data_pt logger, service_reference_pt reference, log_level_t level, char * message);
+
+
+#endif /* LOG_SERVICE_IMPL_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_writer/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/log_writer/CMakeLists.txt b/log_writer/CMakeLists.txt
index 4692d7a..a742af2 100644
--- a/log_writer/CMakeLists.txt
+++ b/log_writer/CMakeLists.txt
@@ -17,6 +17,7 @@
celix_subproject(LOG_WRITER "Option to enable building the Log Writer bundles" ON DEPS FRAMEWORK LOG_SERVICE)
if (LOG_WRITER)
+ add_subdirectory(log_writer)
add_subdirectory(log_writer_stdout)
add_subdirectory(log_writer_syslog)
endif (LOG_WRITER)
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_writer/log_writer/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/log_writer/log_writer/CMakeLists.txt b/log_writer/log_writer/CMakeLists.txt
new file mode 100644
index 0000000..09aa9cf
--- /dev/null
+++ b/log_writer/log_writer/CMakeLists.txt
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+add_library(log_writer_common STATIC
+ src/log_writer.c
+ src/log_writer_activator.c
+)
+target_include_directories(log_writer_common PRIVATE src)
+target_include_directories(log_writer_common PUBLIC include)
+target_link_libraries(log_writer_common PUBLIC Celix::log_service_api Celix::framework)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_writer/log_writer/include/log_writer.h
----------------------------------------------------------------------
diff --git a/log_writer/log_writer/include/log_writer.h b/log_writer/log_writer/include/log_writer.h
new file mode 100644
index 0000000..b4b70d0
--- /dev/null
+++ b/log_writer/log_writer/include/log_writer.h
@@ -0,0 +1,53 @@
+/**
+ *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.
+ */
+/*
+ * log_writer.h
+ *
+ * \date Jul 4, 2011
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#ifndef LOG_WRITER_H_
+#define LOG_WRITER_H_
+
+#include "log_reader_service.h"
+#include "service_tracker.h"
+
+struct log_writer {
+ log_reader_service_pt logReader;
+ log_listener_pt logListener;
+
+ bundle_context_pt context;
+ service_tracker_pt tracker;
+};
+
+typedef struct log_writer *log_writer_pt;
+
+celix_status_t logWriter_create(bundle_context_pt context, log_writer_pt *writer);
+celix_status_t logWriter_destroy(log_writer_pt *writer);
+celix_status_t logWriter_start(log_writer_pt writer);
+celix_status_t logWriter_stop(log_writer_pt writer);
+
+celix_status_t logWriter_addingServ(void * handle, service_reference_pt ref, void **service);
+celix_status_t logWriter_addedServ(void * handle, service_reference_pt ref, void * service);
+celix_status_t logWriter_modifiedServ(void * handle, service_reference_pt ref, void * service);
+celix_status_t logWriter_removedServ(void * handle, service_reference_pt ref, void * service);
+
+#endif /* LOG_WRITER_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_writer/log_writer/private/include/log_writer.h
----------------------------------------------------------------------
diff --git a/log_writer/log_writer/private/include/log_writer.h b/log_writer/log_writer/private/include/log_writer.h
deleted file mode 100644
index fdf65c8..0000000
--- a/log_writer/log_writer/private/include/log_writer.h
+++ /dev/null
@@ -1,54 +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.
- */
-/*
- * log_writer.h
- *
- * \date Jul 4, 2011
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-
-#ifndef LOG_WRITER_H_
-#define LOG_WRITER_H_
-
-#include "log_reader_service.h"
-
-#include "service_tracker.h"
-
-struct log_writer {
- log_reader_service_pt logReader;
- log_listener_pt logListener;
-
- bundle_context_pt context;
- service_tracker_pt tracker;
-};
-
-typedef struct log_writer *log_writer_pt;
-
-celix_status_t logWriter_create(bundle_context_pt context, log_writer_pt *writer);
-celix_status_t logWriter_destroy(log_writer_pt *writer);
-celix_status_t logWriter_start(log_writer_pt writer);
-celix_status_t logWriter_stop(log_writer_pt writer);
-
-celix_status_t logWriter_addingServ(void * handle, service_reference_pt ref, void **service);
-celix_status_t logWriter_addedServ(void * handle, service_reference_pt ref, void * service);
-celix_status_t logWriter_modifiedServ(void * handle, service_reference_pt ref, void * service);
-celix_status_t logWriter_removedServ(void * handle, service_reference_pt ref, void * service);
-
-#endif /* LOG_WRITER_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_writer/log_writer/private/src/log_writer.c
----------------------------------------------------------------------
diff --git a/log_writer/log_writer/private/src/log_writer.c b/log_writer/log_writer/private/src/log_writer.c
deleted file mode 100644
index 685c1a5..0000000
--- a/log_writer/log_writer/private/src/log_writer.c
+++ /dev/null
@@ -1,122 +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.
- */
-/*
- * log_writer.c
- *
- * \date Mar 7, 2011
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "celix_errno.h"
-#include "celixbool.h"
-
-#include "log_writer.h"
-#include "log_listener.h"
-#include "module.h"
-#include "bundle.h"
-
-celix_status_t logWriter_create(bundle_context_pt context, log_writer_pt *writer) {
- celix_status_t status = CELIX_SUCCESS;
-
- *writer = calloc(1, sizeof(**writer));
- (*writer)->logListener = calloc(1, sizeof(*(*writer)->logListener));
- (*writer)->logListener->handle = *writer;
- (*writer)->logListener->logged = logListener_logged;
- (*writer)->logReader = NULL;
- (*writer)->context = context;
- (*writer)->tracker = NULL;
-
- return status;
-}
-
-
-celix_status_t logWriter_destroy(log_writer_pt *writer) {
- celix_status_t status = CELIX_SUCCESS;
-
- free((*writer)->logListener);
- free(*writer);
-
- writer = NULL;
-
- return status;
-}
-celix_status_t logWriter_start(log_writer_pt writer) {
- celix_status_t status = CELIX_SUCCESS;
-
- service_tracker_customizer_pt cust = NULL;
- service_tracker_pt tracker = NULL;
-
- status = serviceTrackerCustomizer_create(writer, logWriter_addingServ, logWriter_addedServ, logWriter_modifiedServ, logWriter_removedServ, &cust);
- if (status == CELIX_SUCCESS) {
- status = serviceTracker_create(writer->context, (char *) OSGI_LOGSERVICE_READER_SERVICE_NAME, cust, &tracker);
- if (status == CELIX_SUCCESS) {
- writer->tracker = tracker;
- status = serviceTracker_open(tracker);
- }
- }
-
- return status;
-}
-
-celix_status_t logWriter_stop(log_writer_pt writer) {
- celix_status_t status = CELIX_SUCCESS;
-
- if (serviceTracker_close(writer->tracker) != CELIX_SUCCESS) {
- status = CELIX_BUNDLE_EXCEPTION;
- }
- if (serviceTracker_destroy(writer->tracker) != CELIX_SUCCESS) {
- status = CELIX_BUNDLE_EXCEPTION;
- }
-
- return status;
-}
-
-celix_status_t logWriter_addingServ(void * handle, service_reference_pt ref, void **service) {
- log_writer_pt writer = (log_writer_pt) handle;
- bundleContext_getService(writer->context, ref, service);
- return CELIX_SUCCESS;
-}
-
-celix_status_t logWriter_addedServ(void * handle, service_reference_pt ref, void * service) {
- log_writer_pt writer = (log_writer_pt) handle;
-
- // Add this writer to each log reader service found
- if (service != NULL) {
- ((log_reader_service_pt) service)->addLogListener(((log_reader_service_pt) service)->reader, writer->logListener);
- }
-
- return CELIX_SUCCESS;
-}
-
-celix_status_t logWriter_modifiedServ(void * handle, service_reference_pt ref, void * service) {
- return CELIX_SUCCESS;
-}
-
-celix_status_t logWriter_removedServ(void * handle, service_reference_pt ref, void * service) {
- log_writer_pt writer = (log_writer_pt) handle;
-
- if (service != NULL) {
- ((log_reader_service_pt) service)->removeLogListener(((log_reader_service_pt) service)->reader, writer->logListener);
- }
-
- return CELIX_SUCCESS;
-}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_writer/log_writer/private/src/log_writer_activator.c
----------------------------------------------------------------------
diff --git a/log_writer/log_writer/private/src/log_writer_activator.c b/log_writer/log_writer/private/src/log_writer_activator.c
deleted file mode 100644
index 248cad6..0000000
--- a/log_writer/log_writer/private/src/log_writer_activator.c
+++ /dev/null
@@ -1,57 +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.
- */
-/*
- * log_writer_activator.c
- *
- * \date Oct 1, 2013
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-
-#include "log_writer.h"
-
-#include "bundle_activator.h"
-
-celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) {
- log_writer_pt writer = NULL;
-
- logWriter_create(context, &writer);
-
- *userData = writer;
-
- return CELIX_SUCCESS;
-}
-
-celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) {
- log_writer_pt writer = (log_writer_pt) userData;
-
- return logWriter_start(writer);
-}
-
-celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) {
- log_writer_pt writer = (log_writer_pt) userData;
-
- return logWriter_stop(writer);
-}
-
-celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) {
- log_writer_pt writer = (log_writer_pt) userData;
-
- return logWriter_destroy(&writer);
-}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_writer/log_writer/src/log_writer.c
----------------------------------------------------------------------
diff --git a/log_writer/log_writer/src/log_writer.c b/log_writer/log_writer/src/log_writer.c
new file mode 100644
index 0000000..685c1a5
--- /dev/null
+++ b/log_writer/log_writer/src/log_writer.c
@@ -0,0 +1,122 @@
+/**
+ *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.
+ */
+/*
+ * log_writer.c
+ *
+ * \date Mar 7, 2011
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "celix_errno.h"
+#include "celixbool.h"
+
+#include "log_writer.h"
+#include "log_listener.h"
+#include "module.h"
+#include "bundle.h"
+
+celix_status_t logWriter_create(bundle_context_pt context, log_writer_pt *writer) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ *writer = calloc(1, sizeof(**writer));
+ (*writer)->logListener = calloc(1, sizeof(*(*writer)->logListener));
+ (*writer)->logListener->handle = *writer;
+ (*writer)->logListener->logged = logListener_logged;
+ (*writer)->logReader = NULL;
+ (*writer)->context = context;
+ (*writer)->tracker = NULL;
+
+ return status;
+}
+
+
+celix_status_t logWriter_destroy(log_writer_pt *writer) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ free((*writer)->logListener);
+ free(*writer);
+
+ writer = NULL;
+
+ return status;
+}
+celix_status_t logWriter_start(log_writer_pt writer) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ service_tracker_customizer_pt cust = NULL;
+ service_tracker_pt tracker = NULL;
+
+ status = serviceTrackerCustomizer_create(writer, logWriter_addingServ, logWriter_addedServ, logWriter_modifiedServ, logWriter_removedServ, &cust);
+ if (status == CELIX_SUCCESS) {
+ status = serviceTracker_create(writer->context, (char *) OSGI_LOGSERVICE_READER_SERVICE_NAME, cust, &tracker);
+ if (status == CELIX_SUCCESS) {
+ writer->tracker = tracker;
+ status = serviceTracker_open(tracker);
+ }
+ }
+
+ return status;
+}
+
+celix_status_t logWriter_stop(log_writer_pt writer) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ if (serviceTracker_close(writer->tracker) != CELIX_SUCCESS) {
+ status = CELIX_BUNDLE_EXCEPTION;
+ }
+ if (serviceTracker_destroy(writer->tracker) != CELIX_SUCCESS) {
+ status = CELIX_BUNDLE_EXCEPTION;
+ }
+
+ return status;
+}
+
+celix_status_t logWriter_addingServ(void * handle, service_reference_pt ref, void **service) {
+ log_writer_pt writer = (log_writer_pt) handle;
+ bundleContext_getService(writer->context, ref, service);
+ return CELIX_SUCCESS;
+}
+
+celix_status_t logWriter_addedServ(void * handle, service_reference_pt ref, void * service) {
+ log_writer_pt writer = (log_writer_pt) handle;
+
+ // Add this writer to each log reader service found
+ if (service != NULL) {
+ ((log_reader_service_pt) service)->addLogListener(((log_reader_service_pt) service)->reader, writer->logListener);
+ }
+
+ return CELIX_SUCCESS;
+}
+
+celix_status_t logWriter_modifiedServ(void * handle, service_reference_pt ref, void * service) {
+ return CELIX_SUCCESS;
+}
+
+celix_status_t logWriter_removedServ(void * handle, service_reference_pt ref, void * service) {
+ log_writer_pt writer = (log_writer_pt) handle;
+
+ if (service != NULL) {
+ ((log_reader_service_pt) service)->removeLogListener(((log_reader_service_pt) service)->reader, writer->logListener);
+ }
+
+ return CELIX_SUCCESS;
+}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_writer/log_writer/src/log_writer_activator.c
----------------------------------------------------------------------
diff --git a/log_writer/log_writer/src/log_writer_activator.c b/log_writer/log_writer/src/log_writer_activator.c
new file mode 100644
index 0000000..248cad6
--- /dev/null
+++ b/log_writer/log_writer/src/log_writer_activator.c
@@ -0,0 +1,57 @@
+/**
+ *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.
+ */
+/*
+ * log_writer_activator.c
+ *
+ * \date Oct 1, 2013
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#include "log_writer.h"
+
+#include "bundle_activator.h"
+
+celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) {
+ log_writer_pt writer = NULL;
+
+ logWriter_create(context, &writer);
+
+ *userData = writer;
+
+ return CELIX_SUCCESS;
+}
+
+celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) {
+ log_writer_pt writer = (log_writer_pt) userData;
+
+ return logWriter_start(writer);
+}
+
+celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) {
+ log_writer_pt writer = (log_writer_pt) userData;
+
+ return logWriter_stop(writer);
+}
+
+celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) {
+ log_writer_pt writer = (log_writer_pt) userData;
+
+ return logWriter_destroy(&writer);
+}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_writer/log_writer_stdout/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/log_writer/log_writer_stdout/CMakeLists.txt b/log_writer/log_writer_stdout/CMakeLists.txt
index 7874e96..11734cc 100644
--- a/log_writer/log_writer_stdout/CMakeLists.txt
+++ b/log_writer/log_writer_stdout/CMakeLists.txt
@@ -20,17 +20,13 @@ add_bundle(log_writer
VERSION "1.1.0"
NAME "Apache Celix Log Writer"
SOURCES
- ${PROJECT_SOURCE_DIR}/log_writer/log_writer/private/src/log_writer_activator
- ${PROJECT_SOURCE_DIR}/log_writer/log_writer/private/src/log_writer
- ${PROJECT_SOURCE_DIR}/log_writer/log_writer/private/include/log_writer.h
+ #${PROJECT_SOURCE_DIR}/log_writer/log_writer/private/src/log_writer_activator
+ #${PROJECT_SOURCE_DIR}/log_writer/log_writer/private/src/log_writer
+ #${PROJECT_SOURCE_DIR}/log_writer/log_writer/private/include/log_writer.h
- private/src/log_writer_stdout
+ src/log_writer_stdout
)
install_bundle(log_writer)
-
-target_link_libraries(log_writer celix_framework)
-
-include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
-include_directories("${PROJECT_SOURCE_DIR}/log_service/public/include")
-include_directories("${PROJECT_SOURCE_DIR}/log_writer/log_writer/private/include")
+
+target_link_libraries(log_writer PRIVATE Celix::log_service_api log_writer_common)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_writer/log_writer_stdout/private/src/log_writer_stdout.c
----------------------------------------------------------------------
diff --git a/log_writer/log_writer_stdout/private/src/log_writer_stdout.c b/log_writer/log_writer_stdout/private/src/log_writer_stdout.c
deleted file mode 100644
index d57e5d5..0000000
--- a/log_writer/log_writer_stdout/private/src/log_writer_stdout.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- *Licensed to the Apache Software Foundation (ASF) under one
- *or more contributor license agreements. See the NOTICE file
- *distributed with this work for additional information
- *regarding copyright ownership. The ASF licenses this file
- *to you under the Apache License, Version 2.0 (the
- *"License"); you may not use this file except in compliance
- *with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- *Unless required by applicable law or agreed to in writing,
- *software distributed under the License is distributed on an
- *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- *specific language governing permissions and limitations
- *under the License.
- */
-/*
- * log_writer_stdout.c
- *
- * \date Mar 7, 2011
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "celix_errno.h"
-#include "celixbool.h"
-
-#include "log_writer.h"
-#include "log_listener.h"
-
-#include "module.h"
-#include "bundle.h"
-
-celix_status_t logListener_logged(log_listener_pt listener, log_entry_pt entry) {
- celix_status_t status = CELIX_SUCCESS;
-
- if (!entry) {
- status = CELIX_ILLEGAL_ARGUMENT;
- } else {
- printf("LogWriter: %s from %s\n", entry->message, entry->bundleSymbolicName);
- }
-
- return status;
-}
-
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_writer/log_writer_stdout/src/log_writer_stdout.c
----------------------------------------------------------------------
diff --git a/log_writer/log_writer_stdout/src/log_writer_stdout.c b/log_writer/log_writer_stdout/src/log_writer_stdout.c
new file mode 100644
index 0000000..d57e5d5
--- /dev/null
+++ b/log_writer/log_writer_stdout/src/log_writer_stdout.c
@@ -0,0 +1,49 @@
+/**
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements. See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership. The ASF licenses this file
+ *to you under the Apache License, Version 2.0 (the
+ *"License"); you may not use this file except in compliance
+ *with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *Unless required by applicable law or agreed to in writing,
+ *software distributed under the License is distributed on an
+ *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ *specific language governing permissions and limitations
+ *under the License.
+ */
+/*
+ * log_writer_stdout.c
+ *
+ * \date Mar 7, 2011
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "celix_errno.h"
+#include "celixbool.h"
+
+#include "log_writer.h"
+#include "log_listener.h"
+
+#include "module.h"
+#include "bundle.h"
+
+celix_status_t logListener_logged(log_listener_pt listener, log_entry_pt entry) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ if (!entry) {
+ status = CELIX_ILLEGAL_ARGUMENT;
+ } else {
+ printf("LogWriter: %s from %s\n", entry->message, entry->bundleSymbolicName);
+ }
+
+ return status;
+}
+
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/log_writer/log_writer_syslog/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/log_writer/log_writer_syslog/CMakeLists.txt b/log_writer/log_writer_syslog/CMakeLists.txt
index 12130cf..caad713 100644
--- a/log_writer/log_writer_syslog/CMakeLists.txt
+++ b/log_writer/log_writer_syslog/CMakeLists.txt
@@ -23,18 +23,14 @@ if (LOG_WRITER_SYSLOG)
SYMBOLIC_NAME "apache_celix_log_writer_syslog"
NAME "Apache Celix Log Writer Syslog"
SOURCES
- ${PROJECT_SOURCE_DIR}/log_writer/log_writer/private/src/log_writer_activator
- ${PROJECT_SOURCE_DIR}/log_writer/log_writer/private/src/log_writer
- ${PROJECT_SOURCE_DIR}/log_writer/log_writer/private/include/log_writer.h
- private/src/log_writer_syslog
+ #${PROJECT_SOURCE_DIR}/log_writer/log_writer/private/src/log_writer_activator
+ #${PROJECT_SOURCE_DIR}/log_writer/log_writer/private/src/log_writer
+ #${PROJECT_SOURCE_DIR}/log_writer/log_writer/private/include/log_writer.h
+ private/src/log_writer_syslog
)
install_bundle(log_writer_syslog)
-
- target_link_libraries(log_writer_syslog celix_framework)
-
- include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
- include_directories("${PROJECT_SOURCE_DIR}/log_service/public/include")
- include_directories("${PROJECT_SOURCE_DIR}/log_writer/log_writer/private/include")
+
+ target_link_libraries(log_writer_syslog PRIVATE log_writer_common)
endif (LOG_WRITER_SYSLOG)
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/pubsub/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/pubsub/CMakeLists.txt b/pubsub/CMakeLists.txt
index 2c2c50f..a866ba4 100644
--- a/pubsub/CMakeLists.txt
+++ b/pubsub/CMakeLists.txt
@@ -23,9 +23,6 @@ if (PUBSUB)
message(WARNING "Celix will now contain a dependency with a LGPL License (ZeroMQ). For more information about this, consult the pubsub/README.md file.")
option(BUILD_ZMQ_SECURITY "Build with security for ZeroMQ." OFF)
endif (BUILD_PUBSUB_PSA_ZMQ)
-
- include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
- include_directories("${PROJECT_SOURCE_DIR}/framework/public/include")
add_subdirectory(pubsub_topology_manager)
add_subdirectory(pubsub_discovery)
@@ -45,6 +42,10 @@ if (PUBSUB)
add_subdirectory(test)
endif()
+ #api target
+ add_libary(pubsub_api INTERFACE)
+ target_include_directories(pubsub_api INTERFACE api)
+
#install api
install(FILES api/pubsub/publisher.h api/pubsub/subscriber.h DESTINATION include/celix/pubsub COMPONENT framework)
@@ -67,5 +68,7 @@ if (PUBSUB)
DESTINATION share/celix/pubsub
COMPONENT framework
)
-
+
+ #Setup target aliases to match external usage
+ add_library(Celix::pubsub_api ALIAS pubsub_api)
endif(PUBSUB)