From 0c4af8d042f11670db515c080f7a220246996d9e Mon Sep 17 00:00:00 2001 From: RogueException Date: Thu, 21 Jan 2016 17:45:45 -0400 Subject: [PATCH] Cleaned up and added a few more types to ETFEncoder --- src/Discord.Net.Net45/Discord.Net.csproj | 9 +++ src/Discord.Net/ETF/ETFDecoder.cs | 9 +++ src/Discord.Net/{API/Client => ETF}/ETFEncoder.cs | 77 +++++++++++++---------- src/Discord.Net/ETF/ETFType.cs | 32 ++++++++++ 4 files changed, 95 insertions(+), 32 deletions(-) create mode 100644 src/Discord.Net/ETF/ETFDecoder.cs rename src/Discord.Net/{API/Client => ETF}/ETFEncoder.cs (58%) create mode 100644 src/Discord.Net/ETF/ETFType.cs diff --git a/src/Discord.Net.Net45/Discord.Net.csproj b/src/Discord.Net.Net45/Discord.Net.csproj index 3f3932a95..16b872c78 100644 --- a/src/Discord.Net.Net45/Discord.Net.csproj +++ b/src/Discord.Net.Net45/Discord.Net.csproj @@ -421,6 +421,15 @@ Enums\UserStatus.cs + + ETF\ETFDecoder.cs + + + ETF\ETFEncoder.cs + + + ETF\ETFType.cs + Events\ChannelEventArgs.cs diff --git a/src/Discord.Net/ETF/ETFDecoder.cs b/src/Discord.Net/ETF/ETFDecoder.cs new file mode 100644 index 000000000..760ae20e1 --- /dev/null +++ b/src/Discord.Net/ETF/ETFDecoder.cs @@ -0,0 +1,9 @@ +using System; +using System.IO; + +namespace Discord.ETF +{ + public class ETFDecoder + { + } +} diff --git a/src/Discord.Net/API/Client/ETFEncoder.cs b/src/Discord.Net/ETF/ETFEncoder.cs similarity index 58% rename from src/Discord.Net/API/Client/ETFEncoder.cs rename to src/Discord.Net/ETF/ETFEncoder.cs index b63806f19..060ef3fab 100644 --- a/src/Discord.Net/API/Client/ETFEncoder.cs +++ b/src/Discord.Net/ETF/ETFEncoder.cs @@ -2,23 +2,24 @@ using System.Collections.Generic; using System.IO; -namespace Discord.API.Client +namespace Discord.ETF { //TODO: Floats, Atoms, Tuples, Lists, Dictionaries - public class ETFEncoder + public unsafe class ETFEncoder { - private const byte SMALL_INTEGER_EXT = 97; - private const byte INTEGER_EXT = 98; - private const byte SMALL_BIG_EXT = 110; - private const byte SMALL_ATOM_EXT = 115; + private readonly static byte[] _nilBytes = new byte[] { (byte)ETFType.SMALL_ATOM_EXT, 3, (byte)'n', (byte)'i', (byte)'l' }; + private readonly static byte[] _falseBytes = new byte[] { (byte)ETFType.SMALL_ATOM_EXT, 5, (byte)'f', (byte)'a', (byte)'l', (byte)'s', (byte)'e' }; + private readonly static byte[] _trueBytes = new byte[] { (byte)ETFType.SMALL_ATOM_EXT, 4, (byte)'t', (byte)'r', (byte)'u', (byte)'e' }; + private byte[] _writeBuffer; - private readonly static byte[] nilBytes = new byte[] { SMALL_ATOM_EXT, 3, (byte)'n', (byte)'i', (byte)'l' }; - private readonly static byte[] falseBytes = new byte[] { SMALL_ATOM_EXT, 5, (byte)'f', (byte)'a', (byte)'l', (byte)'s', (byte)'e' }; - private readonly static byte[] trueBytes = new byte[] { SMALL_ATOM_EXT, 4, (byte)'t', (byte)'r', (byte)'u', (byte)'e' }; + public ETFEncoder() + { + _writeBuffer = new byte[11]; + } - private void WriteNil(BinaryWriter writer) => Append(writer, nilBytes); - public void Write(BinaryWriter writer, bool value) => Append(writer, value ? trueBytes : falseBytes); + private void WriteNil(BinaryWriter writer) => Append(writer, _nilBytes); + public void Write(BinaryWriter writer, bool value) => Append(writer, value ? _trueBytes : _falseBytes); public void Write(BinaryWriter writer, byte value) => Write(writer, (ulong)value); public void Write(BinaryWriter writer, sbyte value) => Write(writer, (long)value); @@ -29,22 +30,19 @@ namespace Discord.API.Client public void Write(BinaryWriter writer, ulong value) { if (value <= byte.MaxValue) - Append(writer, new byte[] { SMALL_INTEGER_EXT, (byte)value }); + Append(writer, new byte[] { (byte)ETFType.SMALL_INTEGER_EXT, (byte)value }); else if (value <= int.MaxValue) { - Append(writer, new byte[] - { - INTEGER_EXT, + Append(writer, (byte)ETFType.INTEGER_EXT, (byte)((value >> 24) & 0xFF), (byte)((value >> 16) & 0xFF), (byte)((value >> 8) & 0xFF), - (byte)(value & 0xFF) - }); + (byte)(value & 0xFF)); } else { var buffer = new byte[3 + 8]; - buffer[0] = SMALL_BIG_EXT; + buffer[0] = (byte)ETFType.SMALL_BIG_EXT; //buffer[1] = 0; //Always positive byte bytes = 0; @@ -62,22 +60,22 @@ namespace Discord.API.Client public void Write(BinaryWriter writer, long value) { if (value >= byte.MinValue && value <= byte.MaxValue) - Append(writer, new byte[] { SMALL_INTEGER_EXT, (byte)value }); + { + Append(writer, (byte)ETFType.SMALL_INTEGER_EXT, + (byte)value); + } else if (value >= int.MinValue && value <= int.MaxValue) { - Append(writer, new byte[] - { - INTEGER_EXT, + Append(writer, (byte)ETFType.INTEGER_EXT, (byte)((value >> 24) & 0xFF), (byte)((value >> 16) & 0xFF), (byte)((value >> 8) & 0xFF), - (byte)(value & 0xFF) - }); + (byte)(value & 0xFF)); } else { var buffer = new byte[3 + 8]; - buffer[0] = SMALL_BIG_EXT; + buffer[0] = (byte)ETFType.SMALL_BIG_EXT; if (value < 0) { buffer[2] = 1; //Is negative @@ -97,22 +95,37 @@ namespace Discord.API.Client } } - //public void Write(BinaryWriter writer, double value) => Write(writer, (float)value); - public void Write(BinaryWriter writer, float value) + public void Write(BinaryWriter writer, float value) => Write(writer, (double)value); + public void Write(BinaryWriter writer, double value) { - throw new NotImplementedException(); + ulong value2 = *(ulong*)&value; + Append(writer, (byte)ETFType.NEW_FLOAT_EXT, + (byte)((value2 >> 56) & 0xFF), + (byte)((value2 >> 48) & 0xFF), + (byte)((value2 >> 40) & 0xFF), + (byte)((value2 >> 32) & 0xFF), + (byte)((value2 >> 24) & 0xFF), + (byte)((value2 >> 16) & 0xFF), + (byte)((value2 >> 8) & 0xFF), + (byte)(value2 & 0xFF)); } public void Write(BinaryWriter writer, byte[] value) { - throw new NotImplementedException(); + int count = value.Length; + Append(writer, (byte)ETFType.BINARY_EXT, + (byte)((count >> 24) & 0xFF), + (byte)((count >> 16) & 0xFF), + (byte)((count >> 8) & 0xFF), + (byte)(count & 0xFF)); + Append(writer, value); } public void Write(BinaryWriter writer, string value) { throw new NotImplementedException(); } - public void Write(BinaryWriter writer, T value) + /*public void Write(BinaryWriter writer, T value) where T : ISerializable { throw new NotImplementedException(); @@ -121,9 +134,9 @@ namespace Discord.API.Client where T : ISerializable { throw new NotImplementedException(); - } + }*/ - private void Append(BinaryWriter writer, byte[] data) => Append(writer, data, data.Length); + private void Append(BinaryWriter writer, params byte[] data) => Append(writer, data, data.Length); private void Append(BinaryWriter writer, byte[] data, int length) { throw new NotImplementedException(); diff --git a/src/Discord.Net/ETF/ETFType.cs b/src/Discord.Net/ETF/ETFType.cs new file mode 100644 index 000000000..53499d5fa --- /dev/null +++ b/src/Discord.Net/ETF/ETFType.cs @@ -0,0 +1,32 @@ +namespace Discord.ETF +{ + public enum ETFType : byte + { + NEW_FLOAT_EXT = 70, + BIT_BINARY_EXT = 77, + ATOM_CACHE_REF = 82, + SMALL_INTEGER_EXT = 97, + INTEGER_EXT = 98, + FLOAT_EXT = 99, + ATOM_EXT = 100, + REFERENCE_EXT = 101, + PORT_EXT = 102, + PID_EXT = 103, + SMALL_TUPLE_EXT = 104, + LARGE_TUPLE_EXT = 105, + NIL_EXT = 106, + STRING_EXT = 107, + LIST_EXT = 108, + BINARY_EXT = 109, + SMALL_BIG_EXT = 110, + LARGE_BIG_EXT = 111, + NEW_FUN_EXT = 112, + EXPORT_EXT = 113, + NEW_REFERENCE_EXT = 114, + SMALL_ATOM_EXT = 115, + MAP_EXT = 116, + FUN_EXT = 117, + ATOM_UTF8_EXT = 118, + SMALL_ATOM_UTF8_EXT = 119 + } +}