diff options
author | Timo Lotterbach <timo.lotterbach@bmw-carit.de> | 2012-09-10 06:14:38 -0700 |
---|---|---|
committer | Timo Lotterbach <timo.lotterbach@bmw-carit.de> | 2012-10-02 01:28:58 -0700 |
commit | c0072597aac5621a2f703c62362b5334de780220 (patch) | |
tree | 8edbdbdb36a22ee672974a67047347f6138bedcb | |
parent | f78fa2463b0148da4b3be6e8042ea2c52f5a00b6 (diff) | |
download | layer_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.
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); |