summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Lotterbach <timo.lotterbach@bmw-carit.de>2012-09-10 06:14:38 -0700
committerTimo Lotterbach <timo.lotterbach@bmw-carit.de>2012-10-02 01:28:58 -0700
commitc0072597aac5621a2f703c62362b5334de780220 (patch)
tree8edbdbdb36a22ee672974a67047347f6138bedcb
parentf78fa2463b0148da4b3be6e8042ea2c52f5a00b6 (diff)
downloadlayer_management-c0072597aac5621a2f703c62362b5334de780220.tar.gz
IpcModuleLoader: updated IpcMpodule API to support client notifications
removed destroyMessage: was only used for DBusIpcModule, but lifecycle of received messages is now handled internally. The external call is not required any more.
-rw-r--r--LayerManagerPlugins/IpcModules/IpcModuleLoader/include/IpcModule.h76
-rw-r--r--LayerManagerPlugins/IpcModules/IpcModuleLoader/include/IpcModuleLoader.h54
-rw-r--r--LayerManagerPlugins/IpcModules/IpcModuleLoader/src/IpcModuleLoader.c87
3 files changed, 130 insertions, 87 deletions
diff --git a/LayerManagerPlugins/IpcModules/IpcModuleLoader/include/IpcModule.h b/LayerManagerPlugins/IpcModules/IpcModuleLoader/include/IpcModule.h
index 4d69d7b..cb6fa38 100644
--- a/LayerManagerPlugins/IpcModules/IpcModuleLoader/include/IpcModule.h
+++ b/LayerManagerPlugins/IpcModules/IpcModuleLoader/include/IpcModule.h
@@ -24,44 +24,66 @@
//=============================================================================
// initialization
//=============================================================================
-t_ilm_bool init(t_ilm_bool isClient);
-t_ilm_bool destroy();
+t_ilm_bool initClientMode();
+t_ilm_bool initServiceMode();
//=============================================================================
-// messaging
+// create new messages
//=============================================================================
-t_ilm_bool createMessage(t_ilm_const_string name);
-t_ilm_bool sendMessage();
-t_ilm_bool destroyMessage();
-t_ilm_bool sendError(t_ilm_const_string errorDescription);
-enum IpcMessageType receiveMessage(t_ilm_int timeoutInMs);
+t_ilm_message createMessage (t_ilm_const_string);
+t_ilm_message createResponse (t_ilm_message);
+t_ilm_message createErrorResponse(t_ilm_message);
+t_ilm_message createNotification (t_ilm_const_string);
-t_ilm_const_string getMessageName();
-t_ilm_const_string getSenderName();
-t_ilm_bool isErrorMessage();
+//=============================================================================
+// add content to message
+//=============================================================================
+t_ilm_bool appendBool (t_ilm_message, const t_ilm_bool);
+t_ilm_bool appendDouble (t_ilm_message, const double);
+t_ilm_bool appendString (t_ilm_message, const char*);
+t_ilm_bool appendInt (t_ilm_message, const int);
+t_ilm_bool appendIntArray (t_ilm_message, const int*, int);
+t_ilm_bool appendUint (t_ilm_message, const unsigned int);
+t_ilm_bool appendUintArray(t_ilm_message, const unsigned int*, int);
//=============================================================================
-// message content
+// send message
//=============================================================================
-t_ilm_bool appendBool(const t_ilm_bool value);
-t_ilm_bool getBool(t_ilm_bool* value);
+t_ilm_bool sendToClients(t_ilm_message, t_ilm_client_handle*, int);
+t_ilm_bool sendToService(t_ilm_message);
-t_ilm_bool appendDouble(const t_ilm_float value);
-t_ilm_bool getDouble(t_ilm_float* value);
+//=============================================================================
+// receive message
+//=============================================================================
+t_ilm_message receive(t_ilm_int); // timeout in ms
-t_ilm_bool appendString(const char* value);
-t_ilm_bool getString(char* value);
+//=============================================================================
+// get message information
+//=============================================================================
+t_ilm_const_string getMessageName (t_ilm_message);
+t_ilm_message_type getMessageType (t_ilm_message);
+t_ilm_const_string getSenderName (t_ilm_message);
+t_ilm_client_handle getSenderHandle(t_ilm_message);
-t_ilm_bool appendInt(const int value);
-t_ilm_bool appendIntArray(const t_ilm_int* valueArray, t_ilm_int arraySize);
-t_ilm_bool getIntArray(t_ilm_int** valueArray, t_ilm_int* arraySize);
-t_ilm_bool getInt(t_ilm_int* value);
+//=============================================================================
+// get content of message
+//=============================================================================
+t_ilm_bool getBool (t_ilm_message, t_ilm_bool*);
+t_ilm_bool getDouble (t_ilm_message, double*);
+t_ilm_bool getString (t_ilm_message, char*);
+t_ilm_bool getInt (t_ilm_message, int*);
+t_ilm_bool getIntArray (t_ilm_message, int**, int*);
+t_ilm_bool getUint (t_ilm_message, unsigned int*);
+t_ilm_bool getUintArray(t_ilm_message, unsigned int**, int*);
-t_ilm_bool appendUint(const t_ilm_uint value);
-t_ilm_bool appendUintArray(const t_ilm_uint* valueArray, t_ilm_int arraySize);
-t_ilm_bool getUintArray(t_ilm_uint** valueArray, t_ilm_int* arraySize);
-t_ilm_bool getUint(t_ilm_uint* value);
+//=============================================================================
+// destroy message
+//=============================================================================
+t_ilm_bool destroyMessage(t_ilm_message);
-// TODO: signal mechanism?
+//=============================================================================
+// shutdown
+//=============================================================================
+t_ilm_bool destroy();
#endif // __IPCMODULE_H__
diff --git a/LayerManagerPlugins/IpcModules/IpcModuleLoader/include/IpcModuleLoader.h b/LayerManagerPlugins/IpcModules/IpcModuleLoader/include/IpcModuleLoader.h
index 40d4455..94d90e8 100644
--- a/LayerManagerPlugins/IpcModules/IpcModuleLoader/include/IpcModuleLoader.h
+++ b/LayerManagerPlugins/IpcModules/IpcModuleLoader/include/IpcModuleLoader.h
@@ -27,37 +27,43 @@ extern "C" {
struct IpcModule
{
- t_ilm_bool (*init)(t_ilm_bool);
- t_ilm_bool (*destroy)();
+ t_ilm_bool (*initClientMode)();
+ t_ilm_bool (*initServiceMode)();
+
+ t_ilm_message (*createMessage)(t_ilm_const_string);
+ t_ilm_message (*createResponse)(t_ilm_message);
+ t_ilm_message (*createErrorResponse)(t_ilm_message);
+ t_ilm_message (*createNotification)(t_ilm_const_string);
- t_ilm_bool (*createMessage)(t_ilm_const_string);
- t_ilm_bool (*sendMessage)();
- t_ilm_bool (*destroyMessage)();
- t_ilm_bool (*sendError)(t_ilm_const_string);
- enum IpcMessageType (*receiveMessage)(int); // timeout in ms
+ t_ilm_bool (*appendBool)(t_ilm_message, const t_ilm_bool);
+ t_ilm_bool (*appendDouble)(t_ilm_message, const double);
+ t_ilm_bool (*appendString)(t_ilm_message, const char*);
+ t_ilm_bool (*appendInt)(t_ilm_message, const int);
+ t_ilm_bool (*appendIntArray)(t_ilm_message, const int*, int);
+ t_ilm_bool (*appendUint)(t_ilm_message, const unsigned int);
+ t_ilm_bool (*appendUintArray)(t_ilm_message, const unsigned int*, int);
- t_ilm_const_string (*getMessageName)();
- t_ilm_const_string (*getSenderName)();
- t_ilm_bool (*isErrorMessage)();
+ t_ilm_bool (*sendToClients)(t_ilm_message, t_ilm_client_handle*, int);
+ t_ilm_bool (*sendToService)(t_ilm_message);
- t_ilm_bool (*appendBool)(const t_ilm_bool);
- t_ilm_bool (*getBool)(t_ilm_bool*);
+ t_ilm_message (*receive)(t_ilm_int); // timeout in ms
- t_ilm_bool (*appendDouble)(const double);
- t_ilm_bool (*getDouble)(double*);
+ t_ilm_const_string (*getMessageName)(t_ilm_message);
+ t_ilm_message_type (*getMessageType)(t_ilm_message);
+ t_ilm_const_string (*getSenderName)(t_ilm_message);
+ t_ilm_client_handle (*getSenderHandle)(t_ilm_message);
- t_ilm_bool (*appendString)(const char*);
- t_ilm_bool (*getString)(char*);
+ t_ilm_bool (*getBool)(t_ilm_message, t_ilm_bool*);
+ t_ilm_bool (*getDouble)(t_ilm_message, double*);
+ t_ilm_bool (*getString)(t_ilm_message, char*);
+ t_ilm_bool (*getInt)(t_ilm_message, int*);
+ t_ilm_bool (*getIntArray)(t_ilm_message, int**, int*);
+ t_ilm_bool (*getUint)(t_ilm_message, unsigned int*);
+ t_ilm_bool (*getUintArray)(t_ilm_message, unsigned int**, int*);
- t_ilm_bool (*appendInt)(const int);
- t_ilm_bool (*getInt)(int*);
- t_ilm_bool (*appendIntArray)(const int*, int);
- t_ilm_bool (*getIntArray)(int**, int*);
+ t_ilm_bool (*destroyMessage)(t_ilm_message);
- t_ilm_bool (*appendUint)(const unsigned int);
- t_ilm_bool (*getUint)(unsigned int*);
- t_ilm_bool (*appendUintArray)(const unsigned int*, int);
- t_ilm_bool (*getUintArray)(unsigned int**, int*);
+ t_ilm_bool (*destroy)();
};
t_ilm_bool loadIpcModule(struct IpcModule* communicator);
diff --git a/LayerManagerPlugins/IpcModules/IpcModuleLoader/src/IpcModuleLoader.c b/LayerManagerPlugins/IpcModules/IpcModuleLoader/src/IpcModuleLoader.c
index 748e92f..d5bc265 100644
--- a/LayerManagerPlugins/IpcModules/IpcModuleLoader/src/IpcModuleLoader.c
+++ b/LayerManagerPlugins/IpcModules/IpcModuleLoader/src/IpcModuleLoader.c
@@ -26,18 +26,12 @@
#include <dirent.h> // DIR
#include <string.h> // strcpy, strcat, strstr
-//=============================================================================
-// logging
-//=============================================================================
-//#define LOG_ENTER_FUNCTION printf("--> ilmCommunicatorControl::%s\n", __PRETTY_FUNCTION__)
-#define LOG_ENTER_FUNCTION
-
//=============================================================================
// global variables
//=============================================================================
const char* gDefaultPluginLookupPath = CMAKE_INSTALL_PREFIX"/lib/layermanager";
-const char* gCommunicatorPluginDirectory = "/ipcmodules";
+const char* gCommunicatorPluginDirectory = "ipcmodules";
//=============================================================================
@@ -58,38 +52,49 @@ t_ilm_bool loadSymbolTable(struct IpcModule* ipcModule, char* path, char* file)
struct ApiFunction ApiFunctionTable[] =
{
- { "init", (void**)&ipcModule->init },
- { "destroy", (void**)&ipcModule->destroy },
- { "createMessage", (void**)&ipcModule->createMessage },
- { "sendMessage", (void**)&ipcModule->sendMessage },
- { "destroyMessage", (void**)&ipcModule->destroyMessage },
- { "sendError", (void**)&ipcModule->sendError },
- { "isErrorMessage", (void**)&ipcModule->isErrorMessage },
- { "receiveMessage", (void**)&ipcModule->receiveMessage },
- { "getMessageName", (void**)&ipcModule->getMessageName },
- { "getSenderName", (void**)&ipcModule->getSenderName },
- { "appendBool", (void**)&ipcModule->appendBool },
- { "getBool", (void**)&ipcModule->getBool },
- { "appendDouble", (void**)&ipcModule->appendDouble },
- { "getDouble", (void**)&ipcModule->getDouble },
- { "appendString", (void**)&ipcModule->appendString },
- { "getString", (void**)&ipcModule->getString },
- { "appendInt", (void**)&ipcModule->appendInt },
- { "getInt", (void**)&ipcModule->getInt },
- { "appendIntArray", (void**)&ipcModule->appendIntArray },
- { "getIntArray", (void**)&ipcModule->getIntArray },
- { "appendUint", (void**)&ipcModule->appendUint },
- { "getUint", (void**)&ipcModule->getUint },
- { "appendUintArray", (void**)&ipcModule->appendUintArray },
- { "getUintArray", (void**)&ipcModule->getUintArray }
+ { "initClientMode", (void**)&ipcModule->initClientMode },
+ { "initServiceMode", (void**)&ipcModule->initServiceMode },
+
+ { "createMessage", (void**)&ipcModule->createMessage },
+ { "createResponse", (void**)&ipcModule->createResponse },
+ { "createErrorResponse", (void**)&ipcModule->createErrorResponse },
+ { "createNotification", (void**)&ipcModule->createNotification },
+
+ { "appendBool", (void**)&ipcModule->appendBool },
+ { "appendDouble", (void**)&ipcModule->appendDouble },
+ { "appendString", (void**)&ipcModule->appendString },
+ { "appendInt", (void**)&ipcModule->appendInt },
+ { "appendIntArray", (void**)&ipcModule->appendIntArray },
+ { "appendUint", (void**)&ipcModule->appendUint },
+ { "appendUintArray", (void**)&ipcModule->appendUintArray },
+
+ { "sendToClients", (void**)&ipcModule->sendToClients },
+ { "sendToService", (void**)&ipcModule->sendToService },
+
+ { "receive", (void**)&ipcModule->receive },
+
+ { "getMessageName", (void**)&ipcModule->getMessageName },
+ { "getMessageType", (void**)&ipcModule->getMessageType },
+ { "getSenderName", (void**)&ipcModule->getSenderName },
+ { "getSenderHandle", (void**)&ipcModule->getSenderHandle },
+
+ { "getBool", (void**)&ipcModule->getBool },
+ { "getDouble", (void**)&ipcModule->getDouble },
+ { "getString", (void**)&ipcModule->getString },
+ { "getInt", (void**)&ipcModule->getInt },
+ { "getIntArray", (void**)&ipcModule->getIntArray },
+ { "getUint", (void**)&ipcModule->getUint },
+ { "getUintArray", (void**)&ipcModule->getUintArray },
+
+ { "destroyMessage", (void**)&ipcModule->destroyMessage },
+
+ { "destroy", (void**)&ipcModule->destroy }
};
const unsigned int apiFunctionCount = sizeof (ApiFunctionTable) / sizeof(struct ApiFunction);
unsigned int symbolCount = 0;
- strcat(fullFilePath, path);
- strcat(fullFilePath, "/");
- strcat(fullFilePath, file);
+ snprintf(fullFilePath, sizeof(fullFilePath), "%s/%s", path, file);
pluginLibHandle = dlopen(fullFilePath, RTLD_LAZY);
@@ -104,6 +109,11 @@ t_ilm_bool loadSymbolTable(struct IpcModule* ipcModule, char* path, char* file)
if (*func->funcPtr)
{
symbolCount++;
+ //printf("[ OK ] symbol %s\n", func->name);
+ }
+ else
+ {
+ //printf("[FAIL] symbol %s\n", func->name);
}
}
}
@@ -126,6 +136,10 @@ t_ilm_bool loadSymbolTable(struct IpcModule* ipcModule, char* path, char* file)
}
}
+ // Note: will break plugin. must be done during shutdown,
+ // but currently there is no unloadIpcModule
+ //dlclose(pluginLibHandle);
+
return returnValue;
}
@@ -141,8 +155,9 @@ t_ilm_bool loadIpcModule(struct IpcModule* communicator)
}
char path[1024];
- strcpy(path, gDefaultPluginLookupPath);
- strcat(path, gCommunicatorPluginDirectory);
+
+ snprintf(path, sizeof(path), "%s/%s", gDefaultPluginLookupPath,
+ gCommunicatorPluginDirectory);
// open directory
DIR *directory = opendir(path);