summaryrefslogtreecommitdiff
path: root/comm/BufStream.cc
diff options
context:
space:
mode:
authorchatty2000-11-28 17:07:44 +0000
committerchatty2000-11-28 17:07:44 +0000
commit165e84b094a66497f19f02a7a9dc480712337986 (patch)
tree5d566796ccd2a5cb4151602b2d7d53cf81bdc1d4 /comm/BufStream.cc
parente3e2e33f287e0cf7dbb230d1dfe149f6c418560b (diff)
downloadivy-league-165e84b094a66497f19f02a7a9dc480712337986.zip
ivy-league-165e84b094a66497f19f02a7a9dc480712337986.tar.gz
ivy-league-165e84b094a66497f19f02a7a9dc480712337986.tar.bz2
ivy-league-165e84b094a66497f19f02a7a9dc480712337986.tar.xz
* Created from bits of MsgStream.cc
Diffstat (limited to 'comm/BufStream.cc')
-rw-r--r--comm/BufStream.cc206
1 files changed, 206 insertions, 0 deletions
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);
+}
+
+