#ifndef GATS_STREAM_H #define GATS_STREAM_H #include #include namespace Gats { class Object; class GatsStream { public: GatsStream( Bu::Stream &rStream ); virtual ~GatsStream(); /** * Read an object packet from the assosiated stream. This will make * every effort to only read exactly enough data to describe one packet, * in case you want to do other things with your stream. It will * automatically skip NULL byte spacing between packets, which makes * a convinient padding method for encrypted data streams. Since * sizing information is available in the packet header exact amounts * of data can be read, however this function doesn't assume that it * can read the entire object in one operation. If it fails to read * a complete packet in one call, it will keep the data it's read so * far buffered and return NULL, ready for another attempt. You can * use the function hasReadBuffer() to deterimne if readObject() * has read part of an object packet or not. If readObject returns * non-null then hasReadBuffer should return false on it's next call. */ Gats::Object *readObject(); /** * Write an object */ void writeObject( Gats::Object *pObject ); /** * Tells you if there is data still in the read buffer, i.e. that a * packet is part way through being read. If readObject has returned * non-null in the most recent call, this should always be false. */ bool hasReadBuffer() { return qbRead.getSize() > 0; } int getReadBufferSize() { return qbRead.getSize(); } private: bool skipReadNulls(); private: Bu::Stream &rStream; Bu::QueueBuf qbRead; }; }; #endif