#pragma once
#include <config.h>
#ifdef SHAWN
#include <shawn_config.h>
#include "_apps_enable_cmake.h"
#ifdef ENABLE_TCPIP
#define BUILD_TCPIP
#endif
#else
#define BUILD_TCPIP
#endif
#ifdef BUILD_TCPIP
#include <vector>
#include <string>
#include <stdexcept>
#include <iostream>
namespace tcpip
{
class Storage
{
public:
typedef std::vector<unsigned char> StorageType;
private:
StorageType store;
StorageType::const_iterator iter_;
bool bigEndian_;
void init();
void checkReadSafe(unsigned int num) const;
unsigned char readCharUnsafe();
void writeByEndianess(const unsigned char * begin, unsigned int size);
void readByEndianess(unsigned char * array, int size);
public:
Storage();
Storage(const unsigned char[], int length=-1);
virtual ~Storage();
virtual bool valid_pos();
virtual unsigned int position() const;
void reset();
void resetPos();
std::string hexDump() const;
virtual unsigned char readChar();
virtual void writeChar(unsigned char);
virtual int readByte();
virtual void writeByte(int);
virtual int readUnsignedByte();
virtual void writeUnsignedByte(int);
virtual std::string readString();
virtual void writeString(const std::string& s);
virtual std::vector<std::string> readStringList();
virtual void writeStringList(const std::vector<std::string> &s);
virtual std::vector<double> readDoubleList();
virtual void writeDoubleList(const std::vector<double> &s);
virtual int readShort();
virtual void writeShort(int);
virtual int readInt();
virtual void writeInt(int);
virtual float readFloat();
virtual void writeFloat( float );
virtual double readDouble();
virtual void writeDouble( double );
virtual void writePacket(unsigned char* packet, int length);
virtual void writePacket(const std::vector<unsigned char> &packet);
virtual void writeStorage(tcpip::Storage& store);
StorageType::size_type size() const { return store.size(); }
StorageType::const_iterator begin() const { return store.begin(); }
StorageType::const_iterator end() const { return store.end(); }
Storage& operator=(const Storage&) = delete;
};
}
#endif