void WriteChunkCallback(XmlDictionaryWriter writer, object state)
        {
            ChunkState chunkState = (ChunkState)state;

            writer.WriteStartElement(ChunkingUtils.ChunkElement, ChunkingUtils.ChunkNs);
            writer.WriteBase64(chunkState.Buffer, 0, chunkState.Count);
            writer.WriteEndElement();
        }
        void CreateChunkMessage()
        {
            ChunkBodyWriter bodyWriter = new ChunkBodyWriter(this.WriteChunkCallback, this.chunkState);
            Message         chunk      = Message.CreateMessage(this.version, ChunkingUtils.ChunkAction, bodyWriter);

            chunk.Headers.Add(this.messageIdHeader);
            chunk.Headers.Add(MessageHeader.CreateHeader(ChunkingUtils.ChunkNumberHeader, ChunkingUtils.ChunkNs, this.chunkNum, true));
            this.outputChannel.Send(chunk, chunkingTimeout.RemainingTime());
            Console.WriteLine(" > Sent chunk {0} of message {1}", chunkNum, this.messageId);
            this.chunkNum++;
            this.chunkState = new ChunkState();
        }
        public override void WriteBase64(byte[] buffer, int index, int count)
        {
            if (chunkState == null)
            {
                chunkState = new ChunkState();
            }
            int remaining = chunkState.AppendBytes(buffer, index, count);

            if (chunkState.Count == ChunkingUtils.ChunkSize)
            {
                CreateChunkMessage();
            }
            int end = index + count - 1;

            while (remaining > 0)
            {
                int start = end - remaining + 1;
                remaining = chunkState.AppendBytes(buffer, start, remaining);
                if (chunkState.Count == ChunkingUtils.ChunkSize)
                {
                    CreateChunkMessage();
                }
            }
        }