#ifndef GATS_STREAM_H #define GATS_STREAM_H #include #include namespace Gats { class Object; class GatsStream : public QObject { Q_OBJECT; public: GatsStream( QIODevice &rStream ); virtual ~GatsStream(); public slots: /** * 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(); /** * Works exactly like readObject, except it reads all pending objects * and emits a objectRead signal for each one read. It doesn't return * anything. This is perfect for connecting to a QIODevice's readRead * signal. */ void readAllObjects(); public: /** * 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.size() > 0; } int getReadBufferSize() { return qbRead.size(); } QIODevice &getIODevice() { return rStream; } signals: void objectRead( Gats::Object *pObj ); private: bool skipReadNulls(); private: QIODevice &rStream; QByteArray qbRead; }; }; #endif