/* * The Unix Channel * * by Michel Beaudouin-Lafon * * Copyright 1990-1997 * Laboratoire de Recherche en Informatique (LRI) * * Buffered streams * * $Id$ * $CurLog$ */ #include "BufStream.h" #include "error.h" /*? These constructors are similar to those of class \typ{UchSocket}. ?*/ UchBufStream :: UchBufStream (UchAddress* bindTo, UchAddress* connectTo) : UchStream (bindTo, connectTo), InBuffer (), OutBuffer (), OutSize (128), Sync (false) { } // *** this copy constructor might be automatically generated /*?nodoc?*/ UchBufStream :: UchBufStream (const UchBufStream& ms) : UchStream (ms), InBuffer (), OutBuffer (), OutSize (ms.OutSize), Sync (ms.Sync) { } /*?nodoc?*/ UchBufStream :: ~UchBufStream () { Flush (); InBuffer.Clear (); OutBuffer.Clear (); } /*?nextdoc?*/ void UchBufStream :: InputBuffer (int min, int grow, int max) { InBuffer.SetSizes (min, grow, max); } /*? Set the input and output buffer sizes. Default sizes are used if these functions are not called. ?*/ void UchBufStream :: OutputBuffer (int min, int grow, int max) { OutBuffer.SetSizes (min, grow, max); OutSize = max; } /*? Flush the output buffer. This function is called automatically when the buffer exceeds its flush size, or after each message when this stream is in synchronous mode. It is also called from \fun{Ask} to wait for the answer. ?*/ void UchBufStream :: Flush () { if (OutBuffer.BufLength () == 0) return; int n = Write (OutBuffer); OutBuffer.Flush (n); } /*?nodoc?*/ void UchBufStream :: HandleWrite () { Flush (); } // read stream into input buffer // delete the stream when an eof is received // return the number of bytes read // /*?hidden?*/ int UchBufStream :: ReadInput () { if (InBuffer.BufLength () == 0) InBuffer.NeedSize (128); int n = Read (InBuffer); if (n <= 0) { if (n == -2) { InBuffer.Grow (); n = Read (InBuffer); } if (n < 0) SysError (ErrWarn, "UchBufStream::ReadInput"); if (n <= 0) Closing (n < 0 ? false : true); } return n; } /*? This virtual function is called when an end of file is read, meaning that the communication is terminated. It is also called if an error occurs while reading. You can check the value of the global variable \var{errno}: if it is non zero, \fun{Closing} was called because of an error. % wrong By default this function does nothing. ?*/ void UchBufStream :: Closing (bool) { } void UchBufStream :: WriteLong (lword l) { OutBuffer << l; } void UchBufStream :: WriteShort (sword s) { OutBuffer << s; } void UchBufStream :: WriteByte (byte b) { OutBuffer << b; } void UchBufStream :: WriteChar (char c) { OutBuffer << c; } void UchBufStream :: WriteString (const char* s) { OutBuffer << s; } void UchBufStream :: WriteBuf (const byte* b, int n) { OutBuffer.WriteBuf (b, n); } bool UchBufStream :: ReadLong (lword& l) { return InBuffer.ReadLong (l); } bool UchBufStream :: ReadShort (sword& s) { return InBuffer.ReadShort (s); } bool UchBufStream :: ReadByte (byte& b) { return InBuffer.ReadByte (b); } bool UchBufStream :: ReadChar (char& c) { return InBuffer.ReadChar (c); } int UchBufStream :: ReadString (char* s, int n) { return InBuffer.ReadString (s, n); } int UchBufStream :: ReadString (CcuString& s) { return InBuffer.ReadString (s); } bool UchBufStream :: ReadBuf (byte* b, int n) { return InBuffer.ReadBuf (b, n); }