]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Packet.cc
resizable packets
[chaz/yoink] / src / Moof / Packet.cc
index 62da00b17f98141d307573232c2d23ca07444fa8..8862f29bc9ba918ef23fb4608d539681fbb4f90a 100644 (file)
@@ -15,6 +15,7 @@
 #if HAVE_BYTESWAP_H
 #include <byteswap.h>
 #endif
+#include <cstdlib>
 
 #if HAVE_ARPA_INET_H
 #include <arpa/inet.h>
@@ -95,6 +96,8 @@ namespace Mf {
        
 
 Packet::Packet(size_t size) :
+       mBuffer((char*)malloc(size)),
+       mSize(size),
        mR(0),
        mW(0),
        mBoolR(0),
@@ -102,21 +105,25 @@ Packet::Packet(size_t size) :
        mBoolNumR(0),
        mBoolNumW(0)
 {
-       mBuffer = boost::shared_array<char>(new char[size]);
-       mSize = size;
 }
 
 Packet::Packet(const char* data, size_t size) :
+       mBuffer((char*)malloc(size)),
+       mSize(size),
        mR(0),
+       mW(size),
        mBoolR(0),
        mBoolW(0),
        mBoolNumR(0),
        mBoolNumW(0)
 {
-       mBuffer = boost::shared_array<char>(new char[size]);
-       mSize = size;
-       mW = size;
-       memcpy(mBuffer.get(), data, mSize);
+       memcpy(mBuffer, data, size);
+}
+
+
+Packet::~Packet()
+{
+       free(mBuffer);
 }
 
 
@@ -207,6 +214,17 @@ Packet& Packet::operator<<(double value)
 size_t Packet::write(const void* bytes, size_t size)
 {
        size_t nBytes = std::min(size, mSize - mW);
+       if (!mBuffer || nBytes < size)
+       {
+               int numPages = 1 + size / PAGE_SIZE;
+               int newSize = mSize + numPages * PAGE_SIZE;
+               char* newBuffer = (char*)realloc(mBuffer, newSize);
+               if (newBuffer)
+               {
+                       mBuffer = newBuffer;
+                       mSize = newSize;
+               }
+       }
        memcpy(&mBuffer[mW], bytes, nBytes);
        mW += nBytes;
        return nBytes;
This page took 0.018858 seconds and 4 git commands to generate.