2 * Copyright (c) 2017 Thomas Pornin <pornin@bolet.org>
4 * Permission is hereby granted, free of charge, to any person obtaining
5 * a copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sublicense, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 * This class merges two underlying streams (one for reading, the other
30 * for writing) into a single Stream object. It can also optionally dump
31 * all read and written bytes, in hexadecimal, on an provided text
32 * stream (for debugging purposes).
35 internal class MergeStream : Stream {
39 internal TextWriter Debug {
43 internal MergeStream(Stream subIn, Stream subOut)
49 public override int ReadByte()
51 int x = subIn.ReadByte();
54 Debug.WriteLine("recv:");
55 Debug.WriteLine(" {0:x2}", x);
57 Debug.WriteLine("recv: EOF");
63 public override int Read(byte[] buf, int off, int len)
65 int rlen = subIn.Read(buf, off, len);
68 Debug.WriteLine("recv: EOF");
71 for (int i = 0; i < rlen; i ++) {
75 } else if ((i & 7) == 0) {
80 Debug.Write("{0:x2}", buf[i]);
88 public override void WriteByte(byte x)
91 Debug.WriteLine("send:");
92 Debug.WriteLine(" {0:x2}", x);
97 public override void Write(byte[] buf, int off, int len)
100 Debug.Write("send:");
101 for (int i = 0; i < len; i ++) {
105 } else if ((i & 7) == 0) {
110 Debug.Write("{0:x2}", buf[i]);
114 subOut.Write(buf, off, len);
117 public override void Flush()
122 public override void Close()
124 Exception ex1 = null, ex2 = null;
127 } catch (Exception ex) {
132 } catch (Exception ex) {
137 } else if (ex1 != null) {
142 public override long Seek(long off, SeekOrigin origin)
144 throw new NotSupportedException();
147 public override void SetLength(long len)
149 throw new NotSupportedException();
152 public override bool CanRead {
154 return subIn.CanRead;
158 public override bool CanWrite {
160 return subOut.CanWrite;
164 public override bool CanSeek {
170 public override long Length {
172 throw new NotSupportedException();
176 public override long Position {
178 throw new NotSupportedException();
181 throw new NotSupportedException();