From bc47917a03c0661f15232b9d6402d31e7a385557 Mon Sep 17 00:00:00 2001 From: Pavel Djundik Date: Fri, 9 Feb 2024 21:42:39 +0200 Subject: [PATCH] Rebase --- .gitattributes | 4 -- .../Test Data/TextKV3/.gitattributes | 3 ++ .../Test Data/apisurface.txt | 46 +++++++++++++++++++ .../TextKV3/BasicKV3TestCases.cs | 8 ++-- .../TextKV3/HeadersTestCase.cs | 3 -- .../TextKV3/Kv1ToKv3TestCase.cs | 4 -- .../TextKV3/Kv3ToKv1TestCase.cs | 3 -- .../TextKV3/RootTypesTestCase.cs | 4 +- .../TextKV3/SerializationTestCase.cs | 3 -- .../KeyValues3/KV3TextReader.cs | 4 +- .../KeyValues3/KV3TextReaderState.cs | 2 +- .../KeyValues3/KV3TextReaderStateMachine.cs | 2 - .../KeyValues3/KV3TokenReader.cs | 3 -- ValveKeyValue/ValveKeyValue/KVDocument.cs | 6 ++- ValveKeyValue/ValveKeyValue/KVFile.cs | 14 ------ ValveKeyValue/ValveKeyValue/KVFlag.cs | 2 - ValveKeyValue/ValveKeyValue/KVHeader.cs | 2 - .../ValveKeyValue/KeyValues3/Encoding.cs | 2 - .../ValveKeyValue/KeyValues3/Format.cs | 2 - .../KeyValues1/KV1TextSerializer.cs | 2 +- .../KeyValues3/KV3TextSerializer.cs | 23 +++++----- ValveKeyValue/ValveKeyValue/Utils.cs | 42 ----------------- 22 files changed, 72 insertions(+), 112 deletions(-) create mode 100644 ValveKeyValue/ValveKeyValue.Test/Test Data/TextKV3/.gitattributes delete mode 100644 ValveKeyValue/ValveKeyValue/KVFile.cs delete mode 100644 ValveKeyValue/ValveKeyValue/Utils.cs diff --git a/.gitattributes b/.gitattributes index b4b74233..2ffde598 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,2 @@ * text=auto *.cs diff=csharp - -# Keep intended line endings to test parser -*_crlf.kv3 eol=crlf -*_lf.kv3 eol=lf diff --git a/ValveKeyValue/ValveKeyValue.Test/Test Data/TextKV3/.gitattributes b/ValveKeyValue/ValveKeyValue.Test/Test Data/TextKV3/.gitattributes new file mode 100644 index 00000000..317b9fcd --- /dev/null +++ b/ValveKeyValue/ValveKeyValue.Test/Test Data/TextKV3/.gitattributes @@ -0,0 +1,3 @@ +# Keep intended line endings to test parser +*.kv3 eol=lf +*_crlf.kv3 eol=crlf diff --git a/ValveKeyValue/ValveKeyValue.Test/Test Data/apisurface.txt b/ValveKeyValue/ValveKeyValue.Test/Test Data/apisurface.txt index f2196c6f..87654957 100644 --- a/ValveKeyValue/ValveKeyValue.Test/Test Data/apisurface.txt +++ b/ValveKeyValue/ValveKeyValue.Test/Test Data/apisurface.txt @@ -39,6 +39,7 @@ public class ValveKeyValue.KVArrayValue public bool Equals(object obj); protected void Finalize(); public int get_Count(); + public ValveKeyValue.KVFlag get_Flag(); public bool get_IsReadOnly(); public ValveKeyValue.KVValue get_Item(int key); public ValveKeyValue.KVValue get_Item(string key); @@ -52,6 +53,7 @@ public class ValveKeyValue.KVArrayValue protected object MemberwiseClone(); public bool Remove(ValveKeyValue.KVValue item); public void RemoveAt(int index); + public void set_Flag(ValveKeyValue.KVFlag value); public void set_Item(int key, ValveKeyValue.KVValue value); public bool ToBoolean(IFormatProvider provider); public byte ToByte(IFormatProvider provider); @@ -77,12 +79,14 @@ public class ValveKeyValue.KVBinaryBlob public bool Equals(object obj); protected void Finalize(); public Memory`1[[byte]] get_Bytes(); + public ValveKeyValue.KVFlag get_Flag(); public ValveKeyValue.KVValue get_Item(string key); public ValveKeyValue.KVValueType get_ValueType(); public int GetHashCode(); public Type GetType(); public TypeCode GetTypeCode(); protected object MemberwiseClone(); + public void set_Flag(ValveKeyValue.KVFlag value); public bool ToBoolean(IFormatProvider provider); public byte ToByte(IFormatProvider provider); public char ToChar(IFormatProvider provider); @@ -108,6 +112,8 @@ public class ValveKeyValue.KVDocument public bool Equals(object obj); protected void Finalize(); public System.Collections.Generic.IEnumerable`1[[ValveKeyValue.KVObject]] get_Children(); + public System.Collections.Generic.IEnumerable`1[[ValveKeyValue.KVValue]] get_ChildrenValues(); + public ValveKeyValue.KVHeader get_Header(); public ValveKeyValue.KVValue get_Item(string key); public string get_Name(); public ValveKeyValue.KVValue get_Value(); @@ -119,6 +125,43 @@ public class ValveKeyValue.KVDocument public string ToString(); } +public sealed enum ValveKeyValue.KVFlag +{ + None = 0; + Resource = 1; + ResourceName = 2; + Panorama = 3; + SoundEvent = 4; + SubClass = 5; + + public int CompareTo(object target); + public bool Equals(object obj); + protected void Finalize(); + public int GetHashCode(); + public Type GetType(); + public TypeCode GetTypeCode(); + public bool HasFlag(Enum flag); + protected object MemberwiseClone(); + public string ToString(); + public string ToString(IFormatProvider provider); + public string ToString(string format); + public string ToString(string format, IFormatProvider provider); +} + +public class ValveKeyValue.KVHeader +{ + public bool Equals(object obj); + protected void Finalize(); + public Guid get_Encoding(); + public Guid get_Format(); + public int GetHashCode(); + public Type GetType(); + protected object MemberwiseClone(); + public void set_Encoding(Guid value); + public void set_Format(Guid value); + public string ToString(); +} + public sealed class ValveKeyValue.KVIgnoreAttribute { public bool Equals(object obj); @@ -138,6 +181,7 @@ public class ValveKeyValue.KVObject public bool Equals(object obj); protected void Finalize(); public System.Collections.Generic.IEnumerable`1[[ValveKeyValue.KVObject]] get_Children(); + public System.Collections.Generic.IEnumerable`1[[ValveKeyValue.KVValue]] get_ChildrenValues(); public ValveKeyValue.KVValue get_Item(string key); public string get_Name(); public ValveKeyValue.KVValue get_Value(); @@ -221,6 +265,7 @@ public class ValveKeyValue.KVValue { public bool Equals(object obj); protected void Finalize(); + public ValveKeyValue.KVFlag get_Flag(); public ValveKeyValue.KVValue get_Item(string key); public ValveKeyValue.KVValueType get_ValueType(); public int GetHashCode(); @@ -249,6 +294,7 @@ public class ValveKeyValue.KVValue public static ValveKeyValue.KVValue op_Implicit(long value); public static ValveKeyValue.KVValue op_Implicit(string value); public static ValveKeyValue.KVValue op_Implicit(ulong value); + public void set_Flag(ValveKeyValue.KVFlag value); public bool ToBoolean(IFormatProvider provider); public byte ToByte(IFormatProvider provider); public char ToChar(IFormatProvider provider); diff --git a/ValveKeyValue/ValveKeyValue.Test/TextKV3/BasicKV3TestCases.cs b/ValveKeyValue/ValveKeyValue.Test/TextKV3/BasicKV3TestCases.cs index aaf3cebd..8f51a7cd 100644 --- a/ValveKeyValue/ValveKeyValue.Test/TextKV3/BasicKV3TestCases.cs +++ b/ValveKeyValue/ValveKeyValue.Test/TextKV3/BasicKV3TestCases.cs @@ -1,5 +1,3 @@ -using NUnit.Framework; - namespace ValveKeyValue.Test.TextKV3 { class BasicKV3TestCases @@ -27,7 +25,7 @@ public void DeserializesFlaggedValues() Assert.That(data["bar"].Flag, Is.EqualTo(KVFlag.Resource)); Assert.That((string)data["bar"], Is.EqualTo("foo")); - Assert.That(data["multipleFlags"].Flag, Is.EqualTo(KVFlag.Resource | KVFlag.ResourceName | KVFlag.SubClass)); + Assert.That(data["multipleFlags"].Flag, Is.EqualTo(KVFlag.SubClass)); Assert.That((string)data["multipleFlags"], Is.EqualTo("cool value")); Assert.That(data["flaggedNumber"].Flag, Is.EqualTo(KVFlag.Panorama)); @@ -97,7 +95,7 @@ public void DeserializesArray() var arrayValue = (KVArrayValue)data["arrayValue"]; - Assert.That(arrayValue.Count, Is.EqualTo(2)); + Assert.That(arrayValue, Has.Count.EqualTo(2)); Assert.That(arrayValue[0].ToString(), Is.EqualTo("a")); Assert.That(arrayValue[1].ToString(), Is.EqualTo("b")); @@ -111,7 +109,7 @@ public void DeserializesBinaryBlob() var data = KVSerializer.Create(KVSerializationFormat.KeyValues3Text).Deserialize(stream); Assert.That(data["array"].ValueType, Is.EqualTo(KVValueType.BinaryBlob)); - Assert.That(((KVBinaryBlob)data["array"]).Bytes, Is.EqualTo(new byte[] + Assert.That(((KVBinaryBlob)data["array"]).Bytes.ToArray(), Is.EqualTo(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xFF diff --git a/ValveKeyValue/ValveKeyValue.Test/TextKV3/HeadersTestCase.cs b/ValveKeyValue/ValveKeyValue.Test/TextKV3/HeadersTestCase.cs index 3e398dc2..4c715620 100644 --- a/ValveKeyValue/ValveKeyValue.Test/TextKV3/HeadersTestCase.cs +++ b/ValveKeyValue/ValveKeyValue.Test/TextKV3/HeadersTestCase.cs @@ -1,7 +1,4 @@ -using System; -using System.IO; using System.Text; -using NUnit.Framework; namespace ValveKeyValue.Test.TextKV3 { diff --git a/ValveKeyValue/ValveKeyValue.Test/TextKV3/Kv1ToKv3TestCase.cs b/ValveKeyValue/ValveKeyValue.Test/TextKV3/Kv1ToKv3TestCase.cs index e6037eb6..5eba97b6 100644 --- a/ValveKeyValue/ValveKeyValue.Test/TextKV3/Kv1ToKv3TestCase.cs +++ b/ValveKeyValue/ValveKeyValue.Test/TextKV3/Kv1ToKv3TestCase.cs @@ -1,7 +1,3 @@ -using System; -using System.IO; -using NUnit.Framework; - namespace ValveKeyValue.Test.TextKV3 { class Kv1ToKv3TestCase diff --git a/ValveKeyValue/ValveKeyValue.Test/TextKV3/Kv3ToKv1TestCase.cs b/ValveKeyValue/ValveKeyValue.Test/TextKV3/Kv3ToKv1TestCase.cs index 7be5493d..3ede1317 100644 --- a/ValveKeyValue/ValveKeyValue.Test/TextKV3/Kv3ToKv1TestCase.cs +++ b/ValveKeyValue/ValveKeyValue.Test/TextKV3/Kv3ToKv1TestCase.cs @@ -1,6 +1,3 @@ -using System.IO; -using NUnit.Framework; - namespace ValveKeyValue.Test.TextKV3 { class Kv3ToKv1TestCase diff --git a/ValveKeyValue/ValveKeyValue.Test/TextKV3/RootTypesTestCase.cs b/ValveKeyValue/ValveKeyValue.Test/TextKV3/RootTypesTestCase.cs index e685b105..b27bdcbb 100644 --- a/ValveKeyValue/ValveKeyValue.Test/TextKV3/RootTypesTestCase.cs +++ b/ValveKeyValue/ValveKeyValue.Test/TextKV3/RootTypesTestCase.cs @@ -1,5 +1,3 @@ -using NUnit.Framework; - namespace ValveKeyValue.Test.TextKV3 { class RootTypesTestCase @@ -86,7 +84,7 @@ public void DeserializesRootBinaryBlob() { Assert.That(data.Name, Is.EqualTo("root")); Assert.That(data.Value.ValueType, Is.EqualTo(KVValueType.BinaryBlob)); - Assert.That(((KVBinaryBlob)data.Value).Bytes, Is.EqualTo(new byte[] + Assert.That(((KVBinaryBlob)data.Value).Bytes.ToArray(), Is.EqualTo(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xFF diff --git a/ValveKeyValue/ValveKeyValue.Test/TextKV3/SerializationTestCase.cs b/ValveKeyValue/ValveKeyValue.Test/TextKV3/SerializationTestCase.cs index 69dff8e5..71ac6899 100644 --- a/ValveKeyValue/ValveKeyValue.Test/TextKV3/SerializationTestCase.cs +++ b/ValveKeyValue/ValveKeyValue.Test/TextKV3/SerializationTestCase.cs @@ -1,6 +1,3 @@ -using System.IO; -using NUnit.Framework; - namespace ValveKeyValue.Test.TextKV3 { class SerializationTestCase diff --git a/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TextReader.cs b/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TextReader.cs index ea4f34fa..a59a0f23 100644 --- a/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TextReader.cs +++ b/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TextReader.cs @@ -1,6 +1,4 @@ -using System; using System.Globalization; -using System.IO; using ValveKeyValue.Abstraction; namespace ValveKeyValue.Deserialization.KeyValues3 @@ -183,7 +181,7 @@ void ReadText(string text) void ReadBinaryBlob(string text) { - var bytes = Utils.ParseHexStringAsByteArrayNoReverse(text); + var bytes = HexStringHelper.ParseHexStringAsByteArray(text); var value = new KVBinaryBlob(bytes) { Flag = stateMachine.GetAndResetFlag() diff --git a/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TextReaderState.cs b/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TextReaderState.cs index dae406f7..b4a0a685 100644 --- a/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TextReaderState.cs +++ b/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TextReaderState.cs @@ -1,4 +1,4 @@ -namespace ValveKeyValue.Deserialization.KeyValues3 +namespace ValveKeyValue.Deserialization.KeyValues3 { enum KV3TextReaderState { diff --git a/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TextReaderStateMachine.cs b/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TextReaderStateMachine.cs index 127ec45d..b233dc88 100644 --- a/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TextReaderStateMachine.cs +++ b/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TextReaderStateMachine.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; - namespace ValveKeyValue.Deserialization.KeyValues3 { class KV3TextReaderStateMachine diff --git a/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TokenReader.cs b/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TokenReader.cs index 7a6124c0..91625ced 100644 --- a/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TokenReader.cs +++ b/ValveKeyValue/ValveKeyValue/Deserialization/KeyValues3/KV3TokenReader.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections.Generic; -using System.IO; using System.Linq; using System.Text; using ValveKeyValue.KeyValues3; diff --git a/ValveKeyValue/ValveKeyValue/KVDocument.cs b/ValveKeyValue/ValveKeyValue/KVDocument.cs index aebd995d..2417ddfa 100644 --- a/ValveKeyValue/ValveKeyValue/KVDocument.cs +++ b/ValveKeyValue/ValveKeyValue/KVDocument.cs @@ -2,9 +2,11 @@ namespace ValveKeyValue { public class KVDocument : KVObject { - public KVDocument(string name, KVValue value) : base(name, value) + public KVHeader Header { get; } + + public KVDocument(KVHeader header, string name, KVValue value) : base(name, value) { - // KV3 will require a header field that contains format/encoding here. + Header = header; } } } diff --git a/ValveKeyValue/ValveKeyValue/KVFile.cs b/ValveKeyValue/ValveKeyValue/KVFile.cs deleted file mode 100644 index bae07fc6..00000000 --- a/ValveKeyValue/ValveKeyValue/KVFile.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace ValveKeyValue -{ - public class KVFile : KVObject - { - public KVHeader Header { get; } - - public KVFile(KVHeader header, string name, KVValue value) : base(name, value) - { - Header = header; - } - } -} diff --git a/ValveKeyValue/ValveKeyValue/KVFlag.cs b/ValveKeyValue/ValveKeyValue/KVFlag.cs index 25e20c31..eea986e0 100644 --- a/ValveKeyValue/ValveKeyValue/KVFlag.cs +++ b/ValveKeyValue/ValveKeyValue/KVFlag.cs @@ -1,5 +1,3 @@ -using System; - namespace ValveKeyValue { public enum KVFlag diff --git a/ValveKeyValue/ValveKeyValue/KVHeader.cs b/ValveKeyValue/ValveKeyValue/KVHeader.cs index 6f02091a..17ab54aa 100644 --- a/ValveKeyValue/ValveKeyValue/KVHeader.cs +++ b/ValveKeyValue/ValveKeyValue/KVHeader.cs @@ -1,5 +1,3 @@ -using System; - namespace ValveKeyValue { public class KVHeader diff --git a/ValveKeyValue/ValveKeyValue/KeyValues3/Encoding.cs b/ValveKeyValue/ValveKeyValue/KeyValues3/Encoding.cs index 3bfac429..d2f6b21b 100644 --- a/ValveKeyValue/ValveKeyValue/KeyValues3/Encoding.cs +++ b/ValveKeyValue/ValveKeyValue/KeyValues3/Encoding.cs @@ -1,5 +1,3 @@ -using System; - namespace ValveKeyValue.KeyValues3 { public class Encoding diff --git a/ValveKeyValue/ValveKeyValue/KeyValues3/Format.cs b/ValveKeyValue/ValveKeyValue/KeyValues3/Format.cs index 017efd84..b2c6ebb2 100644 --- a/ValveKeyValue/ValveKeyValue/KeyValues3/Format.cs +++ b/ValveKeyValue/ValveKeyValue/KeyValues3/Format.cs @@ -1,5 +1,3 @@ -using System; - namespace ValveKeyValue.KeyValues3 { public class Format diff --git a/ValveKeyValue/ValveKeyValue/Serialization/KeyValues1/KV1TextSerializer.cs b/ValveKeyValue/ValveKeyValue/Serialization/KeyValues1/KV1TextSerializer.cs index 31f736a8..57a1bfe3 100644 --- a/ValveKeyValue/ValveKeyValue/Serialization/KeyValues1/KV1TextSerializer.cs +++ b/ValveKeyValue/ValveKeyValue/Serialization/KeyValues1/KV1TextSerializer.cs @@ -21,7 +21,7 @@ public KV1TextSerializer(Stream stream, KVSerializerOptions options) readonly KVSerializerOptions options; readonly TextWriter writer; int indentation = 0; - Stack arrayCount = new(); + readonly Stack arrayCount = new(); public void Dispose() { diff --git a/ValveKeyValue/ValveKeyValue/Serialization/KeyValues3/KV3TextSerializer.cs b/ValveKeyValue/ValveKeyValue/Serialization/KeyValues3/KV3TextSerializer.cs index 715f8bea..db6359bc 100644 --- a/ValveKeyValue/ValveKeyValue/Serialization/KeyValues3/KV3TextSerializer.cs +++ b/ValveKeyValue/ValveKeyValue/Serialization/KeyValues3/KV3TextSerializer.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections.Generic; -using System.IO; using System.Text; using ValveKeyValue.Abstraction; @@ -23,7 +20,7 @@ public KV3TextSerializer(Stream stream) readonly TextWriter writer; int indentation = 0; - Stack inArray = new(); + readonly Stack inArray = new(); bool IsInArray => inArray.Count > 0 && inArray.Peek(); @@ -171,8 +168,10 @@ void WriteValue(KVValue value) void WriteBinaryBlob(KVBinaryBlob value) { + var bytes = value.Bytes.Span; + // TODO: Verify this against Valve - if (value.Bytes.Length > 32) + if (bytes.Length > 32) { writer.WriteLine(); WriteIndentation(); @@ -184,18 +183,20 @@ void WriteBinaryBlob(KVBinaryBlob value) indentation++; WriteIndentation(); - var count = 0; + var i = 0; - foreach (var oneByte in value.Bytes) + for (; i < bytes.Length; i++) { - writer.Write(oneByte.ToString("X2")); + var b = bytes[i]; + writer.Write(HexStringHelper.HexToCharUpper(b >> 4)); + writer.Write(HexStringHelper.HexToCharUpper(b)); - if (++count % 32 == 0) + if (i > 0 && i % 32 == 0) { writer.WriteLine(); WriteIndentation(); } - else if (count != value.Bytes.Length) + else if (i != bytes.Length - 1) { writer.Write(' '); } @@ -203,7 +204,7 @@ void WriteBinaryBlob(KVBinaryBlob value) indentation--; - if (count % 32 != 0) + if (i % 32 != 0) { writer.WriteLine(); WriteIndentation(); diff --git a/ValveKeyValue/ValveKeyValue/Utils.cs b/ValveKeyValue/ValveKeyValue/Utils.cs deleted file mode 100644 index 5d4f8282..00000000 --- a/ValveKeyValue/ValveKeyValue/Utils.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Globalization; - -namespace ValveKeyValue -{ - internal class Utils - { - // TODO: Need to figure out whether Array.Reverse is actually correct for kv1 - public static byte[] ParseHexStringAsByteArrayNoReverse(string hexadecimalRepresentation) - { - Require.NotNull(hexadecimalRepresentation, nameof(hexadecimalRepresentation)); - - var data = new byte[hexadecimalRepresentation.Length / 2]; - for (var i = 0; i < data.Length; i++) - { - var currentByteText = hexadecimalRepresentation.Substring(i * 2, 2); - data[i] = byte.Parse(currentByteText, NumberStyles.HexNumber, CultureInfo.InvariantCulture); - } - - return data; - } - - public static byte[] ParseHexStringAsByteArray(string hexadecimalRepresentation) - { - Require.NotNull(hexadecimalRepresentation, nameof(hexadecimalRepresentation)); - - var data = new byte[hexadecimalRepresentation.Length / 2]; - for (var i = 0; i < data.Length; i++) - { - var currentByteText = hexadecimalRepresentation.Substring(i * 2, 2); - data[i] = byte.Parse(currentByteText, NumberStyles.HexNumber, CultureInfo.InvariantCulture); - } - - if (BitConverter.IsLittleEndian) - { - Array.Reverse(data); - } - - return data; - } - } -}