Files
assaultcube-/source/src/packetqueue.cpp
T
ac-stef 5cf4c8d61d rewrite ringbuf
to use own pointers for reading and writing

broken find() removed
2017-05-24 11:08:36 +02:00

60 lines
1.4 KiB
C++

// supports buffering Enet packets for logging purposes
#include "cube.h"
packetqueue::packetqueue()
{
}
packetqueue::~packetqueue()
{
clear();
}
// adds packet to log buffer
void packetqueue::queue(ENetPacket *p)
{
if(packets.length() >= packets.maxsize()) enet_packet_destroy(packets.remove());
packets.add(p);
}
// writes all currently queued packets to disk and clears the queue
bool packetqueue::flushtolog(const char *logfile)
{
if(packets.empty()) return false;
stream *f = NULL;
if(logfile && logfile[0]) f = openfile(logfile, "w");
if(!f) return false;
// header
f->printf("AC v%d PACKET LOG : proto %d : @ %11s\n", AC_VERSION, PROTOCOL_VERSION, numtime());
// serialize each packet
loopv(packets)
{
ENetPacket *p = packets[i];
f->printf("\nENET PACKET\n");
f->printf("flags == %d\n", p->flags);
f->printf("referenceCount == %d\n", (int)p->referenceCount);
f->printf("dataLength == %d\n", (int)p->dataLength);
f->printf("data == \n");
// print whole buffer char-wise
loopj(p->dataLength)
{
f->printf("%6d 0x%02x '%c'\n", p->data[j], p->data[j], isprint(p->data[j]) ? p->data[j] : '-');
}
}
delete f;
clear();
return true;
}
// clear queue
void packetqueue::clear()
{
while(!packets.empty()) enet_packet_destroy(packets.remove());
}