43 store.reserve(length);
45 for(
int i = 0; i < length; ++i)
store.push_back(packet[i]);
58 unsigned char *p_a =
reinterpret_cast<unsigned char*
>(&a);
80 return static_cast<unsigned int>(std::distance(
store.begin(),
iter_));
101 throw std::invalid_argument(
"Storage::readChar(): invalid position");
113 store.push_back(value);
125 int i =
static_cast<int>(
readChar());
126 if (i < 128)
return i;
127 else return (i - 256);
137 if (value < -128 || value > 127)
139 throw std::invalid_argument(
"Storage::writeByte(): Invalid value, not in [-128, 127]");
141 writeChar( static_cast<unsigned char>( (value+256) % 256 ) );
152 return static_cast<int>(
readChar());
162 if (value < 0 || value > 255)
164 throw std::invalid_argument(
"Storage::writeUnsignedByte(): Invalid value, not in [0, 255]");
166 writeChar( static_cast<unsigned char>( value ));
179 StorageType::const_iterator
end =
iter_;
180 std::advance(end, len);
181 const std::string tmp(
iter_, end);
194 writeInt(static_cast<int>(s.length()));
196 store.insert(
store.end(), s.begin(), s.end());
208 std::vector<std::string> tmp;
211 for (
int i = 0; i < len; i++)
226 writeInt(static_cast<int>(s.size()));
227 for (std::vector<std::string>::const_iterator it = s.begin(); it!=s.end() ; it++)
245 unsigned char *p_value =
reinterpret_cast<unsigned char*
>(&value);
254 if (value < -32768 || value > 32767)
256 throw std::invalid_argument(
"Storage::writeShort(): Invalid value, not in [-32768, 32767]");
259 short svalue =
static_cast<short>(value);
260 unsigned char *p_svalue =
reinterpret_cast<unsigned char*
>(&svalue);
276 unsigned char *p_value =
reinterpret_cast<unsigned char*
>(&value);
285 unsigned char *p_value =
reinterpret_cast<unsigned char*
>(&value);
301 unsigned char *p_value =
reinterpret_cast<unsigned char*
>(&value);
310 unsigned char *p_value =
reinterpret_cast<unsigned char*
>(&value);
318 unsigned char *p_value =
reinterpret_cast<unsigned char*
>(&value);
327 unsigned char *p_value =
reinterpret_cast<unsigned char*
>(&value);
336 store.insert(
store.end(), &(packet[0]), &(packet[length]));
344 std::copy(packet.begin(), packet.end(), std::back_inserter(
store));
354 iter_ =
store.begin();
361 if (std::distance(iter_,
store.end()) < static_cast<int>(num))
363 std::ostringstream msg;
364 msg <<
"tcpip::Storage::readIsSafe: want to read " << num <<
" bytes from Storage, " 365 <<
"but only " << std::distance(iter_,
store.end()) <<
" remaining";
366 throw std::invalid_argument(msg.str());
383 const unsigned char *
end = &(begin[
size]);
387 store.insert(
store.end(), std::reverse_iterator<const unsigned char *>(
end), std::reverse_iterator<const unsigned char *>(begin));
388 iter_ =
store.begin();
398 for (
int i = 0; i <
size; ++i)
403 for (
int i = size - 1; i >= 0; --i)
412 static const int width = 2;
414 std::ostringstream dump;
417 dump.setf(std::ostream::hex | std::ostream::showbase | std::ostream::internal);
420 for(StorageType::const_iterator it =
store.begin(); it !=
store.end(); ++it)
423 if (it !=
store.begin())
425 dump << std::setw(width) << static_cast<int>(*it);
433 #endif // BUILD_TCPIP
std::string hexDump() const
Dump storage content as series of hex values.
void init()
Used in constructors to initialize local variables.
StorageType::const_iterator end() const
virtual std::vector< std::string > readStringList()
virtual double readDouble()
virtual void writePacket(unsigned char *packet, int length)
virtual void writeUnsignedByte(int)
virtual unsigned char readChar()
virtual void writeInt(int)
void writeByEndianess(const unsigned char *begin, unsigned int size)
Write size elements of array begin according to endianess.
virtual int readUnsignedByte()
virtual void writeChar(unsigned char)
Storage()
Standard Constructor.
void readByEndianess(unsigned char *array, int size)
Read size elements into array according to endianess.
virtual void writeByte(int)
virtual void writeStringList(const std::vector< std::string > &s)
virtual void writeShort(int)
virtual std::string readString()
virtual unsigned int position() const
virtual void writeStorage(tcpip::Storage &store)
StorageType::size_type size() const
virtual void writeFloat(float)
virtual void writeString(const std::string &s)
StorageType::const_iterator iter_
unsigned char readCharUnsafe()
Read a byte without validity check.
virtual float readFloat()
StorageType::const_iterator begin() const
void checkReadSafe(unsigned int num) const
Check if the next num bytes can be read safely.
virtual void writeDouble(double)