From 165e84b094a66497f19f02a7a9dc480712337986 Mon Sep 17 00:00:00 2001 From: chatty Date: Tue, 28 Nov 2000 17:07:44 +0000 Subject: * Created from bits of MsgStream.cc --- comm/BufStream.cc | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 comm/BufStream.cc diff --git a/comm/BufStream.cc b/comm/BufStream.cc new file mode 100644 index 0000000..d1ca25d --- /dev/null +++ b/comm/BufStream.cc @@ -0,0 +1,206 @@ +/* + * 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); +} + + -- cgit v1.1