[2117] | 1 | /* taken from:
|
---|
| 2 | * http://www.clevercomponents.com/articles/article017/multistreamcs.asp
|
---|
| 3 | * */
|
---|
| 4 |
|
---|
| 5 | using System;
|
---|
| 6 | using System.IO;
|
---|
| 7 | using System.Collections;
|
---|
| 8 |
|
---|
| 9 | namespace HeuristicLab.Hive.Contracts {
|
---|
| 10 | public class MultiStream : Stream {
|
---|
| 11 | ArrayList streamList = new ArrayList();
|
---|
| 12 | long position = 0;
|
---|
| 13 | public override bool CanRead {
|
---|
| 14 | get { return true; }
|
---|
| 15 | }
|
---|
| 16 |
|
---|
| 17 | public override bool CanSeek {
|
---|
| 18 | get { return true; }
|
---|
| 19 | }
|
---|
| 20 |
|
---|
| 21 | public override bool CanWrite {
|
---|
| 22 | get { return false; }
|
---|
| 23 | }
|
---|
| 24 |
|
---|
| 25 | public override long Length {
|
---|
| 26 | get {
|
---|
| 27 | long result = 0;
|
---|
| 28 | foreach (Stream stream in streamList) {
|
---|
| 29 | result += stream.Length;
|
---|
| 30 | }
|
---|
| 31 | return result;
|
---|
| 32 | }
|
---|
| 33 | }
|
---|
| 34 |
|
---|
| 35 | public override long Position {
|
---|
| 36 | get { return position; }
|
---|
| 37 | set { Seek(value, SeekOrigin.Begin); }
|
---|
| 38 | }
|
---|
| 39 |
|
---|
| 40 | public override void Flush() { }
|
---|
| 41 |
|
---|
| 42 | public override long Seek(long offset, SeekOrigin origin) {
|
---|
| 43 | long len = Length;
|
---|
| 44 | switch (origin) {
|
---|
| 45 | case SeekOrigin.Begin:
|
---|
| 46 | position = offset;
|
---|
| 47 | break;
|
---|
| 48 | case SeekOrigin.Current:
|
---|
| 49 | position += offset;
|
---|
| 50 | break;
|
---|
| 51 | case SeekOrigin.End:
|
---|
| 52 | position = len - offset;
|
---|
| 53 | break;
|
---|
| 54 | }
|
---|
| 55 | if (position > len) {
|
---|
| 56 | position = len;
|
---|
| 57 | } else if (position < 0) {
|
---|
| 58 | position = 0;
|
---|
| 59 | }
|
---|
| 60 | return position;
|
---|
| 61 | }
|
---|
| 62 |
|
---|
| 63 | public override void SetLength(long value) { }
|
---|
| 64 |
|
---|
| 65 | public void AddStream(Stream stream) {
|
---|
| 66 | streamList.Add(stream);
|
---|
| 67 | }
|
---|
| 68 |
|
---|
| 69 | public override int Read(byte[] buffer, int offset, int count) {
|
---|
| 70 | long len = 0;
|
---|
| 71 | int result = 0;
|
---|
| 72 | int buf_pos = offset;
|
---|
| 73 | int bytesRead;
|
---|
| 74 | foreach (Stream stream in streamList) {
|
---|
| 75 | if (position < (len + stream.Length)) {
|
---|
| 76 | stream.Position = position - len;
|
---|
| 77 | bytesRead = stream.Read(buffer, buf_pos, count);
|
---|
| 78 | result += bytesRead;
|
---|
| 79 | buf_pos += bytesRead;
|
---|
| 80 | position += bytesRead;
|
---|
| 81 | if (bytesRead < count) {
|
---|
| 82 | count -= bytesRead;
|
---|
| 83 | } else {
|
---|
| 84 | break;
|
---|
| 85 | }
|
---|
| 86 | }
|
---|
| 87 | len += stream.Length;
|
---|
| 88 | }
|
---|
| 89 | return result;
|
---|
| 90 | }
|
---|
| 91 |
|
---|
| 92 | public override void Write(byte[] buffer, int offset, int count) {
|
---|
| 93 | }
|
---|
| 94 |
|
---|
| 95 | public override void Close() {
|
---|
| 96 | foreach (Stream s in this.streamList) {
|
---|
| 97 | s.Close();
|
---|
| 98 | }
|
---|
| 99 |
|
---|
| 100 | base.Close();
|
---|
| 101 | }
|
---|
| 102 |
|
---|
| 103 | protected override void Dispose(bool disposing) {
|
---|
| 104 | if (!disposing) {
|
---|
| 105 | foreach (Stream s in this.streamList) {
|
---|
| 106 | s.Dispose();
|
---|
| 107 | }
|
---|
| 108 | }
|
---|
| 109 |
|
---|
| 110 | base.Dispose(disposing);
|
---|
| 111 | }
|
---|
| 112 | }
|
---|
| 113 | } |
---|