File: XmlBufferedByteStreamReader.cs

package info (click to toggle)
mono 6.14.1%2Bds2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,282,732 kB
  • sloc: cs: 11,182,461; xml: 2,850,281; ansic: 699,123; cpp: 122,919; perl: 58,604; javascript: 30,841; asm: 21,845; makefile: 19,602; sh: 10,973; python: 4,772; pascal: 925; sql: 859; sed: 16; php: 1
file content (87 lines) | stat: -rw-r--r-- 2,944 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
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------

namespace System.ServiceModel.Channels
{
    using System;
    using System.IO;
    using System.Runtime;
    using System.Xml;

    class XmlBufferedByteStreamReader : XmlByteStreamReader
    {
        ByteStreamBufferedMessageData bufferedMessageData; 
        int offset;
        static byte[] emptyByteArray = new byte[0];

        public XmlBufferedByteStreamReader(ByteStreamBufferedMessageData bufferedMessageData, XmlDictionaryReaderQuotas quotas) : base (quotas)
        {
            Fx.Assert(bufferedMessageData != null, "bufferedMessageData is null");
            this.bufferedMessageData = bufferedMessageData;
            this.bufferedMessageData.Open(); 

            this.offset = bufferedMessageData.Buffer.Offset;
            this.quotas = quotas;
            this.position = ReaderPosition.None;
        }

        protected override void OnClose()
        {
            this.bufferedMessageData.Close();
            this.bufferedMessageData = null; 
            this.offset = 0;
            base.OnClose();
        }

        public override int ReadContentAsBase64(byte[] buffer, int index, int count)
        {
            EnsureInContent();
            ByteStreamMessageUtility.EnsureByteBoundaries(buffer, index, count, true);

            if (count == 0)
            {
                return 0; 
            }

            int bytesToCopy = Math.Min(bufferedMessageData.Buffer.Count - this.offset, count);

            if (bytesToCopy == 0)
            {
                this.position = ReaderPosition.EndElement;
                return 0; 
            }

            Buffer.BlockCopy(this.bufferedMessageData.Buffer.Array, this.offset, buffer, index, bytesToCopy);
            this.offset += bytesToCopy;
            
            return bytesToCopy;
        }

        protected override byte[] OnToByteArray()
        {
            int bytesToCopy = bufferedMessageData.Buffer.Count;
            byte[] buffer = new byte[bytesToCopy];
            Buffer.BlockCopy(this.bufferedMessageData.Buffer.Array, this.bufferedMessageData.Buffer.Offset, buffer, 0, bytesToCopy);
            return buffer;
        }

        protected override Stream OnToStream()
        {
            return this.bufferedMessageData.ToStream();
        }

        public override bool TryGetBase64ContentLength(out int length)
        {
            if (!this.IsClosed)
            {
                // in ByteStream encoder, we're not concerned about individual xml nodes
                // therefore we can just return the entire segment of the buffer we're using in this reader.
                length = bufferedMessageData.Buffer.Count;
                return true;
            }
            length = -1; 
            return false;
        }
    }
}