blob: b2ccbb89ae91046661df39669afdacc65659bf69 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
using System;
using System.Diagnostics;
using System.IO;
using org.apache.qpid.transport.util;
namespace org.apache.qpid.transport.codec
{
/// <summary>
/// MSEncoder
/// </summary>
public sealed class MSEncoder : AbstractEncoder
{
private readonly MemoryStream _out;
private readonly BinaryWriter _writer;
public MSEncoder(int capacity)
{
_out = new MemoryStream(capacity);
_writer = new BinaryWriter(_out);
}
public void init()
{
_out.Seek(0, SeekOrigin.Begin);
}
public MemoryStream segment()
{
int length = (int) _out.Position;
MemoryStream result = new MemoryStream(_out.ToArray(), 0, length);
result.Seek(length, SeekOrigin.Begin);
_out.Seek(0, SeekOrigin.Begin);
return result;
}
protected override void doPut(byte b)
{
_writer.Write(b);
}
protected override void doPut(MemoryStream src)
{
_writer.Write(src.ToArray());
}
protected override void put(byte[] bytes)
{
_writer.Write(bytes);
}
public override void writeUint8(short b)
{
Debug.Assert(b < 0x100);
_writer.Write((byte) b);
}
public override void writeUint16(int s)
{
Debug.Assert(s < 0x10000);
_writer.Write(ByteEncoder.GetBigEndian((UInt16) s));
}
public override void writeUint32(long i)
{
Debug.Assert(i < 0x100000000L);
_writer.Write(ByteEncoder.GetBigEndian((UInt32) i));
}
public override void writeUint64(long l)
{
_writer.Write(ByteEncoder.GetBigEndian(l));
}
protected override int beginSize8()
{
int pos = (int) _out.Position;
_writer.Write((byte) 0);
return pos;
}
protected override void endSize8(int pos)
{
int cur = (int) _out.Position;
_out.Seek(pos, SeekOrigin.Begin);
_writer.Write((byte) (cur - pos - 1));
_out.Seek(cur, SeekOrigin.Begin);
}
protected override int beginSize16()
{
int pos = (int) _out.Position;
_writer.Write((short) 0);
return pos;
}
protected override void endSize16(int pos)
{
int cur = (int) _out.Position;
_out.Seek(pos, SeekOrigin.Begin);
_writer.Write((short) (cur - pos - 2));
_out.Seek(cur, SeekOrigin.Begin);
}
protected override int beginSize32()
{
int pos = (int) _out.Position;
_writer.Write(0);
return pos;
}
protected override void endSize32(int pos)
{
int cur = (int) _out.Position;
_out.Seek(pos, SeekOrigin.Begin);
_writer.Write(ByteEncoder.GetBigEndian((Int32) cur - pos - 4));
_out.Seek(cur, SeekOrigin.Begin);
}
}
}