]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Packet.cc
exception-aware packets; other misc socket changes
[chaz/yoink] / src / Moof / Packet.cc
index 842d6c1d9e9406d89dcf488b61b5df6f8b0a8cb1..bb8fcc7b88bb9a2413526c9a40ab8164b0b7e7e7 100644 (file)
@@ -100,6 +100,7 @@ Packet::Packet(size_t size) :
        mSize(size),
        mR(0),
        mW(0),
+       mOriginalW(0),
        mBoolR(0),
        mBoolW(0),
        mBoolNumR(0),
@@ -110,12 +111,14 @@ Packet::Packet(const char* data, size_t size) :
        mSize(size),
        mR(0),
        mW(size),
+       mOriginalW(size),
        mBoolR(0),
        mBoolW(0),
        mBoolNumR(0),
        mBoolNumW(0)
 {
        if (mBuffer) memcpy(mBuffer, data, size);
+       else throw std::length_error("out of memory");
 }
 
 
@@ -124,12 +127,14 @@ Packet::Packet(const Packet& copy) :
        mSize(copy.mSize),
        mR(copy.mR),
        mW(copy.mW),
+       mOriginalW(copy.mOriginalW),
        mBoolR(copy.mBoolR),
        mBoolW(copy.mBoolW),
        mBoolNumR(copy.mBoolNumR),
        mBoolNumW(copy.mBoolNumW)
 {
        if (mBuffer) memcpy(mBuffer, copy.mBuffer, mSize);
+       else throw std::length_error("out of memory");
 }
 
 Packet& Packet::operator=(const Packet& copy)
@@ -140,11 +145,13 @@ Packet& Packet::operator=(const Packet& copy)
        mSize = copy.mSize;
        mR = copy.mR;
        mW = copy.mW;
+       mOriginalW = copy.mOriginalW;
        mBoolR = copy.mBoolR;
        mBoolW = copy.mBoolW;
        mBoolNumR = copy.mBoolNumR;
        mBoolNumW = copy.mBoolNumW;
        if (mBuffer) memcpy(mBuffer, copy.mBuffer, mSize);
+       else throw std::length_error("out of memory");
        return *this;
 }
 
@@ -163,7 +170,7 @@ Packet& Packet::operator<<(bool value)
                mBoolW = mW;
 
                unsigned char byte = 0;
-               if (write(&byte, 1) == 0) return *this;
+               if (write(&byte, 1) == 0) throw std::length_error("out of memory");
        }
 
        if (value) mBuffer[mBoolW] |= (1 << bit);
@@ -196,28 +203,40 @@ Packet& Packet::operator<<(int64_t value)
 
 Packet& Packet::operator<<(uint8_t value)
 {
-       write(&value, sizeof(value));
+       if (write(&value, sizeof(value)) != sizeof(value))
+       {
+               throw std::length_error("out of memory");
+       }
        return *this;
 }
 
 Packet& Packet::operator<<(uint16_t value)
 {
        value = htons(value);
-       write(&value, sizeof(value));
+       if (write(&value, sizeof(value)) != sizeof(value))
+       {
+               throw std::length_error("out of memory");
+       }
        return *this;
 }
 
 Packet& Packet::operator<<(uint32_t value)
 {
        value = htonl(value);
-       write(&value, sizeof(value));
+       if (write(&value, sizeof(value)) != sizeof(value))
+       {
+               throw std::length_error("out of memory");
+       }
        return *this;
 }
 
 Packet& Packet::operator<<(uint64_t value)
 {
        value = htonll(value);
-       write(&value, sizeof(value));
+       if (write(&value, sizeof(value)) != sizeof(value))
+       {
+               throw std::length_error("out of memory");
+       }
        return *this;
 }
 
@@ -226,7 +245,10 @@ Packet& Packet::operator<<(float value)
        // XXX: assumes the ieee-754
        uint32_t* integer = reinterpret_cast<uint32_t*>(&value);
        *integer = htonl(*integer);
-       write(integer, sizeof(value));
+       if (write(integer, sizeof(value)) != sizeof(value))
+       {
+               throw std::length_error("out of memory");
+       }
        return *this;
 }
 
@@ -235,7 +257,10 @@ Packet& Packet::operator<<(double value)
        // XXX: assumes the ieee-754
        uint64_t* integer = reinterpret_cast<uint64_t*>(&value);
        *integer = htonll(*integer);
-       write(integer, sizeof(value));
+       if (write(integer, sizeof(value)) != sizeof(value))
+       {
+               throw std::length_error("out of memory");
+       }
        return *this;
 }
 
@@ -269,7 +294,7 @@ Packet& Packet::operator>>(bool& value)
                mBoolR = mR;
 
                unsigned char byte = 0;
-               if (read(&byte, 1) == 0) return *this;
+               if (read(&byte, 1) == 0) throw std::out_of_range("end of packet");
        }
 
        value = 1 & (mBuffer[mBoolR] >> bit);
@@ -300,27 +325,39 @@ Packet& Packet::operator>>(int64_t& value)
 
 Packet& Packet::operator>>(uint8_t& value)
 {
-       read(&value, sizeof(value));
+       if (read(&value, sizeof(value)) != sizeof(value))
+       {
+               throw std::out_of_range("end of packet");
+       }
        return *this;
 }
 
 Packet& Packet::operator>>(uint16_t& value)
 {
-       read(&value, sizeof(value));
+       if (read(&value, sizeof(value)) != sizeof(value))
+       {
+               throw std::out_of_range("end of packet");
+       }
        value = ntohs(value);
        return *this;
 }
 
 Packet& Packet::operator>>(uint32_t& value)
 {
-       read(&value, sizeof(value));
+       if (read(&value, sizeof(value)) != sizeof(value))
+       {
+               throw std::out_of_range("end of packet");
+       }
        value = ntohl(value);
        return *this;
 }
 
 Packet& Packet::operator>>(uint64_t& value)
 {
-       read(&value, sizeof(value));
+       if (read(&value, sizeof(value)) != sizeof(value))
+       {
+               throw std::out_of_range("end of packet");
+       }
        value = ntohll(value);
        return *this;
 }
@@ -329,7 +366,10 @@ Packet& Packet::operator>>(float& value)
 {
        // XXX: assumes the ieee-754
        uint32_t* integer = reinterpret_cast<uint32_t*>(&value);
-       read(integer, sizeof(value));
+       if (read(integer, sizeof(value)) != sizeof(value))
+       {
+               throw std::out_of_range("end of packet");
+       }
        *integer = htonl(*integer);
        return *this;
 }
@@ -338,7 +378,10 @@ Packet& Packet::operator>>(double& value)
 {
        // XXX: assumes the ieee-754
        uint64_t* integer = reinterpret_cast<uint64_t*>(&value);
-       read(integer, sizeof(value));
+       if (read(integer, sizeof(value)) != sizeof(value))
+       {
+               throw std::out_of_range("end of packet");
+       }
        *integer = htonll(*integer);
        return *this;
 }
@@ -363,5 +406,16 @@ void Packet::clear()
 }
 
 
+void Packet::reset()
+{
+       mR = 0;
+       mW = mOriginalW;
+       mBoolR = 0;
+       mBoolW = 0;
+       mBoolNumR = 0;
+       mBoolNumW = 0;
+}
+
+
 } // namespace Mf
 
This page took 0.025474 seconds and 4 git commands to generate.