File: BufferedResponseStream.cs

package info (click to toggle)
mono 6.8.0.105%2Bdfsg-3.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,284,512 kB
  • sloc: cs: 11,172,132; xml: 2,850,069; ansic: 671,653; cpp: 122,091; perl: 59,366; javascript: 30,841; asm: 22,168; makefile: 20,093; sh: 15,020; python: 4,827; pascal: 925; sql: 859; sed: 16; php: 1
file content (111 lines) | stat: -rw-r--r-- 4,155 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//------------------------------------------------------------------------------
// <copyright file="BufferedResponseStream.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------

namespace System.Web.Services.Protocols {
    using System;
    using System.IO;
    using System.Web.Services;

    internal class BufferedResponseStream : Stream {
        Stream outputStream;
        byte[] buffer;
        int position;
        bool flushEnabled = true;

        internal BufferedResponseStream(Stream outputStream, int buffersize) {
            buffer = new byte[buffersize];
            this.outputStream = outputStream;
        }

        public override bool CanRead { get { return false; } }

        public override bool CanSeek { get { return false; } }

        public override bool CanWrite { get { return true; } }

        public override long Length { get { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotSeek)); } }

        public override long Position { 
            get { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotSeek)); } 
            set { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotSeek)); } 
        }

        protected override void Dispose(bool disposing) {
            try {
                if (disposing)
                    outputStream.Close();
            }
            finally {
                base.Dispose(disposing);
            }
        }

        internal bool FlushEnabled {
            set { flushEnabled = value; }
        }

        public override void Flush() {
            if (!flushEnabled)
                return; 
            FlushWrite();
        }

        public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, Object state) {
            throw new NotSupportedException(Res.GetString(Res.StreamDoesNotRead));
        }

        public override int EndRead(IAsyncResult asyncResult) { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotRead)); }

        public override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotSeek)); }

        public override void SetLength(long value) { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotSeek)); }

        public override int Read(byte[] buffer, int offset, int count) { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotRead)); }


        public override int ReadByte() { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotRead)); }

        public override void Write(byte[] array, int offset, int count) {
            if (position > 0) {
                int numBytes = buffer.Length - position;   // space left in buffer
                if (numBytes > 0) {
                    if (numBytes > count)
                        numBytes = count;
                    Array.Copy(array, offset, buffer, position, numBytes);
                    position += numBytes;
                    if (count == numBytes) return;
                    offset += numBytes;
                    count -= numBytes;
                }
                FlushWrite();
            }
            // Skip buffer if we have more bytes then will fit in the buffer.
            if (count >= buffer.Length) {
                outputStream.Write(array, offset, count);
                return;
            }

            // Copy remaining bytes into buffer, to write at a later date.
            Array.Copy(array, offset, buffer, position, count);
            position = count;
        }

        private void FlushWrite() {
            if (position > 0) {
                outputStream.Write(buffer, 0, position);
                position = 0;
            }
            outputStream.Flush();
        }

        public override void WriteByte(byte value) {
            if (position == buffer.Length)
                FlushWrite();

            buffer[position++] = value;
        }
    }
}