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>
22#include <gwenhywfar/endianfns.h>
25#define GWEN_MSG_SIZE_STEP 4096
26#define GWEN_MSG_SIZE_MASK (~4095)
46 msg->buffer=(uint8_t*) malloc(bufferSize);
47 msg->maxSize=bufferSize;
60 memmove(msg->buffer, ptr, len);
61 msg->bytesInBuffer=len;
72 if (msg && msg->refCount>0)
80 if (msg && msg->refCount>0) {
81 if (msg->refCount==1) {
97 if (srcMsg && srcMsg->refCount>0) {
102 memmove(msg->buffer, srcMsg->buffer, msg->maxSize);
103 msg->bytesInBuffer=srcMsg->bytesInBuffer;
104 msg->currentPos=srcMsg->currentPos;
105 msg->groupId=srcMsg->groupId;
106 msg->parsedPayloadSize=srcMsg->parsedPayloadSize;
107 msg->parsedPayloadOffset=srcMsg->parsedPayloadOffset;
108 msg->flags=srcMsg->flags;
109 if (srcMsg->dbParsedInfo)
128 msg->groupId=groupId;
154 return msg->bytesInBuffer;
163 if (msg && i<=msg->maxSize)
164 msg->bytesInBuffer=i;
171 return msg?(msg->maxSize):0;
179 return msg->currentPos;
199 newPos=msg->currentPos+bufferLen;
205 memmove(msg->buffer+msg->currentPos, bufferPtr, bufferLen);
206 msg->currentPos+=bufferLen;
207 msg->bytesInBuffer+=bufferLen;
226 uint64_t *ptr=(uint64_t*)(msg->buffer+pos);
247 uint32_t *ptr=(uint32_t*)(msg->buffer+pos);
268 uint16_t *ptr=(uint16_t*)(msg->buffer+pos);
289 uint8_t *ptr=(uint8_t*)(msg->buffer+pos);
301 if (msg && bufferPtr && bufferLen) {
310 uint8_t *ptr=(uint8_t*)(msg->buffer+pos);
311 memmove(ptr, bufferPtr, bufferLen);
332 msg->bytesInBuffer+=8;
353 msg->bytesInBuffer+=4;
374 msg->bytesInBuffer+=2;
395 msg->bytesInBuffer+=1;
419 for (i=0; i<len; i++)
443 for (i=0; i<len; i++)
458 if ((msg->currentPos<msg->maxSize) &&
459 (msg->currentPos<msg->bytesInBuffer)) {
460 return ((
int)(msg->buffer[(msg->currentPos)++])) & 0xff;
471 if (((msg->currentPos+i)<=msg->maxSize) &&
472 ((msg->currentPos+i)<=msg->bytesInBuffer)) {
496 return msg->bytesInBuffer-msg->currentPos;
505 return msg->parsedPayloadSize;
514 msg->parsedPayloadSize=v;
522 return msg->parsedPayloadOffset;
531 msg->parsedPayloadOffset=v;
572 return msg->dbParsedInfo;
581 if (msg->dbParsedInfo)
583 msg->dbParsedInfo=db;
592 if (msg->bytesInBuffer>=offs+8) {
593 const uint64_t *ptr=(uint64_t*)(msg->buffer+offs);
606 if (msg->bytesInBuffer>=offs+4) {
607 const uint32_t *ptr=(uint32_t*)(msg->buffer+offs);
620 if (msg->bytesInBuffer>=offs+2) {
621 const uint16_t *ptr=(uint16_t*)(msg->buffer+offs);
634 if (msg->bytesInBuffer>=offs+1) {
637 ptr=msg->buffer+offs;
649 msg->bytesInBuffer, msg->maxSize, msg->currentPos);
650 if (msg->buffer && msg->bytesInBuffer) {
661 if (newPos>=msg->maxSize) {
667 newPtr=realloc(msg->buffer, newSize);
672 memset(newPtr+msg->currentPos, 0, newSize-msg->maxSize);
674 msg->maxSize=newSize;
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
GWEN_DB_NODE * GWEN_DB_Group_dup(const GWEN_DB_NODE *n)
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
struct GWEN_DB_NODE GWEN_DB_NODE
#define DBG_INFO(dbg_logger, format,...)
#define DBG_ERROR(dbg_logger, format,...)
#define GWEN_ENDIAN_HTOLE32(x)
#define GWEN_ENDIAN_HTOLE16(x)
#define GWEN_ENDIAN_LE16TOH(x)
#define GWEN_ENDIAN_LE32TOH(x)
#define GWEN_ENDIAN_LE64TOH(x)
#define GWEN_ENDIAN_HTOLE64(x)
#define GWEN_ERROR_MEMORY_FULL
#define GWEN_ERROR_INVALID
#define GWEN_ERROR_GENERIC
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
#define GWEN_INHERIT_FUNCTIONS(t)
#define GWEN_INHERIT_INIT(t, element)
#define GWEN_INHERIT_FINI(t, element)
#define GWEN_LIST_FINI(t, element)
#define GWEN_LIST_FUNCTIONS(t, pr)
#define GWEN_LIST_INIT(t, element)
#define GWEN_FREE_OBJECT(varname)
#define GWEN_NEW_OBJECT(typ, varname)
uint8_t GWEN_Msg_GetUint8At(const GWEN_MSG *msg, int offs, uint8_t defaultValue)
uint32_t GWEN_Msg_GetCurrentPos(const GWEN_MSG *msg)
int GWEN_Msg_AddBytes(GWEN_MSG *msg, const uint8_t *bufferPtr, uint32_t bufferLen)
void GWEN_Msg_AddFlags(GWEN_MSG *msg, uint32_t f)
void GWEN_Msg_SetParsedPayloadSize(GWEN_MSG *msg, uint32_t v)
GWEN_MSG * GWEN_Msg_dup(const GWEN_MSG *srcMsg)
int GWEN_Msg_GetRemainingBytes(const GWEN_MSG *msg)
int GWEN_Msg_WriteBytesAt(GWEN_MSG *msg, uint32_t pos, const uint8_t *bufferPtr, uint32_t bufferLen)
void GWEN_Msg_Dump(const GWEN_MSG *msg, GWEN_BUFFER *buf)
uint32_t GWEN_Msg_GetMaxSize(const GWEN_MSG *msg)
int GWEN_Msg_IncCurrentPos(GWEN_MSG *msg, uint32_t i)
void GWEN_Msg_SetParsedPayloadOffset(GWEN_MSG *msg, uint32_t v)
uint64_t GWEN_Msg_GetUint64At(const GWEN_MSG *msg, int offs, uint64_t defaultValue)
int GWEN_Msg_AddString(GWEN_MSG *msg, const char *s, uint32_t maxSize, uint8_t filler)
void GWEN_Msg_DelFlags(GWEN_MSG *msg, uint32_t f)
static int _ensureWritePos(GWEN_MSG *msg, uint32_t newPos)
GWEN_DB_NODE * GWEN_Msg_GetDbParsedInfo(const GWEN_MSG *msg)
int GWEN_Msg_WriteUint64At(GWEN_MSG *msg, uint32_t pos, uint64_t v)
int GWEN_Msg_ReadNextByte(GWEN_MSG *msg)
void GWEN_Msg_SetFlags(GWEN_MSG *msg, uint32_t f)
uint32_t GWEN_Msg_GetParsedPayloadSize(const GWEN_MSG *msg)
uint16_t GWEN_Msg_GetUint16At(const GWEN_MSG *msg, int offs, uint16_t defaultValue)
#define GWEN_MSG_SIZE_MASK
int GWEN_Msg_WriteUint32At(GWEN_MSG *msg, uint32_t pos, uint32_t v)
#define GWEN_MSG_SIZE_STEP
void GWEN_Msg_SetDbParsedInfo(GWEN_MSG *msg, GWEN_DB_NODE *db)
int GWEN_Msg_AddUint8(GWEN_MSG *msg, uint8_t v)
void GWEN_Msg_Attach(GWEN_MSG *msg)
void GWEN_Msg_SetBytesInBuffer(GWEN_MSG *msg, uint32_t i)
int GWEN_Msg_WriteUint16At(GWEN_MSG *msg, uint32_t pos, uint16_t v)
int GWEN_Msg_WriteUint8At(GWEN_MSG *msg, uint32_t pos, uint8_t v)
uint32_t GWEN_Msg_GetFlags(const GWEN_MSG *msg)
void GWEN_Msg_SetGroupId(GWEN_MSG *msg, int groupId)
int GWEN_Msg_AddStringWithTrailingNull(GWEN_MSG *msg, const char *s, uint32_t maxSize, uint8_t filler)
uint32_t GWEN_Msg_GetParsedPayloadOffset(const GWEN_MSG *msg)
int GWEN_Msg_AddByte(GWEN_MSG *msg, uint8_t b)
uint32_t GWEN_Msg_GetBytesInBuffer(const GWEN_MSG *msg)
GWEN_MSG * GWEN_Msg_fromBytes(const uint8_t *ptr, uint32_t len)
int GWEN_Msg_GetGroupId(const GWEN_MSG *msg)
const uint8_t * GWEN_Msg_GetConstBuffer(const GWEN_MSG *msg)
int GWEN_Msg_AddUint32(GWEN_MSG *msg, uint32_t v)
int GWEN_Msg_AddUint64(GWEN_MSG *msg, uint64_t v)
uint32_t GWEN_Msg_GetUint32At(const GWEN_MSG *msg, int offs, uint32_t defaultValue)
uint8_t * GWEN_Msg_GetBuffer(GWEN_MSG *msg)
void GWEN_Msg_free(GWEN_MSG *msg)
GWEN_MSG * GWEN_Msg_new(uint32_t bufferSize)
int GWEN_Msg_AddUint16(GWEN_MSG *msg, uint16_t v)
int GWEN_Msg_RewindCurrentPos(GWEN_MSG *msg)
void GWEN_Text_DumpString2Buffer(const char *s, unsigned int l, GWEN_BUFFER *mbuf, unsigned int insert)