00001 #include <stdio.h>
00002 #include <string.h>
00003 #include <malloc.h>
00004 #include <arpa/inet.h>
00005 #include "tools/log.h"
00006 #include "net/packet.h"
00007
00008 Packet::Packet()
00009 {
00010 buf = NULL;
00011 buf_len = 0;
00012 read_off = 0;
00013 }
00014
00015 Packet::Packet(const char* raw)
00016 {
00017 buf_len = ntohl(*(unsigned int*)raw);
00018 buf_len -= 4;
00019 buf = (char*)malloc(buf_len);
00020 memcpy(buf, raw + 4, buf_len);
00021 read_off = 0;
00022 }
00023
00024 Packet::~Packet()
00025 {
00026 if(buf)
00027 free(buf);
00028 }
00029
00030 void Packet::Push(const char* _buf, unsigned int _len)
00031 {
00032 Push(_len);
00033
00034 if(_len)
00035 {
00036 buf = (char*) realloc(buf, buf_len + _len);
00037 memcpy(buf + buf_len, _buf, _len);
00038 buf_len += _len;
00039 }
00040 }
00041
00042 void Packet::Push(std::string str)
00043 {
00044 Push(str.c_str(), str.size() + 1);
00045 }
00046
00047 void Packet::Push(int nbr)
00048 {
00049 int nbr_endian = htonl(nbr);
00050 buf = (char*) realloc(buf, buf_len + sizeof(int));
00051 memcpy(buf + buf_len, &nbr_endian, sizeof(int));
00052 buf_len += sizeof(int);
00053 }
00054
00055 void Packet::Push(unsigned int nbr)
00056 {
00057 unsigned int nbr_endian = htonl(nbr);
00058 buf = (char*) realloc(buf, buf_len + sizeof(unsigned int));
00059 memcpy(buf + buf_len, &nbr_endian, sizeof(unsigned int));
00060 buf_len += sizeof(unsigned int);
00061 }
00062
00063 void Packet::Push(long nbr)
00064 {
00065 long nbr_endian = htonl(nbr);
00066 buf = (char*) realloc(buf, buf_len + sizeof(long));
00067 memcpy(buf + buf_len, &nbr_endian, sizeof(long));
00068 buf_len += sizeof(long);
00069 }
00070
00071 void Packet::Push(unsigned long nbr)
00072 {
00073 unsigned long nbr_endian = htonl(nbr);
00074 buf = (char*) realloc(buf, buf_len + sizeof(unsigned long));
00075 memcpy(buf + buf_len, &nbr_endian, sizeof(unsigned long));
00076 buf_len += sizeof(unsigned long);
00077 }
00078
00079 char* Packet::PopBin(unsigned int& _len)
00080 {
00081 if(!buf)
00082 {
00083 log(LogError, "Empty packet while trying to read binary data");
00084 return NULL;
00085 }
00086
00087 _len = PopUInt();
00088
00089 if(_len)
00090 {
00091 if(_len > buf_len - read_off)
00092 {
00093 log(LogError, "Invalid packet received");
00094 return NULL;
00095 }
00096 char* _buf = (char*)malloc(_len);
00097 memcpy(_buf, buf + read_off, _len);
00098 read_off += _len;
00099 return _buf;
00100 }
00101 return NULL;
00102 }
00103
00104 std::string Packet::PopString()
00105 {
00106 if(!buf)
00107 {
00108 log(LogError, "Empty packet while trying to read a string");
00109 return "";
00110 }
00111
00112 unsigned int str_len = PopUInt();
00113
00114 if(str_len > buf_len - read_off)
00115 {
00116 log(LogError, "Invalid packet received");
00117 return "";
00118 }
00119
00120 if(str_len == 0)
00121 return "";
00122
00123 std::string str(buf + read_off, str_len - 1);
00124 read_off += str_len;
00125 return str;
00126 }
00127
00128 int Packet::PopInt()
00129 {
00130 if(!buf)
00131 {
00132 log(LogError, "Empty packet while trying to read an integer");
00133 return 0;
00134 }
00135
00136 if(sizeof(int) > buf_len - read_off)
00137 {
00138 log(LogError, "Invalid packet received");
00139 return 0;
00140 }
00141
00142 int tmp = *(int*)(buf + read_off);
00143 read_off += sizeof(int);
00144 return ntohl(tmp);
00145 }
00146
00147 unsigned int Packet::PopUInt()
00148 {
00149 if(!buf)
00150 {
00151 log(LogError, "Empty packet while trying to read an unsigned integer");
00152 return 0;
00153 }
00154
00155 if(sizeof(unsigned int) > buf_len - read_off)
00156 {
00157 log(LogError, "Invalid packet received");
00158 return 0;
00159 }
00160
00161 unsigned int tmp = *(unsigned int*)(buf + read_off);
00162 read_off += sizeof(unsigned int);
00163 return ntohl(tmp);
00164 }
00165
00166 long Packet::PopLong()
00167 {
00168 if(!buf)
00169 {
00170 log(LogError, "Empty packet while trying to read a long");
00171 return 0;
00172 }
00173
00174 if(sizeof(long) > buf_len - read_off)
00175 {
00176 log(LogError, "Invalid packet received");
00177 return 0;
00178 }
00179
00180 long tmp = *(long*)(buf + read_off);
00181 read_off += sizeof(long);
00182 return ntohl(tmp);
00183 }
00184
00185 unsigned long Packet::PopULong()
00186 {
00187 if(!buf)
00188 {
00189 log(LogError, "Empty packet while trying to read a unsigned long");
00190 return 0;
00191 }
00192
00193 if(sizeof(unsigned long) > buf_len - read_off)
00194 {
00195 log(LogError, "Invalid packet received");
00196 return 0;
00197 }
00198
00199 unsigned long tmp = *(unsigned long*)(buf + read_off);
00200 read_off += sizeof(unsigned long);
00201 return ntohl(tmp);
00202 }
00203
00204 void Packet::DumpRaw(char* & pckt, unsigned int & len)
00205 {
00206 len = buf_len + 4;
00207 pckt = (char*) malloc(len);
00208 *(unsigned int*)pckt = (unsigned int)htonl(len);
00209 memcpy(pckt + 4, buf, buf_len);
00210 }