185 lines
3.9 KiB
C++
185 lines
3.9 KiB
C++
|
|
#include <netinet/in.h>
|
|
|
|
#include "message.h"
|
|
|
|
#define DEBUG_INPUT 0
|
|
#define DEBUG_OUTPUT 0
|
|
|
|
Message::Message(const Message & original){
|
|
printf("Message::Message -- copy\n");
|
|
|
|
_size = original._size;
|
|
_raw = new char[_size];
|
|
memcpy(_raw, original._raw, _size);
|
|
|
|
_data_size = original._data_size;
|
|
_data = new char[_data_size];
|
|
memcpy(_data, original._data, _data_size);
|
|
|
|
_type = original._type;
|
|
|
|
_stamp = new TimeStamp(*(original._stamp));
|
|
|
|
}
|
|
|
|
Message::Message(void * data, int len) {
|
|
_raw = new char[len];
|
|
memcpy(_raw, data, len);
|
|
_size = len;
|
|
|
|
if (DEBUG_INPUT)
|
|
printf("Message::Message(void* , int) -- length %d\n",len);
|
|
|
|
int index = 0;
|
|
// découper le type
|
|
_type = (Protocol::Type)(_raw[index]);
|
|
index += 1;
|
|
|
|
_stamp = new TimeStamp(_type, (_raw + index), len - index);
|
|
index += _stamp->getRawSize();
|
|
|
|
// initialise message from the following data
|
|
_data_size = -1;
|
|
memcpy(&_data_size, (_raw + index), 2);
|
|
index += 2;
|
|
|
|
if (DEBUG_INPUT)
|
|
printf("Message::Message -- message length %d\n", _data_size);
|
|
|
|
_data = new char[_data_size];
|
|
memcpy(_data, (_raw+index), _data_size);
|
|
|
|
// if (DEBUG_INPUT)
|
|
// printf("Message::Message -- message data '%s'\n",_data); //FIXME (buffer overflow)
|
|
}
|
|
|
|
|
|
Message::Message(Protocol::Type type, TimeStamp ×tamp, char * mesg, short mesg_size) :
|
|
_type(type)
|
|
{
|
|
_data = new char[mesg_size];
|
|
_data_size = mesg_size;
|
|
strncpy(_data, mesg, _data_size);
|
|
|
|
_stamp = new TimeStamp(timestamp);
|
|
|
|
if (DEBUG_OUTPUT)
|
|
printf("Message::Message -- constructing from type, stamp, string\n");
|
|
|
|
// construire le message qui va bien a partir des parametres
|
|
unsigned char dgram_type;
|
|
unsigned int dgram_size;
|
|
char * dgram_stamp;
|
|
unsigned int dgram_type_idx;
|
|
unsigned int dgram_stamp_idx;
|
|
unsigned int dgram_messagesize_idx;
|
|
unsigned int dgram_messagedata_idx;
|
|
|
|
printf("Message::Message -- initialising\n");
|
|
|
|
dgram_type_idx = 0;
|
|
dgram_stamp_idx = 1;
|
|
|
|
if (DEBUG_OUTPUT)
|
|
printf("Message::Message -- computing message length\n");
|
|
|
|
dgram_messagesize_idx = dgram_stamp_idx + _stamp->getRawSize();
|
|
|
|
if (DEBUG_OUTPUT)
|
|
printf("Message::Message -- computing message length %d\n",dgram_messagesize_idx);
|
|
|
|
dgram_messagedata_idx = dgram_messagesize_idx + 2;
|
|
|
|
if (DEBUG_OUTPUT)
|
|
printf("Message::Message -- computing message length %d\n",dgram_messagedata_idx);
|
|
|
|
dgram_size = dgram_messagedata_idx + _data_size;
|
|
_size = dgram_size;
|
|
|
|
if (DEBUG_OUTPUT)
|
|
printf("Message::Message -- creating datagram (%d)\n", dgram_size);
|
|
|
|
// we create the dgram
|
|
if (_raw != NULL){ free(_raw); }
|
|
_raw = new char[dgram_size];
|
|
|
|
// fill the dgram with type
|
|
_raw[0] = _type;
|
|
|
|
// fill the dgram with timestamp
|
|
dgram_stamp = _stamp->getRaw();
|
|
memcpy((_raw + dgram_stamp_idx),
|
|
dgram_stamp, _stamp->getRawSize());
|
|
free(dgram_stamp);
|
|
|
|
// fill the dgram with message
|
|
short ds = htons(_data_size);
|
|
memcpy((_raw + dgram_messagesize_idx),
|
|
&ds,
|
|
2);
|
|
memcpy((_raw + dgram_messagedata_idx),
|
|
_data,
|
|
_data_size);
|
|
|
|
if (DEBUG_OUTPUT)
|
|
printf("Message::raw -- MESSAGE(%c,\n\t",type);
|
|
for (int i=0; i < _size; i++){
|
|
if (DEBUG_OUTPUT)
|
|
printf("%#x ", _raw[i]);
|
|
}
|
|
if (DEBUG_OUTPUT) printf(")\n");
|
|
|
|
}
|
|
|
|
|
|
char * Message::getRaw(){
|
|
char * result = new char[_size];
|
|
memcpy(result, _raw, _size);
|
|
|
|
printf("Message::getRaw -- hex: \n");
|
|
for (int i=0; i < _size; i++){
|
|
printf("%#x ", result[i]);
|
|
}
|
|
printf("\n");
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
size_t Message::getRawSize(){
|
|
printf("Message::getRawSize -- %d\n",_size);
|
|
return _size;
|
|
}
|
|
|
|
|
|
char * Message::getData(){
|
|
char * result = new char[_data_size];
|
|
memcpy(result, _data, _data_size);
|
|
|
|
return result;
|
|
}
|
|
|
|
short Message::getDataSize(){
|
|
return _data_size;
|
|
}
|
|
|
|
|
|
|
|
TimeStamp Message::getStamp(){
|
|
return *_stamp;
|
|
}
|
|
|
|
|
|
Protocol::Type Message::getType(){
|
|
return _type;
|
|
}
|
|
|
|
|
|
bool Message::operator==(Message &message) {
|
|
printf("Message::operator== -- \n");
|
|
return (message.getStamp() == this->getStamp());
|
|
}
|
|
|
|
#undef DEBUG_INPUT
|
|
#undef DEBUG_OUTPUT
|