/* * Copyright (C) 2007-2013 Xagasoft, All rights reserved. * * This file is part of the libgats library and is released under the * terms of the license contained in the file LICENSE. */ #ifndef GATS_OBJECT_H #define GATS_OBJECT_H #include namespace Bu { class Stream; class Formatter; }; namespace Gats { enum Type { typeDictionary, typeList, typeString, typeInteger, typeFloat, typeBoolean, typeNull }; /** * The baseclass for every type that can be stored in a packet. */ class Object { public: Object(); virtual ~Object(); virtual Type getType() const =0; virtual void write( Bu::Stream &rOut ) const=0; virtual void read( Bu::Stream &rIn, char cType )=0; virtual Object *clone() const=0; Bu::String toPacket(); static Object *fromPacket( const Bu::String &sData ); static Object *read( Bu::Stream &rIn ); static Object *strToGats( const Bu::String &sStr ); private: class StrPos { public: StrPos( const Bu::String::const_iterator &i ) : i( i ), iLine( 1 ), iChar( 1 ) { } Bu::String::const_iterator i; int iLine; int iChar; char operator*() { return *i; } StrPos &operator++(int) { i++; if( i ) { if( *i == '\n' ) { iLine++; iChar = 0; } else iChar++; } return *this; } operator bool() { return i; } }; class Thrower : public Bu::String::FormatProxyEndAction { public: Thrower( Gats::Object::StrPos &i ) : i( i ) { } virtual ~Thrower() { } virtual void operator()( const Bu::String &sFinal ) { throw Bu::ExceptionBase( (Bu::String("%1: %2: ").arg(i.iLine).arg(i.iChar).end() + sFinal) .getStr() ); } private: Gats::Object::StrPos &i; }; static Bu::String::FormatProxy posError( Gats::Object::StrPos &i, const Bu::String &msg ); static Object *strToGats( Gats::Object::StrPos &i ); static Bu::String token( Gats::Object::StrPos &i ); static void skipWs( Gats::Object::StrPos &i ); }; const char *typeToStr( Type t ); }; Bu::Formatter &operator<<( Bu::Formatter &f, const Gats::Object &obj ); Bu::Formatter &operator<<( Bu::Formatter &f, const Gats::Type &t ); #endif