text: // 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());
  }
  
  