blob: bdda79b0ca205eaf4b5a53f1142f6b9bffa1807b [file] [log] [blame] [raw]
// NVNC - .NET VNC Server Library
// Copyright (C) 2014 T!T@N
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
using System;
using System.IO;
namespace NVNC.Readers
{
/// <summary>
/// BigEndianBinaryReader is a wrapper class used to read .NET integral types from a Big-Endian stream. It inherits from BinaryReader and adds Big- to Little-Endian conversion.
/// </summary>
public sealed class BigEndianBinaryReader : BinaryReader
{
private byte[] buff = new byte[4];
public BigEndianBinaryReader(Stream input)
: base(input)
{ }
public BigEndianBinaryReader(Stream input, System.Text.Encoding encoding)
: base(input, encoding)
{ }
// Since this is being used to communicate with an RFB host, only some of the overrides are provided below.
public override ushort ReadUInt16()
{
FillBuff(2);
return (ushort)(((uint)buff[1]) | ((uint)buff[0]) << 8);
}
public override short ReadInt16()
{
FillBuff(2);
return (short)(buff[1] & 0xFF | buff[0] << 8);
}
public override uint ReadUInt32()
{
FillBuff(4);
return (uint)(((uint)buff[3]) & 0xFF | ((uint)buff[2]) << 8 | ((uint)buff[1]) << 16 | ((uint)buff[0]) << 24);
}
public override int ReadInt32()
{
FillBuff(4);
return Convert.ToInt32(buff[3] | buff[2] << 8 | buff[1] << 16 | buff[0] << 24);
}
private void FillBuff(int totalBytes)
{
int bytesRead = 0;
int n = 0;
do
{
n = BaseStream.Read(buff, bytesRead, totalBytes - bytesRead);
if (n == 0)
throw new IOException("Unable to read next byte(s).");
bytesRead += n;
} while (bytesRead < totalBytes);
}
}
}