added packetqueue implementation (sample commit)

git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@3831 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
driAn
2008-12-02 21:00:41 +00:00
parent 46325eca7d
commit 73bffe10b4
2 changed files with 69 additions and 1 deletions
+65
View File
@@ -0,0 +1,65 @@
// supports buffering Enet packets for logging purposes
#include "pch.h"
#include "cube.h"
packetqueue::packetqueue(size_t size)
{
queuesize = size;
}
packetqueue::~packetqueue()
{
clear();
}
// adds packet to log buffer
void packetqueue::queue(ENetPacket &p)
{
// add to back
pqueue.push(p);
// drop oldest packet to fit size
if(pqueue.size() > queuesize) pqueue.pop();
}
// writes all currently queued packets to disk and clears the queue
bool packetqueue::flushtolog(char *logfile )
{
if(pqueue.empty()) return false;
FILE *f = NULL;
if(logfile && logfile[0]) f = openfile(logfile, "w");
if(!f) return false;
// header
fprintf(f, "AC PACKET LOG %11d\n\n", now_utc);
// serialize each packet
while(!pqueue.empty())
{
ENetPacket packet = pqueue.front();
fputs("ENET PACKET\n", f);
fprintf(f, "flags == %d\n", packet.flags);
fprintf(f, "referenceCount == %d\n", packet.referenceCount);
fprintf(f, "dataLength == %d\n", packet.dataLength);
fputs("data == \n", f);
// print whole buffer char-wise
loopi(packet.dataLength)
{
fprintf(f, "%16d\n", packet.data[i]);
}
pqueue.pop();
}
fclose(f);
clear();
return true;
}
// clear queue
void packetqueue::clear()
{
while(!pqueue.empty()) pqueue.pop();
}