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);
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 std::vector<double> tmp;
229 for (
int i = 0; i < len; i++)
244 writeInt(
static_cast<int>(s.size()));
245 for (std::vector<std::string>::const_iterator it = s.begin(); it!=s.end() ; it++)
259 writeInt(
static_cast<int>(s.size()));
260 for (std::vector<double>::const_iterator it = s.begin(); it!=s.end() ; it++)
278 unsigned char *p_value =
reinterpret_cast<unsigned char*
>(&value);
287 if (value < -32768 || value > 32767)
289 throw std::invalid_argument(
"Storage::writeShort(): Invalid value, not in [-32768, 32767]");
292 short svalue =
static_cast<short>(value);
293 unsigned char *p_svalue =
reinterpret_cast<unsigned char*
>(&svalue);
309 unsigned char *p_value =
reinterpret_cast<unsigned char*
>(&value);
318 unsigned char *p_value =
reinterpret_cast<unsigned char*
>(&value);
334 unsigned char *p_value =
reinterpret_cast<unsigned char*
>(&value);
343 unsigned char *p_value =
reinterpret_cast<unsigned char*
>(&value);
351 unsigned char *p_value =
reinterpret_cast<unsigned char*
>(&value);
360 unsigned char *p_value =
reinterpret_cast<unsigned char*
>(&value);
369 store.insert(
store.end(), &(packet[0]), &(packet[length]));
377 std::copy(packet.begin(), packet.end(), std::back_inserter(
store));
394 if (std::distance(
iter_,
store.end()) <
static_cast<int>(num))
396 std::ostringstream msg;
397 msg <<
"tcpip::Storage::readIsSafe: want to read " << num <<
" bytes from Storage, "
398 <<
"but only " << std::distance(
iter_,
store.end()) <<
" remaining";
399 throw std::invalid_argument(msg.str());
420 store.insert(
store.end(), std::reverse_iterator<const unsigned char *>(
end), std::reverse_iterator<const unsigned char *>(
begin));
431 for (
int i = 0; i <
size; ++i)
436 for (
int i =
size - 1; i >= 0; --i)
445 static const int width = 2;
447 std::ostringstream dump;
450 dump.setf(std::ostream::hex | std::ostream::showbase | std::ostream::internal);
453 for(StorageType::const_iterator it =
store.begin(); it !=
store.end(); ++it)
456 if (it !=
store.begin())
458 dump << std::setw(width) << static_cast<int>(*it);
virtual void writePacket(unsigned char *packet, int length)
StorageType::const_iterator begin() const
virtual void writeFloat(float)
virtual unsigned char readChar()
virtual std::string readString()
virtual void writeString(const std::string &s)
virtual float readFloat()
virtual unsigned int position() const
virtual void writeInt(int)
StorageType::const_iterator end() const
virtual void writeDouble(double)
virtual int readUnsignedByte()
virtual void writeStringList(const std::vector< std::string > &s)
virtual void writeChar(unsigned char)
StorageType::const_iterator iter_
virtual void writeUnsignedByte(int)
StorageType::size_type size() const
virtual void writeDoubleList(const std::vector< double > &s)
unsigned char readCharUnsafe()
Read a byte without validity check.
std::string hexDump() const
Dump storage content as series of hex values.
void writeByEndianess(const unsigned char *begin, unsigned int size)
Write size elements of array begin according to endianess.
Storage()
Standard Constructor.
virtual void writeByte(int)
virtual void writeStorage(tcpip::Storage &store)
void readByEndianess(unsigned char *array, int size)
Read size elements into array according to endianess.
virtual std::vector< std::string > readStringList()
virtual void writeShort(int)
void checkReadSafe(unsigned int num) const
Check if the next num bytes can be read safely.
void init()
Used in constructors to initialize local variables.
virtual double readDouble()
virtual std::vector< double > readDoubleList()