You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by ab...@apache.org on 2011/05/10 10:21:27 UTC
svn commit: r1101360 [5/5] - in /incubator/celix/trunk: ./ .settings/
celix_test/ dependency_manager/ echo_service/client/ framework/
framework/private/include/ framework/private/src/ hello_world/
hello_world/root/ launcher/ mongoose/ mongoose/MANIFEST...
Propchange: incubator/celix/trunk/mongoose/mongoose.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/celix/trunk/mongoose/mongoose.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/mongoose/mongoose.h?rev=1101360&view=auto
==============================================================================
--- incubator/celix/trunk/mongoose/mongoose.h (added)
+++ incubator/celix/trunk/mongoose/mongoose.h Tue May 10 08:21:24 2011
@@ -0,0 +1,218 @@
+// Copyright (c) 2004-2010 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 MONGOOSE_HEADER_INCLUDED
+#define MONGOOSE_HEADER_INCLUDED
+
+#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 {
+ char *request_method; // "GET", "POST", etc
+ char *uri; // URL-decoded URI
+ char *http_version; // E.g. "1.0", "1.1"
+ char *query_string; // \0 - terminated
+ char *remote_user; // Authenticated user
+ char *log_message; // Mongoose error log message
+ long remote_ip; // Client's IP address
+ int remote_port; // Client's port
+ int status_code; // HTTP reply status code
+ int is_ssl; // 1 if SSL-ed, 0 if not
+ int num_headers; // Number of headers
+ struct mg_header {
+ char *name; // HTTP header name
+ char *value; // HTTP header value
+ } http_headers[64]; // Maximum 64 headers
+};
+
+// Various events on which user-defined function is called by Mongoose.
+enum mg_event {
+ MG_NEW_REQUEST, // New HTTP request has arrived from the client
+ MG_HTTP_ERROR, // HTTP error must be returned to the client
+ MG_EVENT_LOG, // Mongoose logs an event, request_info.log_message
+ MG_INIT_SSL, // Mongoose initializes SSL. Instead of mg_connection *,
+ // SSL context is passed to the callback function.
+};
+
+// Prototype for the user-defined function. Mongoose calls this function
+// on every event mentioned above.
+//
+// Parameters:
+// event: which event has been triggered.
+// conn: opaque connection handler. Could be used to read, write data to the
+// client, etc. See functions below that accept "mg_connection *".
+// request_info: Information about HTTP request.
+//
+// Return:
+// If handler returns non-NULL, that means that handler has processed the
+// request by sending appropriate HTTP reply to the client. Mongoose treats
+// the request as served.
+// If callback returns NULL, that means that callback has not processed
+// the request. Handler must not send any data to the client in this case.
+// Mongoose proceeds with request handling as if nothing happened.
+typedef void * (*mg_callback_t)(enum mg_event event,
+ struct mg_connection *conn,
+ const struct mg_request_info *request_info);
+
+
+// Start web server.
+//
+// Parameters:
+// callback: user defined event handling function or NULL.
+// options: NULL terminated list of option_name, option_value pairs that
+// specify Mongoose configuration parameters.
+//
+// Example:
+// const char *options[] = {
+// "document_root", "/var/www",
+// "listening_ports", "80,443s",
+// NULL
+// };
+// struct mg_context *ctx = mg_start(&my_func, options);
+//
+// Please refer to http://code.google.com/p/mongoose/wiki/MongooseManual
+// for the list of valid option and their possible values.
+//
+// Return:
+// web server context, or NULL on error.
+struct mg_context *mg_start(mg_callback_t callback, const char **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 Mongoose
+// threads are stopped. Context pointer becomes invalid.
+void mg_stop(struct mg_context *);
+
+
+// Get the value of particular configuration parameter.
+// The value returned is read-only. Mongoose 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.
+const char *mg_get_option(const struct mg_context *ctx, const char *name);
+
+
+// Return array of strings that represent valid configuration options.
+// For each option, a short name, long name, and default value is returned.
+// Array is NULL terminated.
+const char **mg_get_valid_option_names(void);
+
+
+// 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.c 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.
+int mg_modify_passwords_file(struct mg_context *ctx,
+ const char *passwords_file_name, const char *user, const char *password);
+
+// Send data to the client.
+int mg_write(struct mg_connection *, const void *buf, size_t len);
+
+
+// Send data to the browser using printf() semantics.
+//
+// Works exactly like mg_write(), but allows to do message formatting.
+// Note that mg_printf() uses internal buffer of size IO_BUF_SIZE
+// (8 Kb by default) as temporary message storage for formatting. Do not
+// print data that is bigger than that, otherwise it will be truncated.
+int mg_printf(struct mg_connection *, const char *fmt, ...);
+
+
+// Read data from the remote end, return number of bytes read.
+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.
+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
+// buf: destination buffer for the decoded variable
+// buf_len: length of the destination buffer
+//
+// Return:
+// On success, length of the decoded variable.
+// On error, -1 (variable not found, or destination buffer is too small).
+//
+// Destination buffer is guaranteed to be '\0' - terminated. In case of
+// failure, dst[0] == '\0'.
+int mg_get_var(const char *data, size_t data_len,
+ const char *var_name, char *buf, size_t buf_len);
+
+// 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, or destination buffer is too small
+// to hold the value).
+int mg_get_cookie(const struct mg_connection *,
+ const char *cookie_name, char *buf, size_t buf_len);
+
+
+// Return Mongoose version.
+const char *mg_version(void);
+
+
+// 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);
+void mg_md5(char *buf, ...);
+
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+#endif // MONGOOSE_HEADER_INCLUDED
Propchange: incubator/celix/trunk/mongoose/mongoose.h
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/celix/trunk/mongoose/root/index.html
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/mongoose/root/index.html?rev=1101360&view=auto
==============================================================================
--- incubator/celix/trunk/mongoose/root/index.html (added)
+++ incubator/celix/trunk/mongoose/root/index.html Tue May 10 08:21:24 2011
@@ -0,0 +1,5 @@
+<div align="center"><FONT
+color="#ffffff" size="+1"><MARQUEE bgcolor="#000080"
+direction="right" loop="20" width="75%"><STRONG>
+Serving content from within a bundle works!!1!11!!
+</STRONG></MARQUEE></FONT></DIV>
\ No newline at end of file
Propchange: incubator/celix/trunk/mongoose/root/index.html
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: incubator/celix/trunk/shell/CMakeLists.txt
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell/CMakeLists.txt?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/shell/CMakeLists.txt (original)
+++ incubator/celix/trunk/shell/CMakeLists.txt Tue May 10 08:21:24 2011
@@ -15,9 +15,9 @@
# specific language governing permissions and limitations
# under the License.
-add_library(shell SHARED shell command ps_command start_command stop_command)
+add_library(shell SHARED shell command ps_command start_command stop_command install_command update_command)
include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
-target_link_libraries(shell framework)
+target_link_libraries(shell framework curl)
bundle(shell)
package(shell FILES shell.h command.h)
\ No newline at end of file
Added: incubator/celix/trunk/shell/install_command.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell/install_command.c?rev=1101360&view=auto
==============================================================================
--- incubator/celix/trunk/shell/install_command.c (added)
+++ incubator/celix/trunk/shell/install_command.c Tue May 10 08:21:24 2011
@@ -0,0 +1,87 @@
+/**
+ *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.
+ */
+/*
+ * install_command.c
+ *
+ * Created on: Apr 4, 2011
+ * Author: alexanderb
+ */
+#include <stdlib.h>
+
+#include "command_private.h"
+#include "array_list.h"
+#include "bundle_context.h"
+#include "bundle_archive.h"
+#include "module.h"
+#include "bundle.h"
+#include "install_command.h"
+
+void installCommand_execute(COMMAND command, char * line, void (*out)(char *), void (*err)(char *));
+void installCommand_install(COMMAND command, BUNDLE *bundle, char * location, void (*out)(char *), void (*err)(char *));
+
+COMMAND installCommand_create(BUNDLE_CONTEXT context) {
+ COMMAND command = (COMMAND) malloc(sizeof(*command));
+ command->bundleContext = context;
+ command->name = "install";
+ command->shortDescription = "install bundle(s).";
+ command->usage = "install <file> [<file> ...]";
+ command->executeCommand = installCommand_execute;
+ return command;
+}
+
+void installCommand_destroy(COMMAND command) {
+ free(command);
+}
+
+void installCommand_execute(COMMAND command, char * line, void (*out)(char *), void (*err)(char *)) {
+ char delims[] = " ";
+ char * sub = NULL;
+ // ignore the command
+ sub = strtok(line, delims);
+ sub = strtok(NULL, delims);
+ char info[256];
+ info[0] = '\0';
+ while (sub != NULL) {
+ BUNDLE bundle = NULL;
+ installCommand_install(command, &bundle, strdup(sub), out, err);
+ if (bundle != NULL) {
+ if (strlen(info) > 0) {
+ strcat(info, ", ");
+ }
+ long id = bundleArchive_getId(bundle_getArchive(bundle));
+ char bundleId[sizeof(id) + 1];
+ sprintf(bundleId, "%ld", id);
+ strcat(info, bundleId);
+ }
+ sub = strtok(NULL, delims);
+ }
+ if (strchr(info, ',') != NULL) {
+ out("Bundle IDs: ");
+ out(info);
+ out("\n");
+ } else if (strlen(info) > 0) {
+ out("Bundle ID: ");
+ out(info);
+ out("\n");
+ }
+}
+
+void installCommand_install(COMMAND command, BUNDLE *bundle, char * location, void (*out)(char *), void (*err)(char *)) {
+ *bundle = bundleContext_installBundle(command->bundleContext, location);
+}
Propchange: incubator/celix/trunk/shell/install_command.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/celix/trunk/shell/install_command.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell/install_command.h?rev=1101360&view=auto
==============================================================================
--- incubator/celix/trunk/shell/install_command.h (added)
+++ incubator/celix/trunk/shell/install_command.h Tue May 10 08:21:24 2011
@@ -0,0 +1,32 @@
+/**
+ *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.
+ */
+/*
+ * install_command.h
+ *
+ * Created on: Apr 4, 2011
+ * Author: alexanderb
+ */
+
+#ifndef INSTALL_COMMAND_H_
+#define INSTALL_COMMAND_H_
+
+COMMAND installCommand_create(BUNDLE_CONTEXT context);
+void installCommand_destroy(COMMAND command);
+
+#endif /* INSTALL_COMMAND_H_ */
Propchange: incubator/celix/trunk/shell/install_command.h
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: incubator/celix/trunk/shell/ps_command.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell/ps_command.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/shell/ps_command.c (original)
+++ incubator/celix/trunk/shell/ps_command.c Tue May 10 08:21:24 2011
@@ -44,21 +44,57 @@ COMMAND psCommand_create(BUNDLE_CONTEXT
return command;
}
+void psCommand_destroy(COMMAND command) {
+ free(command);
+}
+
void psCommand_execute(COMMAND command, char * commandline, void (*out)(char *), void (*err)(char *)) {
ARRAY_LIST bundles = bundleContext_getBundles(command->bundleContext);
+ bool showLocation = false;
+ bool showSymbolicName = false;
+ bool showUpdateLocation = false;
+ char * msg = "Name";
+
+ char delims[] = " ";
+ char * sub = NULL;
+ sub = strtok(commandline, delims);
+ sub = strtok(NULL, delims);
+ while (sub != NULL) {
+ if (strcmp(sub, "-l") == 0) {
+ showLocation = true;
+ msg = "Location";
+ } else if (strcmp(sub, "-s") == 0) {
+ showSymbolicName = true;
+ msg = "Symbolic name";
+ } else if (strcmp(sub, "-u") == 0) {
+ showUpdateLocation = true;
+ msg = "Update location";
+ }
+ sub = strtok(NULL, delims);
+ }
+
char line[256];
- sprintf(line, " %-5s %-12s %s\n", "ID", "State", "Name");
+ sprintf(line, " %-5s %-12s %s\n", "ID", "State", msg);
int i;
out(line);
for (i = 0; i < arrayList_size(bundles); i++) {
BUNDLE bundle = arrayList_get(bundles, i);
long id = bundleArchive_getId(bundle_getArchive(bundle));
- char * name = module_getSymbolicName(bundle_getModule(bundle));
char * state = psCommand_stateString(bundle_getState(bundle));
+ char * name = module_getSymbolicName(bundle_getCurrentModule(bundle));
+ if (showLocation) {
+ name = bundleArchive_getLocation(bundle_getArchive(bundle));
+ } else if (showSymbolicName) {
+ name = module_getSymbolicName(bundle_getCurrentModule(bundle));
+ } else if (showUpdateLocation) {
+ name = bundleArchive_getLocation(bundle_getArchive(bundle));
+ }
+
sprintf(line, " %-5ld %-12s %s\n", id, state, name);
out(line);
}
+ arrayList_destroy(bundles);
}
char * psCommand_stateString(BUNDLE_STATE state) {
Modified: incubator/celix/trunk/shell/ps_command.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell/ps_command.h?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/shell/ps_command.h (original)
+++ incubator/celix/trunk/shell/ps_command.h Tue May 10 08:21:24 2011
@@ -27,5 +27,6 @@
#define PS_COMMAND_H_
COMMAND psCommand_create(BUNDLE_CONTEXT context);
+void psCommand_destroy(COMMAND command);
#endif /* PS_COMMAND_H_ */
Modified: incubator/celix/trunk/shell/shell.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell/shell.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/shell/shell.c (original)
+++ incubator/celix/trunk/shell/shell.c Tue May 10 08:21:24 2011
@@ -35,12 +35,28 @@
#include "ps_command.h"
#include "start_command.h"
#include "stop_command.h"
+#include "install_command.h"
+#include "update_command.h"
#include "utils.h"
struct shellServiceActivator {
SHELL shell;
+ SHELL_SERVICE shellService;
SERVICE_REGISTRATION registration;
+ SERVICE_LISTENER listener;
+
+ SERVICE_REGISTRATION psCommand;
+ SERVICE_REGISTRATION startCommand;
+ SERVICE_REGISTRATION stopCommand;
+ SERVICE_REGISTRATION installCommand;
+ SERVICE_REGISTRATION updateCommand;
+
+ COMMAND psCmd;
+ COMMAND startCmd;
+ COMMAND stopCmd;
+ COMMAND installCmd;
+ COMMAND updateCmd;
};
SHELL shell_create() {
@@ -50,6 +66,12 @@ SHELL shell_create() {
return shell;
}
+void shell_destroy(SHELL shell) {
+ hashMap_destroy(shell->commandNameMap, false, false);
+ hashMap_destroy(shell->commandReferenceMap, false, false);
+ free(shell);
+}
+
ARRAY_LIST shell_getCommands(SHELL shell) {
ARRAY_LIST commands = arrayList_create();
HASH_MAP_ITERATOR iter = hashMapIterator_create(shell->commandNameMap);
@@ -84,11 +106,12 @@ SERVICE_REFERENCE shell_getCommandRefere
void shell_executeCommand(SHELL shell, char * commandLine, void (*out)(char *), void (*error)(char *)) {
unsigned int pos = strcspn(commandLine, " ");
- char * commandName = (pos != strlen(commandLine)) ? string_ndup((char *)commandLine, pos) : commandLine;
+ char * commandName = (pos != strlen(commandLine)) ? string_ndup((char *)commandLine, pos) : strdup(commandLine);
COMMAND command = shell_getCommand(shell, commandName);
if (command != NULL) {
command->executeCommand(command, commandLine, out, error);
}
+ free(commandName);
}
COMMAND shell_getCommand(SHELL shell, char * commandName) {
@@ -117,47 +140,91 @@ void shell_serviceChanged(SERVICE_LISTEN
}
}
-void * bundleActivator_create() {
- struct shellServiceActivator * activator = malloc(sizeof(*activator));
+celix_status_t bundleActivator_create(BUNDLE_CONTEXT context, void **userData) {
+ *userData = malloc(sizeof(struct shellServiceActivator));
SHELL shell = shell_create();
- activator->shell = shell;
- return activator;
+// struct shellServiceActivator * activator = (struct shellServiceActivator *) (*userData);
+ ((struct shellServiceActivator *) (*userData))->shell = shell;
+ ((struct shellServiceActivator *) (*userData))->listener = NULL;
+ ((struct shellServiceActivator *) (*userData))->psCommand = NULL;
+ ((struct shellServiceActivator *) (*userData))->startCommand = NULL;
+ ((struct shellServiceActivator *) (*userData))->stopCommand = NULL;
+ ((struct shellServiceActivator *) (*userData))->installCommand = NULL;
+ ((struct shellServiceActivator *) (*userData))->updateCommand = NULL;
+ ((struct shellServiceActivator *) (*userData))->registration = NULL;
+
+ //(*userData) = &(*activator);
+
+ return CELIX_SUCCESS;
}
-void bundleActivator_start(void * userData, BUNDLE_CONTEXT context) {
+celix_status_t bundleActivator_start(void * userData, BUNDLE_CONTEXT context) {
struct shellServiceActivator * activator = (struct shellServiceActivator *) userData;
activator->shell->bundleContext = context;
- SHELL_SERVICE shellService = (SHELL_SERVICE) malloc(sizeof(*shellService));
- shellService->shell = activator->shell;
- shellService->getCommands = shell_getCommands;
- shellService->getCommandDescription = shell_getCommandDescription;
- shellService->getCommandUsage = shell_getCommandUsage;
- shellService->getCommandReference = shell_getCommandReference;
- shellService->executeCommand = shell_executeCommand;
+ activator->shellService = (SHELL_SERVICE) malloc(sizeof(*activator->shellService));
+ activator->shellService->shell = activator->shell;
+ activator->shellService->getCommands = shell_getCommands;
+ activator->shellService->getCommandDescription = shell_getCommandDescription;
+ activator->shellService->getCommandUsage = shell_getCommandUsage;
+ activator->shellService->getCommandReference = shell_getCommandReference;
+ activator->shellService->executeCommand = shell_executeCommand;
- activator->registration = bundleContext_registerService(context, (char *) SHELL_SERVICE_NAME, shellService, NULL);
+ activator->registration = bundleContext_registerService(context, (char *) SHELL_SERVICE_NAME, activator->shellService, NULL);
SERVICE_LISTENER listener = (SERVICE_LISTENER) malloc(sizeof(*listener));
+ activator->listener = listener;
listener->handle = activator->shell;
listener->serviceChanged = (void *) shell_serviceChanged;
- addServiceListener(context, listener, "(objectClass=commandService)");
+ bundleContext_addServiceListener(context, listener, "(objectClass=commandService)");
+
+ activator->psCmd = psCommand_create(context);
+ activator->psCommand = bundleContext_registerService(context, (char *) COMMAND_SERVICE_NAME, activator->psCmd, NULL);
+
+ activator->startCmd = startCommand_create(context);
+ activator->startCommand = bundleContext_registerService(context, (char *) COMMAND_SERVICE_NAME, activator->startCmd, NULL);
- COMMAND psCommand = psCommand_create(context);
- bundleContext_registerService(context, (char *) COMMAND_SERVICE_NAME, psCommand, NULL);
+ activator->stopCmd = stopCommand_create(context);
+ activator->stopCommand = bundleContext_registerService(context, (char *) COMMAND_SERVICE_NAME, activator->stopCmd, NULL);
- COMMAND startCommand = startCommand_create(context);
- bundleContext_registerService(context, (char *) COMMAND_SERVICE_NAME, startCommand, NULL);
+ activator->installCmd = installCommand_create(context);
+ activator->installCommand = bundleContext_registerService(context, (char *) COMMAND_SERVICE_NAME, activator->installCmd, NULL);
- COMMAND stopCommand = stopCommand_create(context);
- bundleContext_registerService(context, (char *) COMMAND_SERVICE_NAME, stopCommand, NULL);
+ activator->updateCmd = updateCommand_create(context);
+ activator->updateCommand = bundleContext_registerService(context, (char *) COMMAND_SERVICE_NAME, activator->updateCmd, NULL);
+
+ return CELIX_SUCCESS;
}
-void bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
+celix_status_t bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
struct shellServiceActivator * activator = (struct shellServiceActivator *) userData;
serviceRegistration_unregister(activator->registration);
+ serviceRegistration_unregister(activator->psCommand);
+ serviceRegistration_unregister(activator->startCommand);
+ serviceRegistration_unregister(activator->stopCommand);
+ serviceRegistration_unregister(activator->installCommand);
+ serviceRegistration_unregister(activator->updateCommand);
+ bundleContext_removeServiceListener(context, activator->listener);
+
+ psCommand_destroy(activator->psCmd);
+ startCommand_destroy(activator->startCmd);
+ stopCommand_destroy(activator->stopCmd);
+ installCommand_destroy(activator->installCmd);
+ updateCommand_destroy(activator->updateCmd);
+
+ free(activator->shellService);
+ activator->shellService = NULL;
+
+ free(activator->listener);
+ activator->listener = NULL;
+
+ return CELIX_SUCCESS;
}
-void bundleActivator_destroy(void * userData) {
+celix_status_t bundleActivator_destroy(void * userData, BUNDLE_CONTEXT context) {
+ struct shellServiceActivator * activator = (struct shellServiceActivator *) userData;
+ shell_destroy(activator->shell);
+ free(activator);
+ return CELIX_SUCCESS;
}
Modified: incubator/celix/trunk/shell/start_command.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell/start_command.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/shell/start_command.c (original)
+++ incubator/celix/trunk/shell/start_command.c Tue May 10 08:21:24 2011
@@ -42,6 +42,10 @@ COMMAND startCommand_create(BUNDLE_CONTE
return command;
}
+void startCommand_destroy(COMMAND command) {
+ free(command);
+}
+
void startCommand_execute(COMMAND command, char * line, void (*out)(char *), void (*err)(char *)) {
char delims[] = " ";
Modified: incubator/celix/trunk/shell/start_command.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell/start_command.h?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/shell/start_command.h (original)
+++ incubator/celix/trunk/shell/start_command.h Tue May 10 08:21:24 2011
@@ -27,5 +27,6 @@
#define START_COMMAND_H_
COMMAND startCommand_create(BUNDLE_CONTEXT context);
+void startCommand_destroy(COMMAND command);
#endif /* START_COMMAND_H_ */
Modified: incubator/celix/trunk/shell/stop_command.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell/stop_command.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/shell/stop_command.c (original)
+++ incubator/celix/trunk/shell/stop_command.c Tue May 10 08:21:24 2011
@@ -42,6 +42,9 @@ COMMAND stopCommand_create(BUNDLE_CONTEX
return command;
}
+void stopCommand_destroy(COMMAND command) {
+ free(command);
+}
void stopCommand_execute(COMMAND command, char * line, void (*out)(char *), void (*err)(char *)) {
char delims[] = " ";
Modified: incubator/celix/trunk/shell/stop_command.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell/stop_command.h?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/shell/stop_command.h (original)
+++ incubator/celix/trunk/shell/stop_command.h Tue May 10 08:21:24 2011
@@ -27,5 +27,6 @@
#define STOP_COMMAND_H_
COMMAND stopCommand_create(BUNDLE_CONTEXT context);
+void stopCommand_destroy(COMMAND command);
#endif /* STOP_COMMAND_H_ */
Added: incubator/celix/trunk/shell/update_command.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell/update_command.c?rev=1101360&view=auto
==============================================================================
--- incubator/celix/trunk/shell/update_command.c (added)
+++ incubator/celix/trunk/shell/update_command.c Tue May 10 08:21:24 2011
@@ -0,0 +1,131 @@
+/**
+ *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.
+ */
+/*
+ * start_command.c
+ *
+ * Created on: Aug 20, 2010
+ * Author: alexanderb
+ */
+#include <stdlib.h>
+#include <string.h>
+#include <curl/curl.h>
+#include <curl/types.h>
+#include <curl/easy.h>
+
+#include "command_private.h"
+#include "array_list.h"
+#include "bundle_context.h"
+#include "bundle.h"
+#include "update_command.h"
+#include "inputstream.h"
+
+void updateCommand_execute(COMMAND command, char * line, void (*out)(char *), void (*err)(char *));
+celix_status_t updateCommand_download(COMMAND command, char * url, char **inputFile);
+size_t updateCommand_writeData(void *ptr, size_t size, size_t nmemb, FILE *stream);
+int updateCommand_downloadProgress(void *ptr, double dltotal, double dlnow, double ultotal, double ulnow);
+
+COMMAND updateCommand_create(BUNDLE_CONTEXT context) {
+ COMMAND command = (COMMAND) malloc(sizeof(*command));
+ command->bundleContext = context;
+ command->name = "update";
+ command->shortDescription = "update bundle.";
+ command->usage = "update <id> [<URL>]";
+ command->executeCommand = updateCommand_execute;
+ return command;
+}
+
+void updateCommand_destroy(COMMAND command) {
+ free(command);
+}
+
+
+void updateCommand_execute(COMMAND command, char * line, void (*out)(char *), void (*err)(char *)) {
+ char delims[] = " ";
+ char * sub = NULL;
+ sub = strtok(line, delims);
+ // Read bundle id
+ sub = strtok(NULL, delims);
+ if (sub != NULL) {
+ long id = atol(sub);
+ BUNDLE bundle = bundleContext_getBundleById(command->bundleContext, id);
+ if (bundle != NULL) {
+ sub = strtok(NULL, delims);
+ char inputFile[MAXNAMLEN];
+ inputFile[0] = '\0';
+ if (sub != NULL) {
+ printf("URL: %s\n", sub);
+ char *test = inputFile;
+
+ if (updateCommand_download(command, sub, &test) == CELIX_SUCCESS) {
+ printf("Update bundle with stream\n");
+ bundle_update(bundle, inputFile);
+ } else {
+ char error[256];
+ sprintf(error, "Unable to download from %s\n", sub);
+ err(error);
+ }
+ } else {
+ bundle_update(bundle, NULL);
+ }
+ } else {
+ err("Bundle id is invalid.\n");
+ }
+ }
+}
+
+celix_status_t updateCommand_download(COMMAND command, char * url, char **inputFile) {
+ CURL *curl;
+ CURLcode res;
+ curl = curl_easy_init();
+ if (curl) {
+ tmpnam(*inputFile);
+ printf("Temp file: %s\n", *inputFile);
+ FILE *fp = fopen(*inputFile, "wb+");
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, updateCommand_writeData);
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
+ //curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0);
+ //curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, updateCommand_downloadProgress);
+ res = curl_easy_perform(curl);
+ printf("Error: %d\n", res);
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+ fclose(fp);
+ }
+ if (res != CURLE_OK) {
+ *inputFile[0] = '\0';
+ return CELIX_ILLEGAL_STATE;
+ } else {
+ return CELIX_SUCCESS;
+ }
+}
+
+size_t updateCommand_writeData(void *ptr, size_t size, size_t nmemb, FILE *stream) {
+ size_t written = fwrite(ptr, size, nmemb, stream);
+ return written;
+}
+
+//int updateCommand_downloadProgress(void *ptr,
+// double t, /* dltotal */
+// double d, /* dlnow */
+// double ultotal,
+// double ulnow) {
+// printf("\r%f / %f (%g %%)", d, t, d*100.0/t);
+// return 0;
+//}
Propchange: incubator/celix/trunk/shell/update_command.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/celix/trunk/shell/update_command.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell/update_command.h?rev=1101360&view=auto
==============================================================================
--- incubator/celix/trunk/shell/update_command.h (added)
+++ incubator/celix/trunk/shell/update_command.h Tue May 10 08:21:24 2011
@@ -0,0 +1,34 @@
+/**
+ *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.
+ */
+/*
+ * start_command.h
+ *
+ * Created on: Aug 20, 2010
+ * Author: alexanderb
+ */
+
+#ifndef UPDATE_COMMAND_H_
+#define UPDATE_COMMAND_H_
+
+#include "command.h"
+
+COMMAND updateCommand_create(BUNDLE_CONTEXT context);
+void updateCommand_destroy(COMMAND command);
+
+#endif /* UPDATE_COMMAND_H_ */
Propchange: incubator/celix/trunk/shell/update_command.h
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: incubator/celix/trunk/shell_tui/shell_tui.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell_tui/shell_tui.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/shell_tui/shell_tui.c (original)
+++ incubator/celix/trunk/shell_tui/shell_tui.c Tue May 10 08:21:24 2011
@@ -36,6 +36,7 @@ struct shellTuiActivator {
BUNDLE_CONTEXT context;
SHELL_SERVICE shell;
SERVICE_REFERENCE reference;
+ struct serviceListener * listener;
bool running;
pthread_t runnable;
};
@@ -58,7 +59,8 @@ void * shellTui_runnable(void * data) {
}
fgets(in, 256, stdin);
needPrompt = true;
- char * line = string_trim(strdup(in));
+ char * dline = strdup(in);
+ char * line = string_trim(dline);
if (strlen(line) == 0) {
continue;
}
@@ -66,8 +68,10 @@ void * shellTui_runnable(void * data) {
continue;
}
act->shell->executeCommand(act->shell->shell, line, shellTui_write, shellTui_write);
+ free(dline);
}
pthread_exit(NULL);
+ return NULL;
}
void shellTui_initializeService(SHELL_TUI_ACTIVATOR activator) {
@@ -84,7 +88,7 @@ void shellTui_serviceChanged(SERVICE_LIS
if ((event->type == REGISTERED) && (act->reference == NULL)) {
shellTui_initializeService(act);
} else if ((event->type == UNREGISTERING) && (act->reference == event->reference)) {
- // bundleContext_ungetService(act->reference);
+ bundleContext_ungetService(act->context, act->reference);
act->reference = NULL;
act->shell = NULL;
@@ -92,30 +96,41 @@ void shellTui_serviceChanged(SERVICE_LIS
}
}
-void * bundleActivator_create() {
- SHELL_TUI_ACTIVATOR activator = (SHELL_TUI_ACTIVATOR) malloc(sizeof(*activator));
+celix_status_t bundleActivator_create(BUNDLE_CONTEXT context, void **userData) {
+ SHELL_TUI_ACTIVATOR activator = apr_palloc(bundleContext_getMemoryPool(context), sizeof(*activator));
+ //SHELL_TUI_ACTIVATOR activator = (SHELL_TUI_ACTIVATOR) malloc(sizeof(*activator));
activator->shell = NULL;
- return activator;
+ (*userData) = activator;
+ return CELIX_SUCCESS;
}
-void bundleActivator_start(void * userData, BUNDLE_CONTEXT context) {
+celix_status_t bundleActivator_start(void * userData, BUNDLE_CONTEXT context) {
SHELL_TUI_ACTIVATOR act = (SHELL_TUI_ACTIVATOR) userData;
act->context = context;
act->running = true;
SERVICE_LISTENER listener = (SERVICE_LISTENER) malloc(sizeof(*listener));
- listener->handle = act;
- listener->serviceChanged = (void *) shellTui_serviceChanged;
- addServiceListener(context, listener, "(objectClass=shellService)");
+ act->listener = listener;
+ act->listener->handle = act;
+ act->listener->serviceChanged = (void *) shellTui_serviceChanged;
+ bundleContext_addServiceListener(context, act->listener, "(objectClass=shellService)");
shellTui_initializeService(act);
pthread_create(&act->runnable, NULL, shellTui_runnable, act);
+ return CELIX_SUCCESS;
}
-void bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
+celix_status_t bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
SHELL_TUI_ACTIVATOR act = (SHELL_TUI_ACTIVATOR) userData;
+ bundleContext_removeServiceListener(context, act->listener);
+ free(act->listener);
+ act->listener = NULL;
+ act->context = NULL;
+ act->running = false;
+ pthread_detach(act->runnable);
+ return CELIX_SUCCESS;
}
-void bundleActivator_destroy(void * userData) {
-
+celix_status_t bundleActivator_destroy(void * userData, BUNDLE_CONTEXT context) {
+ return CELIX_SUCCESS;
}
Modified: incubator/celix/trunk/target.cmake
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/target.cmake?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/target.cmake (original)
+++ incubator/celix/trunk/target.cmake Tue May 10 08:21:24 2011
@@ -15,9 +15,9 @@
# specific language governing permissions and limitations
# under the License.
-deploy("name" BUNDLES receiver receiver-2.0 sender shell shell_tui)
-deploy("shell test" BUNDLES shell)
-deploy("hello_world" BUNDLES hello_world shell shell_tui)
-deploy("wb" BUNDLES tracker publisherA publisherB shell shell_tui)
-deploy("wb_dp" BUNDLES tracker_depman publisherA publisherB shell shell_tui)
-deploy("echo" BUNDLES echo_server echo_client shell shell_tui)
\ No newline at end of file
+#deploy("name" BUNDLES receiver receiver-2.0 sender shell shell_tui)
+#deploy("shell test" BUNDLES shell)
+deploy("hello_world" BUNDLES shell shell_tui hello_world celix.mongoose)
+#deploy("wb" BUNDLES tracker publisherA publisherB shell shell_tui)
+#deploy("wb_dp" BUNDLES tracker_depman publisherA publisherB shell shell_tui)
+#deploy("echo" BUNDLES echo_server echo_client shell shell_tui)
\ No newline at end of file
Modified: incubator/celix/trunk/utils/private/src/array_list.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/utils/private/src/array_list.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/utils/private/src/array_list.c (original)
+++ incubator/celix/trunk/utils/private/src/array_list.c Tue May 10 08:21:24 2011
@@ -34,11 +34,20 @@ ARRAY_LIST arrayList_create(void) {
list->size = 0;
list->capacity = 10;
+ list->modCount = 0;
list->elementData = (void **) malloc(sizeof(void*) * list->capacity);
return list;
}
+void arrayList_destroy(ARRAY_LIST list) {
+ list->size = 0;
+ free(list->elementData);
+ list->elementData = NULL;
+ free(list);
+ list = NULL;
+}
+
void arrayList_trimToSize(ARRAY_LIST list) {
list->modCount++;
int oldCapacity = list->capacity;
@@ -228,6 +237,15 @@ ARRAY_LIST_ITERATOR arrayListIterator_cr
return iterator;
}
+void arrayListIterator_destroy(ARRAY_LIST_ITERATOR iterator) {
+ iterator->lastReturned = -1;
+ iterator->cursor = 0;
+ iterator->expectedModificationCount = 0;
+ iterator->list = NULL;
+ free(iterator);
+ iterator = NULL;
+}
+
bool arrayListIterator_hasNext(ARRAY_LIST_ITERATOR iterator) {
return iterator->cursor != iterator->list->size;
}
Modified: incubator/celix/trunk/utils/private/src/hash_map.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/utils/private/src/hash_map.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/utils/private/src/hash_map.c (original)
+++ incubator/celix/trunk/utils/private/src/hash_map.c Tue May 10 08:21:24 2011
@@ -96,6 +96,13 @@ HASH_MAP hashMap_create(unsigned int (*k
return map;
}
+void hashMap_destroy(HASH_MAP map, bool freeKeys, bool freeValues) {
+ hashMap_clear(map, freeKeys, freeValues);
+ free(map->table);
+ free(map);
+ map = NULL;
+}
+
int hashMap_size(HASH_MAP map) {
return map->size;
}
@@ -198,7 +205,14 @@ void hashMap_resize(HASH_MAP map, int ne
void * hashMap_remove(HASH_MAP map, void * key) {
HASH_MAP_ENTRY entry = hashMap_removeEntryForKey(map, key);
- return (entry == NULL ? NULL : entry->value);
+ void * value = (entry == NULL ? NULL : entry->value);
+ if (entry != NULL) {
+ entry->key = NULL;
+ entry->value = NULL;
+ free(entry);
+ entry = NULL;
+ }
+ return value;
}
void * hashMap_removeEntryForKey(HASH_MAP map, void * key) {
@@ -209,7 +223,7 @@ void * hashMap_removeEntryForKey(HASH_MA
while (entry != NULL) {
HASH_MAP_ENTRY next = entry->next;
- if (entry->hash == hash && (entry->key == key || key != NULL && map->equalsKey(key, entry->key))) {
+ if (entry->hash == hash && (entry->key == key || (key != NULL && map->equalsKey(key, entry->key)))) {
map->modificationCount++;
map->size--;
if (prev == entry) {
@@ -254,7 +268,7 @@ HASH_MAP_ENTRY hashMap_removeMapping(HAS
return e;
}
-void hashMap_clear(HASH_MAP map) {
+void hashMap_clear(HASH_MAP map, bool freeKey, bool freeValue) {
map->modificationCount++;
HASH_MAP_ENTRY * table = map->table;
int i;
@@ -263,6 +277,10 @@ void hashMap_clear(HASH_MAP map) {
while (entry != NULL) {
HASH_MAP_ENTRY f = entry;
entry = entry->next;
+ if (freeKey && f->key != NULL)
+ free(f->key);
+ if (freeValue && f->value != NULL)
+ free(f->value);
free(f);
}
table[i] = NULL;
@@ -314,6 +332,7 @@ HASH_MAP_ITERATOR hashMapIterator_create
iterator->expectedModCount = map->modificationCount;
iterator->index = 0;
iterator->next = NULL;
+ iterator->current = NULL;
if (map->size > 0) {
while (iterator->index < map->tablelength && (iterator->next = map->table[iterator->index++]) == NULL) {
}
@@ -321,6 +340,16 @@ HASH_MAP_ITERATOR hashMapIterator_create
return iterator;
}
+void hashMapIterator_destroy(HASH_MAP_ITERATOR iterator) {
+ iterator->current = NULL;
+ iterator->expectedModCount = 0;
+ iterator->index = 0;
+ iterator->map = NULL;
+ iterator->next = NULL;
+ free(iterator);
+ iterator = NULL;
+}
+
bool hashMapIterator_hasNext(HASH_MAP_ITERATOR iterator) {
return iterator->next != NULL;
}
@@ -334,7 +363,8 @@ void hashMapIterator_remove(HASH_MAP_ITE
}
void * key = iterator->current->key;
iterator->current = NULL;
- hashMap_removeEntryForKey(iterator->map, key);
+ HASH_MAP_ENTRY entry = hashMap_removeEntryForKey(iterator->map, key);
+ free(entry);
iterator->expectedModCount = iterator->map->modificationCount;
}
@@ -402,11 +432,14 @@ bool hashMapKeySet_contains(HASH_MAP_KEY
}
bool hashMapKeySet_remove(HASH_MAP_KEY_SET keySet, void * key) {
- return hashMap_removeEntryForKey(keySet->map, key) != NULL;
+ HASH_MAP_ENTRY entry = hashMap_removeEntryForKey(keySet->map, key);
+ bool removed = entry != NULL;
+ free(entry);
+ return removed;
}
void hashMapKeySet_clear(HASH_MAP_KEY_SET keySet) {
- hashMap_clear(keySet->map);
+ hashMap_clear(keySet->map, false, false);
}
bool hashMapKeySet_isEmpty(HASH_MAP_KEY_SET keySet) {
@@ -420,6 +453,12 @@ HASH_MAP_VALUES hashMapValues_create(HAS
return values;
}
+void hashMapValues_destroy(HASH_MAP_VALUES values) {
+ values->map = NULL;
+ free(values);
+ values = NULL;
+}
+
HASH_MAP_ITERATOR hashMapValues_iterator(HASH_MAP_VALUES values) {
return hashMapIterator_create(values->map);
}
@@ -453,7 +492,7 @@ bool hashMapValues_remove(HASH_MAP_VALUE
}
void hashMapValues_clear(HASH_MAP_VALUES values) {
- hashMap_clear(values->map);
+ hashMap_clear(values->map, false, false);
}
bool hashMapValues_isEmpty(HASH_MAP_VALUES values) {
@@ -480,7 +519,7 @@ bool hashMapEntrySet_remove(HASH_MAP_VAL
}
void hashMapEntrySet_clear(HASH_MAP_ENTRY_SET entrySet) {
- hashMap_clear(entrySet->map);
+ hashMap_clear(entrySet->map, false, false);
}
bool hashMapEntrySet_isEmpty(HASH_MAP_ENTRY_SET entrySet) {
Modified: incubator/celix/trunk/utils/private/src/linked_list_iterator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/utils/private/src/linked_list_iterator.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/utils/private/src/linked_list_iterator.c (original)
+++ incubator/celix/trunk/utils/private/src/linked_list_iterator.c Tue May 10 08:21:24 2011
@@ -58,6 +58,15 @@ LINKED_LIST_ITERATOR linkedListIterator_
return iterator;
}
+void linkedListIterator_destroy(LINKED_LIST_ITERATOR iterator) {
+ iterator->expectedModificationCount = 0;
+ iterator->lastReturned = NULL;
+ iterator->list = NULL;
+ iterator->next = NULL;
+ iterator->nextIndex = 0;
+ free(iterator);
+}
+
bool linkedListIterator_hasNext(LINKED_LIST_ITERATOR iterator) {
return iterator->nextIndex != iterator->list->size;
}
Modified: incubator/celix/trunk/utils/private/src/linkedlist.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/utils/private/src/linkedlist.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/utils/private/src/linkedlist.c (original)
+++ incubator/celix/trunk/utils/private/src/linkedlist.c Tue May 10 08:21:24 2011
@@ -37,6 +37,17 @@ LINKED_LIST linkedList_create(void) {
list->header->previous = list->header;
list->size = 0;
list->modificationCount = 0;
+
+ return list;
+}
+
+void linkedList_destroy(LINKED_LIST list) {
+ linkedList_clear(list);
+ free(list->header);
+ list->header = NULL;
+ list->modificationCount = 0;
+ list->size = 0;
+ free(list);
}
void * linkedList_getFirst(LINKED_LIST list) {
@@ -112,8 +123,9 @@ void linkedList_clear(LINKED_LIST list)
while (entry != list->header) {
LINKED_LIST_ENTRY next = entry->next;
entry->next = entry->previous = NULL;
- free(entry->element);
+ // free(entry->element);
entry->element = NULL;
+ free(entry);
entry = next;
}
list->header->next = list->header->previous = list->header;
Modified: incubator/celix/trunk/utils/public/include/array_list.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/utils/public/include/array_list.h?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/utils/public/include/array_list.h (original)
+++ incubator/celix/trunk/utils/public/include/array_list.h Tue May 10 08:21:24 2011
@@ -50,6 +50,7 @@ void arrayList_clear(ARRAY_LIST list);
ARRAY_LIST arrayList_clone(ARRAY_LIST list);
ARRAY_LIST_ITERATOR arrayListIterator_create(ARRAY_LIST list);
+void arrayListIterator_destroy(ARRAY_LIST_ITERATOR iterator);
bool arrayListIterator_hasNext(ARRAY_LIST_ITERATOR iterator);
void * arrayListIterator_next(ARRAY_LIST_ITERATOR iterator);
bool arrayListIterator_hasPrevious(ARRAY_LIST_ITERATOR iterator);
Modified: incubator/celix/trunk/utils/public/include/hash_map.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/utils/public/include/hash_map.h?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/utils/public/include/hash_map.h (original)
+++ incubator/celix/trunk/utils/public/include/hash_map.h Tue May 10 08:21:24 2011
@@ -39,6 +39,7 @@ typedef struct hashMapEntrySet * HASH_MA
HASH_MAP hashMap_create(unsigned int (*keyHash)(void *), unsigned int (*valueHash)(void *),
int (*keyEquals)(void *, void *), int (*valueEquals)(void *, void *));
+void hashMap_destroy(HASH_MAP map, bool freeKeys, bool freeValues);
int hashMap_size(HASH_MAP map);
bool hashMap_isEmpty(HASH_MAP map);
void * hashMap_get(HASH_MAP map, void * key);
@@ -46,10 +47,11 @@ bool hashMap_containsKey(HASH_MAP map, v
HASH_MAP_ENTRY hashMap_getEntry(HASH_MAP map, void * key);
void * hashMap_put(HASH_MAP map, void * key, void * value);
void * hashMap_remove(HASH_MAP map, void * key);
-void hashMap_clear(HASH_MAP map);
+void hashMap_clear(HASH_MAP map, bool freeKey, bool freeValue);
bool hashMap_containsValue(HASH_MAP map, void * value);
HASH_MAP_ITERATOR hashMapIterator_create(HASH_MAP map);
+void hashMapIterator_destroy(HASH_MAP_ITERATOR iterator);
bool hashMapIterator_hasNext(HASH_MAP_ITERATOR iterator);
void hashMapIterator_remove(HASH_MAP_ITERATOR iterator);
void * hashMapIterator_nextValue(HASH_MAP_ITERATOR iterator);
@@ -64,6 +66,7 @@ void hashMapKeySet_clear(HASH_MAP_KEY_SE
bool hashMapKeySet_isEmpty(HASH_MAP_KEY_SET keySet);
HASH_MAP_VALUES hashMapValues_create(HASH_MAP map);
+void hashMapValues_destroy(HASH_MAP_VALUES values);
HASH_MAP_ITERATOR hashMapValues_iterator(HASH_MAP_VALUES values);
int hashMapValues_size(HASH_MAP_VALUES values);
bool hashMapValues_contains(HASH_MAP_VALUES values, void * o);
Modified: incubator/celix/trunk/utils/public/include/linked_list_iterator.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/utils/public/include/linked_list_iterator.h?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/utils/public/include/linked_list_iterator.h (original)
+++ incubator/celix/trunk/utils/public/include/linked_list_iterator.h Tue May 10 08:21:24 2011
@@ -33,6 +33,7 @@
typedef struct linkedListIterator * LINKED_LIST_ITERATOR;
LINKED_LIST_ITERATOR linkedListIterator_create(LINKED_LIST list, int index);
+void linkedListIterator_destroy(LINKED_LIST_ITERATOR iterator);
bool linkedListIterator_hasNext(LINKED_LIST_ITERATOR iterator);
void * linkedListIterator_next(LINKED_LIST_ITERATOR iterator);
bool linkedListIterator_hasPrevious(LINKED_LIST_ITERATOR iterator);
Modified: incubator/celix/trunk/whiteboard/publisherA/activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/whiteboard/publisherA/activator.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/whiteboard/publisherA/activator.c (original)
+++ incubator/celix/trunk/whiteboard/publisherA/activator.c Tue May 10 08:21:24 2011
@@ -28,23 +28,36 @@
#include "bundle_context.h"
#include "publisher_private.h"
+struct activatorData {
+ PUBLISHER_SERVICE ps;
+ PUBLISHER pub;
+};
+
void * bundleActivator_create() {
- return NULL;
+ struct activatorData * data = (struct activatorData *) malloc(sizeof(*data));
+ return data;
}
void bundleActivator_start(void * userData, BUNDLE_CONTEXT context) {
- PUBLISHER_SERVICE ps = malloc(sizeof(*ps));
- PUBLISHER pub = malloc(sizeof(*pub));
- ps->invoke = publisher_invoke;
- ps->publisher = pub;
+ struct activatorData * data = (struct activatorData *) userData;
+ data->ps = malloc(sizeof(*(data->ps)));
+ data->pub = malloc(sizeof(*(data->pub)));
+ data->ps->invoke = publisher_invoke;
+ data->ps->publisher = data->pub;
- bundleContext_registerService(context, PUBLISHER_NAME, ps, NULL);
+ bundleContext_registerService(context, PUBLISHER_NAME, data->ps, NULL);
}
void bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
-
+ struct activatorData * data = (struct activatorData *) userData;
+ data->ps->publisher = NULL;
+ data->ps->invoke = NULL;
+ free(data->pub);
+ free(data->ps);
+ data->pub = NULL;
+ data->ps = NULL;
}
void bundleActivator_destroy(void * userData) {
-
+ free(userData);
}
Modified: incubator/celix/trunk/whiteboard/publisherA/publisher.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/whiteboard/publisherA/publisher.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/whiteboard/publisherA/publisher.c (original)
+++ incubator/celix/trunk/whiteboard/publisherA/publisher.c Tue May 10 08:21:24 2011
@@ -27,6 +27,6 @@
#include "publisher_private.h"
void publisher_invoke(PUBLISHER publisher, char * text) {
- printf("Hello from A %s\n", text);
+ printf("Publisher A received: %s\n", text);
}
Modified: incubator/celix/trunk/whiteboard/publisherB/activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/whiteboard/publisherB/activator.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/whiteboard/publisherB/activator.c (original)
+++ incubator/celix/trunk/whiteboard/publisherB/activator.c Tue May 10 08:21:24 2011
@@ -28,23 +28,36 @@
#include "bundle_context.h"
#include "publisher_private.h"
+struct activatorData {
+ PUBLISHER_SERVICE ps;
+ PUBLISHER pub;
+};
+
void * bundleActivator_create() {
- return NULL;
+ struct activatorData * data = (struct activatorData *) malloc(sizeof(*data));
+ return data;
}
void bundleActivator_start(void * userData, BUNDLE_CONTEXT context) {
- PUBLISHER_SERVICE ps = malloc(sizeof(*ps));
- PUBLISHER pub = malloc(sizeof(*pub));
- ps->invoke = publisher_invoke;
- ps->publisher = pub;
+ struct activatorData * data = (struct activatorData *) userData;
+ data->ps = malloc(sizeof(*(data->ps)));
+ data->pub = malloc(sizeof(*(data->pub)));
+ data->ps->invoke = publisher_invoke;
+ data->ps->publisher = data->pub;
- bundleContext_registerService(context, PUBLISHER_NAME, ps, NULL);
+ bundleContext_registerService(context, PUBLISHER_NAME, data->ps, NULL);
}
void bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
-
+ struct activatorData * data = (struct activatorData *) userData;
+ data->ps->publisher = NULL;
+ data->ps->invoke = NULL;
+ free(data->pub);
+ free(data->ps);
+ data->pub = NULL;
+ data->ps = NULL;
}
void bundleActivator_destroy(void * userData) {
-
+ free(userData);
}
Modified: incubator/celix/trunk/whiteboard/publisherB/publisher.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/whiteboard/publisherB/publisher.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/whiteboard/publisherB/publisher.c (original)
+++ incubator/celix/trunk/whiteboard/publisherB/publisher.c Tue May 10 08:21:24 2011
@@ -27,6 +27,6 @@
#include "publisher_private.h"
void publisher_invoke(PUBLISHER publisher, char * text) {
- printf("Hello from B %s\n", text);
+ printf("Publisher B received: %s\n", text);
}
Modified: incubator/celix/trunk/whiteboard/tracker/activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/whiteboard/tracker/activator.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/whiteboard/tracker/activator.c (original)
+++ incubator/celix/trunk/whiteboard/tracker/activator.c Tue May 10 08:21:24 2011
@@ -51,6 +51,7 @@ void * trk_send(void * handle) {
sleep(1);
}
pthread_exit(NULL);
+ return NULL;
}
void * addingServ(void * handle, SERVICE_REFERENCE ref) {
Modified: incubator/celix/trunk/whiteboard/tracker_depman/CMakeLists.txt
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/whiteboard/tracker_depman/CMakeLists.txt?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/whiteboard/tracker_depman/CMakeLists.txt (original)
+++ incubator/celix/trunk/whiteboard/tracker_depman/CMakeLists.txt Tue May 10 08:21:24 2011
@@ -15,7 +15,7 @@
# specific language governing permissions and limitations
# under the License.
-add_library(tracker_depman SHARED dependency_activator)
+add_library(tracker_depman SHARED dependency_activator tracker)
include_directories("${PROJECT_SOURCE_DIR}/celix")
include_directories("${PROJECT_SOURCE_DIR}/dependency_manager")
include_directories("../publisherService")
Modified: incubator/celix/trunk/whiteboard/tracker_depman/dependency_activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/whiteboard/tracker_depman/dependency_activator.c?rev=1101360&r1=1101359&r2=1101360&view=diff
==============================================================================
--- incubator/celix/trunk/whiteboard/tracker_depman/dependency_activator.c (original)
+++ incubator/celix/trunk/whiteboard/tracker_depman/dependency_activator.c Tue May 10 08:21:24 2011
@@ -30,69 +30,16 @@
#include "dependency_activator_base.h"
#include "service_component_private.h"
-#include "service.h"
#include "publisher.h"
-
-struct data {
- SERVICE service;
- BUNDLE_CONTEXT context;
- ARRAY_LIST publishers;
- pthread_t sender;
- bool running;
-};
-
-void * dp_send(void * handle) {
- struct data * data = (struct data *) handle;
- while (data->running) {
- int i;
- for (i = 0; i < arrayList_size(data->publishers); i++) {
- PUBLISHER_SERVICE pub = (PUBLISHER_SERVICE) arrayList_get(data->publishers, i);
- pub->invoke(pub->publisher, "test");
- }
- sleep(1);
- }
- pthread_exit(NULL);
-}
-
-void service_init(void * userData) {
-
-}
-
-void service_start(void * userData) {
- struct data * data = (struct data *) userData;
- data->running = true;
- pthread_create(&data->sender, NULL, dp_send, data);
-}
-
-void service_stop(void * userData) {
- struct data * data = (struct data *) userData;
- data->running = false;
-}
-
-void service_destroy(void * userData) {
-
-}
-
-void addedServ(void * handle, SERVICE_REFERENCE ref, void * service) {
- struct data * data = (struct data *) handle;
- arrayList_add(data->publishers, service);
- printf("Service Added\n");
-}
-
-void modifiedServ(void * handle, SERVICE_REFERENCE ref, void * service) {
- struct data * data = (struct data *) handle;
- printf("Service Changed\n");
-}
-
-void removedServ(void * handle, SERVICE_REFERENCE ref, void * service) {
- struct data * data = (struct data *) handle;
- arrayList_removeElement(data->publishers, service);
- printf("Service Removed\n");
-}
+#include "tracker.h"
void * dm_create() {
struct data * data = malloc(sizeof(*data));
data->publishers = arrayList_create();
+ data->context = NULL;
+ data->running = false;
+ data->sender = NULL;
+ data->service = NULL;
return data;
}
@@ -105,7 +52,7 @@ void dm_init(void * userData, BUNDLE_CON
SERVICE_DEPENDENCY dep = dependencyActivatorBase_createServiceDependency(manager);
serviceDependency_setRequired(dep, false);
serviceDependency_setService(dep, PUBLISHER_NAME, NULL);
- serviceDependency_setCallbacks(dep, addedServ, modifiedServ, removedServ);
+ serviceDependency_setCallbacks(dep, tracker_addedServ, tracker_modifiedServ, tracker_removedServ);
serviceComponent_addServiceDependency(service, dep);
data->service = service;
@@ -115,5 +62,9 @@ void dm_init(void * userData, BUNDLE_CON
void dm_destroy(void * userData, BUNDLE_CONTEXT context, DEPENDENCY_MANAGER manager) {
struct data * data = (struct data *) userData;
dependencyManager_remove(manager, data->service);
+ arrayList_destroy(data->publishers);
+ data->publishers = NULL;
+ free(data);
+ data = NULL;
}
Added: incubator/celix/trunk/whiteboard/tracker_depman/tracker.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/whiteboard/tracker_depman/tracker.c?rev=1101360&view=auto
==============================================================================
--- incubator/celix/trunk/whiteboard/tracker_depman/tracker.c (added)
+++ incubator/celix/trunk/whiteboard/tracker_depman/tracker.c Tue May 10 08:21:24 2011
@@ -0,0 +1,66 @@
+/*
+ * tracker.c
+ *
+ * Created on: Mar 7, 2011
+ * Author: alexanderb
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <stdbool.h>
+
+#include "service.h"
+#include "publisher.h"
+#include "tracker.h"
+
+void * dp_send(void * handle) {
+ struct data * data = (struct data *) handle;
+ while (data->running) {
+ int i;
+ for (i = 0; i < arrayList_size(data->publishers); i++) {
+ PUBLISHER_SERVICE pub = (PUBLISHER_SERVICE) arrayList_get(data->publishers, i);
+ pub->invoke(pub->publisher, "Tracker message");
+ }
+ sleep(1);
+ }
+ pthread_exit(NULL);
+ return NULL;
+}
+
+void service_init(void * userData) {
+
+}
+
+void service_start(void * userData) {
+ struct data * data = (struct data *) userData;
+ data->running = true;
+ pthread_create(&data->sender, NULL, dp_send, data);
+}
+
+void service_stop(void * userData) {
+ struct data * data = (struct data *) userData;
+ data->running = false;
+}
+
+void service_destroy(void * userData) {
+
+}
+
+void tracker_addedServ(void * handle, SERVICE_REFERENCE ref, void * service) {
+ struct data * data = (struct data *) handle;
+ arrayList_add(data->publishers, service);
+ printf("Service Added\n");
+}
+
+void tracker_modifiedServ(void * handle, SERVICE_REFERENCE ref, void * service) {
+ struct data * data = (struct data *) handle;
+ printf("Service Changed\n");
+}
+
+void tracker_removedServ(void * handle, SERVICE_REFERENCE ref, void * service) {
+ struct data * data = (struct data *) handle;
+ arrayList_removeElement(data->publishers, service);
+ printf("Service Removed\n");
+}
+
Propchange: incubator/celix/trunk/whiteboard/tracker_depman/tracker.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/celix/trunk/whiteboard/tracker_depman/tracker.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/whiteboard/tracker_depman/tracker.h?rev=1101360&view=auto
==============================================================================
--- incubator/celix/trunk/whiteboard/tracker_depman/tracker.h (added)
+++ incubator/celix/trunk/whiteboard/tracker_depman/tracker.h Tue May 10 08:21:24 2011
@@ -0,0 +1,27 @@
+/*
+ * tracker.h
+ *
+ * Created on: Mar 7, 2011
+ * Author: alexanderb
+ */
+
+#ifndef TRACKER_H_
+#define TRACKER_H_
+
+#include "headers.h"
+#include "service_component.h"
+
+struct data {
+ SERVICE service;
+ BUNDLE_CONTEXT context;
+ ARRAY_LIST publishers;
+ pthread_t sender;
+ bool running;
+};
+
+void tracker_addedServ(void * handle, SERVICE_REFERENCE ref, void * service);
+void tracker_modifiedServ(void * handle, SERVICE_REFERENCE ref, void * service);
+void tracker_removedServ(void * handle, SERVICE_REFERENCE ref, void * service);
+
+
+#endif /* TRACKER_H_ */
Propchange: incubator/celix/trunk/whiteboard/tracker_depman/tracker.h
------------------------------------------------------------------------------
svn:mime-type = text/plain