/* * The Unix Channel * * by Michel Beaudouin-Lafon * * Copyright 1990-1997 * Laboratoire de Recherche en Informatique (LRI) * * Message streams * * $Id$ * $CurLog$ */ #ifndef MsgStream_H_ #define MsgStream_H_ #include "Stream.h" #include "ccu/SmartPointer.h" #include "MsgBuffer.h" class UchMessage; class UchBufStream : public UchStream { protected: UchMsgBuffer InBuffer; UchMsgBuffer OutBuffer; int OutSize; bool Sync; UchBufStream (const UchBufStream&); int ReadInput (); void HandleWrite (); void WriteLong (lword); void WriteShort (sword); void WriteByte (byte); void WriteChar (char); void WriteString (const char*); void WriteBuf (const byte*, int); bool ReadLong (lword&); bool ReadShort (sword&); bool ReadByte (byte&); bool ReadChar (char&); int ReadString (char*, int); int ReadString (CcuString&); bool ReadBuf (byte*, int); public: UchBufStream (UchAddress* = 0, UchAddress* = 0); ~UchBufStream (); void InputBuffer (int min, int grow, int max); void OutputBuffer (int min, int grow, int max); inline bool GetSyncMode () { return Sync; } inline void SetSyncMode (bool s) { Sync = s; Flush (); } inline void FlushSize (int n) { OutSize = n; } virtual void Flush (); virtual void Closing (bool); }; class UchMsgStream : public UchBufStream { protected: enum STATE { WAITING, GOT_TYPE, GOT_LENGTH, DONE}; enum TYPE { MSG = 1, ASK, ANS, SYNC, ASYNC, OK }; STATE State; bool BufferedMessages; UchMsgBuffer Buffered; bool WaitingReply; int InLength; byte InType; UchMessage* Process (UchMsgBuffer&, bool); UchMsgStream (const UchMsgStream&); void WriteMsg (UchMessage&); bool ReadMsg (UchMessage&); public: UchMsgStream (UchAddress* = 0, UchAddress* = 0); ~UchMsgStream (); void HandleRead (); virtual UchMessage* DecodeMessage (UchMsgBuffer&); virtual UchMessage* DecodeAnswer (UchMsgBuffer&); void Send (UchMessage&, bool = false); UchMessage* Ask (UchMessage&); void Reply (UchMessage&); void Send (UchMsgBuffer&, bool = false); }; #endif /* MsgStream_H_ */