Example #1
0
        private int ReadContentAsBinary(byte[] buffer, int index, int count)
        {
            Debug.Assert(_decoder != null);

            if (_isEnd)
            {
                Reset();
                return(0);
            }
            _decoder.SetNextOutputBuffer(buffer, index, count);

            for (; ;)
            {
                // use streaming ReadValueChunk if the reader supports it
                if (_canReadValueChunk)
                {
                    for (; ;)
                    {
                        if (_valueOffset < _valueChunkLength)
                        {
                            int decodedCharsCount = _decoder.Decode(_valueChunk, _valueOffset, _valueChunkLength - _valueOffset);
                            _valueOffset += decodedCharsCount;
                        }
                        if (_decoder.IsFull)
                        {
                            return(_decoder.DecodedCount);
                        }
                        Debug.Assert(_valueOffset == _valueChunkLength);
                        if ((_valueChunkLength = _reader.ReadValueChunk(_valueChunk, 0, ChunkSize)) == 0)
                        {
                            break;
                        }
                        _valueOffset = 0;
                    }
                }
                else
                {
                    // read what is reader.Value
                    string value             = _reader.Value;
                    int    decodedCharsCount = _decoder.Decode(value, _valueOffset, value.Length - _valueOffset);
                    _valueOffset += decodedCharsCount;

                    if (_decoder.IsFull)
                    {
                        return(_decoder.DecodedCount);
                    }
                }

                _valueOffset = 0;

                // move to next textual node in the element content; throw on sub elements
                if (!MoveToNextContentNode(true))
                {
                    _isEnd = true;
                    return(_decoder.DecodedCount);
                }
            }
        }
Example #2
0
        // Copies the current node from the given reader to the writer (including child nodes), and if called on an element moves the XmlReader
        // to the corresponding end element.
        public virtual void WriteNode(XmlReader reader, bool defattr)
        {
            if (null == reader)
            {
                throw new ArgumentNullException("reader");
            }

            bool canReadChunk = reader.CanReadValueChunk;
            int  d            = reader.NodeType == XmlNodeType.None ? -1 : reader.Depth;

            do
            {
                switch (reader.NodeType)
                {
                case XmlNodeType.Element:
                    WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
                    WriteAttributes(reader, defattr);
                    if (reader.IsEmptyElement)
                    {
                        WriteEndElement();
                        break;
                    }
                    break;

                case XmlNodeType.Text:
                    if (canReadChunk)
                    {
                        if (_writeNodeBuffer == null)
                        {
                            _writeNodeBuffer = new char[WriteNodeBufferSize];
                        }
                        int read;
                        while ((read = reader.ReadValueChunk(_writeNodeBuffer, 0, WriteNodeBufferSize)) > 0)
                        {
                            this.WriteChars(_writeNodeBuffer, 0, read);
                        }
                    }
                    else
                    {
                        WriteString(reader.Value);
                    }
                    break;

                case XmlNodeType.Whitespace:
                case XmlNodeType.SignificantWhitespace:

                    WriteWhitespace(reader.Value);

                    break;

                case XmlNodeType.CDATA:
                    WriteCData(reader.Value);
                    break;

                case XmlNodeType.EntityReference:
                    WriteEntityRef(reader.Name);
                    break;

                case XmlNodeType.XmlDeclaration:
                case XmlNodeType.ProcessingInstruction:
                    WriteProcessingInstruction(reader.Name, reader.Value);
                    break;

                case XmlNodeType.DocumentType:
                    WriteDocType(reader.Name, reader.GetAttribute("PUBLIC"), reader.GetAttribute("SYSTEM"), reader.Value);
                    break;

                case XmlNodeType.Comment:
                    WriteComment(reader.Value);
                    break;

                case XmlNodeType.EndElement:
                    WriteFullEndElement();
                    break;
                }
            } while (reader.Read() && (d < reader.Depth || (d == reader.Depth && reader.NodeType == XmlNodeType.EndElement)));
        }
Example #3
0
 public override int ReadValueChunk(char[] buffer, int index, int count)
 {
     CheckAsync();
     return(_coreReader.ReadValueChunk(buffer, index, count));
 }