87 lines
2.3 KiB
C++
87 lines
2.3 KiB
C++
#ifndef _WDL_SHM_MSGREPLY_
|
|
#define _WDL_SHM_MSGREPLY_
|
|
|
|
#include <time.h>
|
|
#include "shm_connection.h"
|
|
#include "mutex.h"
|
|
|
|
|
|
/*
|
|
4 byte message type
|
|
|
|
4 byte unique message ID (0 for no reply needed/wanted)
|
|
|
|
4 byte message length (following)
|
|
|
|
|
|
type: 0 reply
|
|
call specific return data
|
|
type: all others user defined
|
|
|
|
*/
|
|
// type is user defined, however type=0 is reserved for reply
|
|
class SHM_MsgReplyConnection
|
|
{
|
|
|
|
public:
|
|
|
|
class WaitingMessage
|
|
{
|
|
public:
|
|
WaitingMessage() { }
|
|
~WaitingMessage() { }
|
|
|
|
WaitingMessage *_next;
|
|
|
|
int m_msgid;
|
|
int m_msgtype;
|
|
|
|
WDL_HeapBuf m_msgdata;
|
|
};
|
|
|
|
|
|
SHM_MsgReplyConnection(int bufsize, int maxqueuesize, bool dir, const char *uniquestr=NULL, int timeout_sec=0, int extra_flags=0);
|
|
~SHM_MsgReplyConnection();
|
|
|
|
// be sure to set these, and have OnRecv() Reply() to any nonzero msgID !
|
|
void *userData;
|
|
WaitingMessage *(*OnRecv)(SHM_MsgReplyConnection *con, WaitingMessage *msg);
|
|
bool (*IdleProc)(SHM_MsgReplyConnection *con); // return TRUE to abort (this will set the m_has_had_error to true / kill the connection)
|
|
// can return NULL To temporarily buffer msg, can return a chain of msgs too to return them to the spare list
|
|
|
|
// run as you wish, Send() will also run internally when waiting for reply
|
|
// note: the checkForReplyID etc are for INTERNAL USE ONLY :)
|
|
|
|
bool Run(bool runFull=true);
|
|
|
|
// returns <0 if no reply, otherwise lenght of replybuf used
|
|
// no retbuf = no wait for reply
|
|
int Send(int type, const void *msg, int msglen,
|
|
void *replybuf, int maxretbuflen, const int *forceMsgID=NULL,
|
|
const void *secondchunk=NULL, int secondchunklen=0, // allow sending two blocks as one message (for speed in certain instances)
|
|
WDL_HeapBuf *hbreplyout=NULL); // if hbreplyout is set it will get the full message (replybuf can be NULL then)
|
|
void Reply(int msgID, const void *msg, int msglen);
|
|
void Wait(HANDLE extraEvt=NULL);
|
|
|
|
const char *GetUniqueString() { return m_uniq; }
|
|
|
|
void ReturnSpares(WaitingMessage *msglist);
|
|
|
|
private:
|
|
bool RunInternal(int checkForReplyID=0, WaitingMessage **replyPtr=0); // nonzero on error
|
|
|
|
char m_uniq[256];
|
|
WDL_Mutex m_shmmutex;
|
|
WDL_SHM_Connection *m_shm;
|
|
|
|
|
|
WaitingMessage *m_waiting_replies;
|
|
WaitingMessage *m_spares;
|
|
|
|
int m_lastmsgid;
|
|
int m_maxqueuesize;
|
|
bool m_has_had_error;
|
|
};
|
|
|
|
#endif
|