1 // supports buffering Enet packets for logging purposes
2 
3 #include "cube.h"
4 
packetqueue()5 packetqueue::packetqueue()
6 {
7 }
8 
~packetqueue()9 packetqueue::~packetqueue()
10 {
11     clear();
12 }
13 
14 // adds packet to log buffer
queue(ENetPacket * p)15 void packetqueue::queue(ENetPacket *p)
16 {
17     if(packets.length() >= packets.maxsize()) enet_packet_destroy(packets.remove());
18     packets.add(p);
19 }
20 
21 // writes all currently queued packets to disk and clears the queue
flushtolog(const char * logfile)22 bool packetqueue::flushtolog(const char *logfile)
23 {
24     if(packets.empty()) return false;
25 
26     stream *f = NULL;
27     if(logfile && logfile[0]) f = openfile(logfile, "w");
28     if(!f) return false;
29 
30     // header
31     f->printf("AC v%d PACKET LOG : proto %d : @ %11s\n\n", AC_VERSION, PROTOCOL_VERSION, numtime());
32     // serialize each packet
33     loopv(packets)
34     {
35         ENetPacket *p = packets[i];
36 
37         f->printf("ENET PACKET\n");
38         f->printf("flags == %d\n", p->flags);
39         f->printf("referenceCount == %d\n", (int)p->referenceCount);
40         f->printf("dataLength == %d\n", (int)p->dataLength);
41         f->printf("data == \n");
42         // print whole buffer char-wise
43         loopj(p->dataLength)
44         {
45             f->printf("%16d\n", p->data[j]);
46         }
47     }
48 
49     delete f;
50     clear();
51     return true;
52 }
53 
54 // clear queue
clear()55 void packetqueue::clear()
56 {
57     loopv(packets) enet_packet_destroy(packets[i]);
58     packets.clear();
59 }
60 
61