Server/csharp/AppToken/Model/AppTokenOptions.cs (67 lines of code) (raw):

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using AppToken.Util; namespace AppToken.Model { public class AppTokenOptions { private Dictionary<string, string> engineOptions; public AppTokenOptions() { engineOptions = new Dictionary<string, string>(); } private AppTokenOptions(Dictionary<string, string> engineOptions) { this.engineOptions = engineOptions ?? throw new ArgumentNullException(nameof(engineOptions)); } public void SetEngineOptions(Dictionary<string, string> engineOptions) { this.engineOptions = engineOptions ?? throw new ArgumentNullException(nameof(engineOptions)); } public void Pack(MemoryStream buf) { using (var writer = new BinaryWriter(buf, Encoding.UTF8, true)) { writer.Write(engineOptions != null); // Write bool for existence if (engineOptions == null) { return; } writer.Write(BigEndianUtils.GetBytesBigEndian(engineOptions.Count)); var sortedKeys = engineOptions.Keys.OrderBy(k => k).ToList(); foreach (var key in sortedKeys) { var value = engineOptions[key]; if (key == null || value == null) throw new ArgumentException("Illegal engineOptions entry"); writer.Write(BigEndianUtils.GetBytesBigEndian(key.Length)); writer.Write(Encoding.UTF8.GetBytes(key)); writer.Write(BigEndianUtils.GetBytesBigEndian(value.Length)); writer.Write(Encoding.UTF8.GetBytes(value)); } } } public static AppTokenOptions Unpack(MemoryStream buf) { var engineOptions = new Dictionary<string, string>(); using (var reader = new BinaryReader(buf, Encoding.UTF8, true)) { if (!reader.ReadBoolean()) return new AppTokenOptions(); int size = BigEndianUtils.FromBytesBigEndianToInt(reader.ReadBytes(4)); for (int i = 0; i < size; i++) { int keyLength = BigEndianUtils.FromBytesBigEndianToInt(reader.ReadBytes(4)); string key = Encoding.UTF8.GetString(reader.ReadBytes(keyLength)); int valueLength = BigEndianUtils.FromBytesBigEndianToInt(reader.ReadBytes(4)); string value = Encoding.UTF8.GetString(reader.ReadBytes(valueLength)); engineOptions.Add(key, value); } } return new AppTokenOptions(engineOptions); } } }