Updated IPCChannel class to pass a variable number of parameter strings per message (instead of just one).

This commit is contained in:
LoRd_MuldeR 2015-02-01 15:07:06 +01:00
parent e33d869f59
commit 4091eccf9b
4 changed files with 37 additions and 21 deletions

View File

@ -26,6 +26,7 @@
//Qt //Qt
#include <QtGlobal> #include <QtGlobal>
#include <QStringList>
namespace MUtils namespace MUtils
{ {
@ -34,7 +35,8 @@ namespace MUtils
class MUTILS_API IPCChannel class MUTILS_API IPCChannel
{ {
public: public:
static const size_t MAX_MESSAGE_LEN = 4096; static const quint32 MAX_PARAM_LEN = 4096;
static const quint32 MAX_PARAM_CNT = 4;
typedef enum typedef enum
{ {
@ -50,8 +52,8 @@ namespace MUtils
int initialize(void); int initialize(void);
bool send(const quint32 &command, const quint32 &flags, const char *const message); bool send(const quint32 &command, const quint32 &flags, const QStringList &params = QStringList());
bool read(quint32 &command, quint32 &flags, char *const message, const size_t &buffSize); bool read(quint32 &command, quint32 &flags, QStringList &params);
private: private:
IPCChannel(const IPCChannel&) : p(NULL), m_appVersionNo(-1) { throw "Constructor is disabled!"; } IPCChannel(const IPCChannel&) : p(NULL), m_appVersionNo(-1) { throw "Constructor is disabled!"; }

View File

@ -31,4 +31,4 @@
#define VER_MUTILS_MAJOR 1 #define VER_MUTILS_MAJOR 1
#define VER_MUTILS_MINOR_HI 0 #define VER_MUTILS_MINOR_HI 0
#define VER_MUTILS_MINOR_LO 0 #define VER_MUTILS_MINOR_LO 1

View File

@ -523,7 +523,7 @@ int MUtils::Internal::selfTest(const char *const buildKey, const bool debug)
static const bool MY_DEBUG_FLAG = MUTILS_DEBUG; static const bool MY_DEBUG_FLAG = MUTILS_DEBUG;
static const char *const MY_BUILD_KEY = __DATE__"@"__TIME__; static const char *const MY_BUILD_KEY = __DATE__"@"__TIME__;
if(strncmp(buildKey, MY_BUILD_KEY, 14) || (MY_DEBUG_FLAG != debug)) if(strncmp(buildKey, MY_BUILD_KEY, 13) || (MY_DEBUG_FLAG != debug))
{ {
MUtils::OS::system_message_err(L"MUtils", L"FATAL ERROR: MUtils library version mismatch detected!"); MUtils::OS::system_message_err(L"MUtils", L"FATAL ERROR: MUtils library version mismatch detected!");
MUtils::OS::system_message_wrn(L"MUtils", L"Please re-build the complete solution in order to fix this issue!"); MUtils::OS::system_message_wrn(L"MUtils", L"Please re-build the complete solution in order to fix this issue!");

View File

@ -33,7 +33,7 @@
#include <QMutex> #include <QMutex>
#include <QWriteLocker> #include <QWriteLocker>
#include <QCryptographicHash> #include <QCryptographicHash>
#include <QStringList>
//CRT //CRT
#include <cassert> #include <cassert>
@ -89,10 +89,17 @@ namespace MUtils
typedef struct typedef struct
{ {
quint32 command_id; char values[MUtils::IPCChannel::MAX_PARAM_CNT][MUtils::IPCChannel::MAX_PARAM_LEN];
quint32 flags; quint32 count;
char param[MUtils::IPCChannel::MAX_MESSAGE_LEN]; }
quint64 timestamp; ipc_msg_data_params_t;
typedef struct
{
quint32 command_id;
quint32 flags;
ipc_msg_data_params_t params;
quint64 timestamp;
} }
ipc_msg_data_t; ipc_msg_data_t;
@ -301,7 +308,7 @@ int MUtils::IPCChannel::initialize(void)
// SEND MESSAGE // SEND MESSAGE
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
bool MUtils::IPCChannel::send(const quint32 &command, const quint32 &flags, const char *const message) bool MUtils::IPCChannel::send(const quint32 &command, const quint32 &flags, const QStringList &params)
{ {
bool success = false; bool success = false;
QReadLocker readLock(&p->lock); QReadLocker readLock(&p->lock);
@ -334,9 +341,14 @@ bool MUtils::IPCChannel::send(const quint32 &command, const quint32 &flags, cons
ipc_msg.payload.command_id = command; ipc_msg.payload.command_id = command;
ipc_msg.payload.flags = flags; ipc_msg.payload.flags = flags;
if(message) if(!params.isEmpty())
{ {
strncpy_s(ipc_msg.payload.param, MAX_MESSAGE_LEN, message, _TRUNCATE); const quint32 param_count = qMin(MAX_PARAM_CNT, (quint32)params.count());
for(quint32 i = 0; i < param_count; i++)
{
strncpy_s(ipc_msg.payload.params.values[i], MAX_PARAM_LEN, MUTILS_UTF8(params[i]), _TRUNCATE);
}
ipc_msg.payload.params.count = param_count;
} }
ipc_msg.payload.timestamp = ptr->status.payload.counter++; ipc_msg.payload.timestamp = ptr->status.payload.counter++;
UPDATE_CHECKSUM(ipc_msg); UPDATE_CHECKSUM(ipc_msg);
@ -376,16 +388,12 @@ bool MUtils::IPCChannel::send(const quint32 &command, const quint32 &flags, cons
// READ MESSAGE // READ MESSAGE
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
bool MUtils::IPCChannel::read(quint32 &command, quint32 &flags, char *const message, const size_t &buffSize) bool MUtils::IPCChannel::read(quint32 &command, quint32 &flags, QStringList &params)
{ {
bool success = false; bool success = false;
QReadLocker readLock(&p->lock); QReadLocker readLock(&p->lock);
command = 0; command = 0;
if(message && (buffSize > 0)) params.clear();
{
message[0] = '\0';
}
if(!p->initialized) if(!p->initialized)
{ {
@ -421,7 +429,13 @@ bool MUtils::IPCChannel::read(quint32 &command, quint32 &flags, char *const mess
{ {
command = ipc_msg.payload.command_id; command = ipc_msg.payload.command_id;
flags = ipc_msg.payload.flags; flags = ipc_msg.payload.flags;
strncpy_s(message, buffSize, ipc_msg.payload.param, _TRUNCATE); const quint32 param_count = qMin(ipc_msg.payload.params.count, MAX_PARAM_CNT);
char temp[MAX_PARAM_LEN];
for(quint32 i = 0; i < param_count; i++)
{
strncpy_s(temp, MAX_PARAM_LEN, ipc_msg.payload.params.values[i], _TRUNCATE);
params.append(QString::fromUtf8(temp));
}
success = true; success = true;
} }
else else