16 #include "msgio/msg_p.h" 18 #include <gwenhywfar/error.h> 19 #include <gwenhywfar/misc.h> 20 #include <gwenhywfar/debug.h> 21 #include <gwenhywfar/text.h> 24 #define GWEN_MSG_SIZE_STEP 4096 25 #define GWEN_MSG_SIZE_MASK (~4095) 42 msg->buffer=(uint8_t*) malloc(bufferSize);
43 msg->maxSize=bufferSize;
56 memmove(msg->buffer, ptr, len);
57 msg->bytesInBuffer=len;
68 if (msg && msg->refCount>0)
76 if (msg && msg->refCount>0) {
77 if (msg->refCount==1) {
93 if (srcMsg && srcMsg->refCount>0) {
98 memmove(msg->buffer, srcMsg->buffer, msg->maxSize);
99 msg->bytesInBuffer=srcMsg->bytesInBuffer;
100 msg->currentPos=srcMsg->currentPos;
101 msg->groupId=srcMsg->groupId;
102 msg->parsedPayloadSize=srcMsg->parsedPayloadSize;
103 msg->parsedPayloadOffset=srcMsg->parsedPayloadOffset;
104 msg->flags=srcMsg->flags;
105 if (srcMsg->dbParsedInfo)
124 msg->groupId=groupId;
150 return msg->bytesInBuffer;
159 if (msg && i<=msg->maxSize)
160 msg->bytesInBuffer=i;
167 return msg?(msg->maxSize):0;
175 return msg->currentPos;
194 newPos=msg->currentPos+bufferLen;
195 if (newPos>=msg->maxSize) {
201 newPtr=realloc(msg->buffer, newSize);
207 msg->maxSize=newSize;
210 memmove(msg->buffer+msg->currentPos, bufferPtr, bufferLen);
211 msg->currentPos+=bufferLen;
212 msg->bytesInBuffer+=bufferLen;
223 if ((msg->currentPos<msg->maxSize) &&
224 (msg->currentPos<msg->bytesInBuffer)) {
225 return ((
int)(msg->buffer[(msg->currentPos)++])) & 0xff;
236 if (((msg->currentPos+i)<=msg->maxSize) &&
237 ((msg->currentPos+i)<=msg->bytesInBuffer)) {
261 return msg->bytesInBuffer-msg->currentPos;
270 return msg->parsedPayloadSize;
279 msg->parsedPayloadSize=v;
287 return msg->parsedPayloadOffset;
296 msg->parsedPayloadOffset=v;
337 return msg->dbParsedInfo;
346 if (msg->dbParsedInfo)
348 msg->dbParsedInfo=db;
357 if (msg->bytesInBuffer>=offs+8) {
361 ptr=msg->buffer+offs;
362 v=(uint64_t)(*(ptr++));
363 v|=(uint64_t)(*(ptr++))<<8;
364 v|=(uint64_t)(*(ptr++))<<16;
365 v|=(uint64_t)(*(ptr++))<<24;
366 v|=(uint64_t)(*(ptr++))<<32;
367 v|=(uint64_t)(*(ptr++))<<40;
368 v|=(uint64_t)(*(ptr++))<<48;
369 v|=(uint64_t)(*(ptr++))<<56;
381 if (msg->bytesInBuffer>=offs+4) {
384 ptr=msg->buffer+offs;
385 return (uint32_t)(ptr[0])+(ptr[1]<<8)+(ptr[2]<<16)+(ptr[3]<<24);
396 if (msg->bytesInBuffer>=offs+2) {
399 ptr=msg->buffer+offs;
400 return (uint16_t)(ptr[0])+(ptr[1]<<8);
411 if (msg->bytesInBuffer>=offs+1) {
414 ptr=msg->buffer+offs;
426 msg->bytesInBuffer, msg->maxSize, msg->currentPos);
427 if (msg->buffer && msg->bytesInBuffer) {
#define DBG_ERROR(dbg_logger, format,...)
void GWEN_Msg_AddFlags(GWEN_MSG *msg, uint32_t f)
int GWEN_Msg_IncCurrentPos(GWEN_MSG *msg, uint32_t i)
struct GWEN_DB_NODE GWEN_DB_NODE
#define GWEN_INHERIT_FINI(t, element)
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
GWEN_MSG * GWEN_Msg_dup(const GWEN_MSG *srcMsg)
int GWEN_Msg_GetRemainingBytes(const GWEN_MSG *msg)
uint32_t GWEN_Msg_GetMaxSize(const GWEN_MSG *msg)
void GWEN_Msg_free(GWEN_MSG *msg)
int GWEN_Msg_AddBytes(GWEN_MSG *msg, const uint8_t *bufferPtr, uint32_t bufferLen)
#define GWEN_FREE_OBJECT(varname)
uint32_t GWEN_Msg_GetFlags(const GWEN_MSG *msg)
uint32_t GWEN_Msg_GetBytesInBuffer(const GWEN_MSG *msg)
void GWEN_Msg_SetGroupId(GWEN_MSG *msg, int groupId)
int GWEN_Msg_RewindCurrentPos(GWEN_MSG *msg)
#define GWEN_MSG_SIZE_STEP
int GWEN_Msg_AddByte(GWEN_MSG *msg, uint8_t b)
GWEN_MSG * GWEN_Msg_new(uint32_t bufferSize)
void GWEN_Msg_SetFlags(GWEN_MSG *msg, uint32_t f)
void GWEN_Text_DumpString2Buffer(const char *s, unsigned int l, GWEN_BUFFER *mbuf, unsigned int insert)
#define GWEN_NEW_OBJECT(typ, varname)
uint32_t GWEN_Msg_GetParsedPayloadOffset(const GWEN_MSG *msg)
void GWEN_Msg_SetParsedPayloadSize(GWEN_MSG *msg, uint32_t v)
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
#define GWEN_ERROR_GENERIC
uint16_t GWEN_Msg_GetUint16At(const GWEN_MSG *msg, int offs, uint16_t defaultValue)
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
GWEN_DB_NODE * GWEN_DB_Group_dup(const GWEN_DB_NODE *n)
uint32_t GWEN_Msg_GetUint32At(const GWEN_MSG *msg, int offs, uint32_t defaultValue)
#define GWEN_INHERIT_INIT(t, element)
int GWEN_Msg_GetGroupId(const GWEN_MSG *msg)
uint32_t GWEN_Msg_GetCurrentPos(const GWEN_MSG *msg)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
void GWEN_Msg_Attach(GWEN_MSG *msg)
void GWEN_Msg_SetDbParsedInfo(GWEN_MSG *msg, GWEN_DB_NODE *db)
void GWEN_Msg_Dump(const GWEN_MSG *msg, GWEN_BUFFER *buf)
void GWEN_Msg_SetParsedPayloadOffset(GWEN_MSG *msg, uint32_t v)
uint64_t GWEN_Msg_GetUint64At(const GWEN_MSG *msg, int offs, uint64_t defaultValue)
#define GWEN_LIST_INIT(t, element)
int GWEN_Msg_ReadNextByte(GWEN_MSG *msg)
uint8_t GWEN_Msg_GetUint8At(const GWEN_MSG *msg, int offs, uint8_t defaultValue)
GWEN_DB_NODE * GWEN_Msg_GetDbParsedInfo(const GWEN_MSG *msg)
void GWEN_Msg_SetBytesInBuffer(GWEN_MSG *msg, uint32_t i)
#define GWEN_LIST_FUNCTIONS(t, pr)
#define DBG_INFO(dbg_logger, format,...)
uint32_t GWEN_Msg_GetParsedPayloadSize(const GWEN_MSG *msg)
void GWEN_Msg_DelFlags(GWEN_MSG *msg, uint32_t f)
uint8_t * GWEN_Msg_GetBuffer(GWEN_MSG *msg)
#define GWEN_LIST_FINI(t, element)
#define GWEN_INHERIT_FUNCTIONS(t)
#define GWEN_ERROR_MEMORY_FULL
const uint8_t * GWEN_Msg_GetConstBuffer(const GWEN_MSG *msg)
#define GWEN_MSG_SIZE_MASK
GWEN_MSG * GWEN_Msg_fromBytes(const uint8_t *ptr, uint32_t len)