mSize(size),
mR(0),
mW(0),
+ mOriginalW(0),
mBoolR(0),
mBoolW(0),
mBoolNumR(0),
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");
}
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)
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;
}
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);
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;
}
// 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;
}
// 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;
}
}
if (!mBuffer) return 0;
}
- memcpy(&mBuffer[mW], bytes, nBytes);
+ memcpy(mBuffer + mW, bytes, nBytes);
mW += nBytes;
return nBytes;
}
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);
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;
}
{
// 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;
}
{
// 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;
}
size_t Packet::read(void* bytes, size_t size)
{
size_t nBytes = std::min(size, mW - mR);
- memcpy(bytes, &mBuffer[mR], nBytes);
+ memcpy(bytes, mBuffer + mR, nBytes);
mR += nBytes;
return nBytes;
}
}
+void Packet::reset()
+{
+ mR = 0;
+ mW = mOriginalW;
+ mBoolR = 0;
+ mBoolW = 0;
+ mBoolNumR = 0;
+ mBoolNumW = 0;
+}
+
+
} // namespace Mf