]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Packet.cc
socket and packet copying
[chaz/yoink] / src / Moof / Packet.cc
index 62da00b17f98141d307573232c2d23ca07444fa8..6923e7cb06e5d4a507ec1d8cbe2064e784503a4b 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,28 +96,61 @@ namespace Mf {
        
 
 Packet::Packet(size_t size) :
+       mBuffer((char*)malloc(size)),
+       mSize(size),
        mR(0),
        mW(0),
        mBoolR(0),
        mBoolW(0),
        mBoolNumR(0),
-       mBoolNumW(0)
-{
-       mBuffer = boost::shared_array<char>(new char[size]);
-       mSize = size;
-}
+       mBoolNumW(0) {}
 
 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);
+       if (mBuffer) memcpy(mBuffer, data, size);
+}
+
+
+Packet::Packet(const Packet& copy) :
+       mBuffer((char*)malloc(copy.mSize)),
+       mSize(copy.mSize),
+       mR(copy.mR),
+       mW(copy.mW),
+       mBoolR(copy.mBoolR),
+       mBoolW(copy.mBoolW),
+       mBoolNumR(copy.mBoolNumR),
+       mBoolNumW(copy.mBoolNumW)
+{
+       if (mBuffer) memcpy(mBuffer, copy.mBuffer, mSize);
+}
+
+Packet& Packet::operator=(const Packet& copy)
+{
+       free(mBuffer);
+
+       mBuffer = (char*)malloc(copy.mSize);
+       mSize = copy.mSize;
+       mR = copy.mR;
+       mW = copy.mW;
+       mBoolR = copy.mBoolR;
+       mBoolW = copy.mBoolW;
+       mBoolNumR = copy.mBoolNumR;
+       mBoolNumW = copy.mBoolNumW;
+       return *this;
+}
+
+
+Packet::~Packet()
+{
+       free(mBuffer);
 }
 
 
@@ -207,6 +241,19 @@ 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 nPages = 1 + size / PAGE_SIZE;
+               int newSize = mSize + nPages * PAGE_SIZE;
+               char* newBuffer = (char*)realloc(mBuffer, newSize);
+               if (newBuffer)
+               {
+                       mBuffer = newBuffer;
+                       mSize = newSize;
+                       nBytes = size;
+               }
+               if (!mBuffer) return 0;
+       }
        memcpy(&mBuffer[mW], bytes, nBytes);
        mW += nBytes;
        return nBytes;
@@ -304,5 +351,16 @@ size_t Packet::read(void* bytes, size_t size)
 }
 
 
+void Packet::clear()
+{
+       mR = 0;
+       mW = 0;
+       mBoolR = 0;
+       mBoolW = 0;
+       mBoolNumR = 0;
+       mBoolNumW = 0;
+}
+
+
 } // namespace Mf
 
This page took 0.02263 seconds and 4 git commands to generate.