public static void ToBinaryFile(DataNode mainNode, string fileName, DataNodeBinary.BinaryFormat format = DataNodeBinary.BinaryFormat.Encrypted)
 {
     using (BinaryWriter binaryWriter = new BinaryWriter(File.Open(fileName, FileMode.Create)))
     {
         DataNodeBinary.ToBinaryStream(mainNode, binaryWriter, format);
     }
 }
 private static void WriteSimpleFormat(DataNode mainNode, BinaryWriter writer)
 {
     writer.Write(1);
     DataNodeBinary.WriteDataToBinary(mainNode, writer, null);
     writer.Write((byte)5);
     writer.Flush();
 }
        public static DataNode FromBinaryStream(BinaryReader reader)
        {
            string text = reader.ReadString();

            if (text != "DEF2")
            {
                Debug.LogError("Unknown header " + text);
                return(null);
            }
            int num = reader.ReadInt32();

            switch (num)
            {
            case 1:
                return(DataNodeBinary.ReadFromBinary(reader, null));

            case 2:
                return(DataNodeBinary.ReadCompressed(reader));

            case 3:
                return(DataNodeBinary.ReadEncrypted(reader));

            default:
                Debug.LogError("Unknown version " + num);
                return(null);
            }
        }
 private static DataNode ReadContentNode(BinaryReader br, List <string> header)
 {
     return(new DataNode(DataNodeBinary.ReadString(br, header))
     {
         Content = DataNodeBinary.ReadString(br, header)
     });
 }
        private static DataNode ReadEncrypted(BinaryReader reader)
        {
            DataNode result = null;

            using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
            {
                rijndaelManaged.Key = DataNodeBinary.m_EncryptKey;
                rijndaelManaged.IV  = DataNodeBinary.m_EncryptVector;
                ICryptoTransform cryptoTransform = rijndaelManaged.CreateDecryptor(rijndaelManaged.Key, rijndaelManaged.IV);
                CryptoStream     input           = new CryptoStream(reader.BaseStream, cryptoTransform, CryptoStreamMode.Read);
                BinaryReader     binaryReader    = new BinaryReader(input);
                int num = binaryReader.ReadInt32();
                switch (num)
                {
                case 1:
                    result = DataNodeBinary.ReadFromBinary(binaryReader, null);
                    break;

                case 2:
                    result = DataNodeBinary.ReadCompressed(binaryReader);
                    break;

                case 3:
                    Debug.LogError("Double encryption!!!");
                    break;

                default:
                    Debug.LogError("Unknown version " + num);
                    break;
                }
                cryptoTransform.Dispose();
            }
            return(result);
        }
        private static void WriteCompressedFormat(DataNode mainNode, BinaryWriter writer)
        {
            writer.Write(2);
            Dictionary <string, int> header = DataNodeBinary.WriteCompressedHeader(mainNode, writer);

            DataNodeBinary.WriteDataToBinary(mainNode, writer, header);
            writer.Write((byte)5);
            writer.Flush();
        }
        private static DataNode ReadCompressed(BinaryReader reader)
        {
            List <string> list = DataNodeBinary.ReadHeader(reader);

            if (list == null)
            {
                return(null);
            }
            return(DataNodeBinary.ReadFromBinary(reader, list));
        }
 private static void WriteNodeName(DataNode node, BinaryWriter bw, Dictionary <string, int> header)
 {
     if (header == null)
     {
         bw.Write(node.Name);
     }
     else
     {
         DataNodeBinary.WriteCachedString(node.Name, bw, header);
     }
 }
 public static byte[] ToBinaryBytes(DataNode mainNode, DataNodeBinary.BinaryFormat format = DataNodeBinary.BinaryFormat.Encrypted)
 {
     byte[] result;
     using (MemoryStream memoryStream = new MemoryStream(65536))
     {
         using (BinaryWriter binaryWriter = new BinaryWriter(memoryStream))
         {
             DataNodeBinary.ToBinaryStream(mainNode, binaryWriter, format);
             result = memoryStream.ToArray();
         }
     }
     return(result);
 }
        private static DataNode ReadSubNodes(BinaryReader br, bool isList, List <string> header)
        {
            DataNode dataNode = new DataNode(DataNodeBinary.ReadString(br, header));

            dataNode.IsList = isList;
            int num = br.ReadInt32();

            for (int i = 0; i < num; i++)
            {
                DataNode node = DataNodeBinary.ReadFromBinary(br, header);
                dataNode.AddNode(node);
            }
            return(dataNode);
        }
        private static Dictionary <string, int> WriteCompressedHeader(DataNode mainNode, BinaryWriter writer)
        {
            int totalCount = mainNode.TotalCount;
            Dictionary <string, int> dictionary = new Dictionary <string, int>(totalCount);
            List <string>            list       = new List <string>(totalCount);

            DataNodeBinary.m_HeaderIndex = 1;
            DataNodeBinary.AddToHeader(dictionary, list, mainNode);
            writer.Write(dictionary.Count);
            foreach (string current in list)
            {
                writer.Write(current);
            }
            writer.Write((byte)4);
            return(dictionary);
        }
 private static void WriteContentNode(DataNode node, BinaryWriter bw, Dictionary <string, int> header)
 {
     if (node.Nodes != null && node.Nodes.Count > 0)
     {
         throw new Exception("Node can't contain content and subnodes");
     }
     bw.Write((byte)1);
     DataNodeBinary.WriteNodeName(node, bw, header);
     if (header != null)
     {
         DataNodeBinary.WriteCachedString(node.Content, bw, header);
     }
     else
     {
         bw.Write(node.Content);
     }
 }
 private static void WriteSubNodes(DataNode node, BinaryWriter bw, Dictionary <string, int> header)
 {
     if (node.IsList)
     {
         bw.Write((byte)2);
     }
     else
     {
         bw.Write((byte)3);
     }
     DataNodeBinary.WriteNodeName(node, bw, header);
     bw.Write(node.Count);
     for (int i = 0; i < node.Nodes.Count; i++)
     {
         DataNode node2 = node.Nodes[i];
         DataNodeBinary.WriteDataToBinary(node2, bw, header);
     }
 }
 private static void AddToHeader(Dictionary <string, int> header, List <string> keys, DataNode node)
 {
     if (!string.IsNullOrEmpty(node.Name) && !header.ContainsKey(node.Name))
     {
         header.Add(node.Name, DataNodeBinary.m_HeaderIndex);
         keys.Add(node.Name);
         DataNodeBinary.m_HeaderIndex++;
     }
     if (!string.IsNullOrEmpty(node.Content) && !header.ContainsKey(node.Content))
     {
         header.Add(node.Content, DataNodeBinary.m_HeaderIndex);
         keys.Add(node.Content);
         DataNodeBinary.m_HeaderIndex++;
     }
     foreach (DataNode current in node.Nodes)
     {
         DataNodeBinary.AddToHeader(header, keys, current);
     }
 }
        public static void ToBinaryStream(DataNode mainNode, BinaryWriter writer, DataNodeBinary.BinaryFormat format)
        {
            writer.Write("DEF2");
            switch (format)
            {
            case DataNodeBinary.BinaryFormat.Simple:
                DataNodeBinary.WriteSimpleFormat(mainNode, writer);
                break;

            case DataNodeBinary.BinaryFormat.SimpleCompresssed:
                DataNodeBinary.WriteCompressedFormat(mainNode, writer);
                break;

            case DataNodeBinary.BinaryFormat.Encrypted:
                DataNodeBinary.WriteEncryptedFormat(mainNode, writer);
                break;

            default:
                throw new ArgumentOutOfRangeException("format");
            }
        }
        public static DataNode FromBinaryBytes(byte[] bytes)
        {
            DataNode result;

            try
            {
                using (MemoryStream memoryStream = new MemoryStream(bytes))
                {
                    using (BinaryReader binaryReader = new BinaryReader(memoryStream))
                    {
                        result = DataNodeBinary.FromBinaryStream(binaryReader);
                    }
                }
            }
            catch (Exception exception)
            {
                Debug.LogError("Binary bytes load failed!");
                Debug.LogException(exception);
                result = null;
            }
            return(result);
        }
 public static void WriteDataToBinary(DataNode node, BinaryWriter bw, Dictionary <string, int> header)
 {
     if (node == null)
     {
         throw new ArgumentNullException();
     }
     if (string.IsNullOrEmpty(node.Content))
     {
         if (node.Nodes == null || node.Nodes.Count == 0)
         {
             DataNodeBinary.WriteEmptyNode(node, bw, header);
         }
         else
         {
             DataNodeBinary.WriteSubNodes(node, bw, header);
         }
     }
     else
     {
         DataNodeBinary.WriteContentNode(node, bw, header);
     }
 }
        private static DataNode ReadFromBinary(BinaryReader br, List <string> header)
        {
            byte b = br.ReadByte();

            switch (b)
            {
            case 0:
                return(DataNodeBinary.ReadEmptyNode(br, header));

            case 1:
                return(DataNodeBinary.ReadContentNode(br, header));

            case 2:
                return(DataNodeBinary.ReadSubNodes(br, true, header));

            case 3:
                return(DataNodeBinary.ReadSubNodes(br, false, header));

            case 5:
                throw new Exception("Unknown node type " + b);
            }
            throw new Exception("Unknown node type " + b);
        }
 private static void WriteEncryptedFormat(DataNode mainNode, BinaryWriter writer)
 {
     writer.Write(3);
     using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
     {
         rijndaelManaged.Key = DataNodeBinary.m_EncryptKey;
         rijndaelManaged.IV  = DataNodeBinary.m_EncryptVector;
         ICryptoTransform cryptoTransform = rijndaelManaged.CreateEncryptor(rijndaelManaged.Key, rijndaelManaged.IV);
         using (MemoryStream memoryStream = new MemoryStream())
         {
             using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Write))
             {
                 BinaryWriter binaryWriter = new BinaryWriter(cryptoStream);
                 DataNodeBinary.WriteCompressedFormat(mainNode, binaryWriter);
                 binaryWriter.Flush();
                 cryptoStream.Flush();
             }
             memoryStream.Flush();
             writer.Write(memoryStream.ToArray());
         }
         cryptoTransform.Dispose();
     }
     writer.Flush();
 }
        public static DataNode FromBinaryFile(string fileName)
        {
            if (!File.Exists(fileName))
            {
                Debug.LogError("File " + fileName + " doesn't exist");
                return(null);
            }
            DataNode result;

            try
            {
                using (BinaryReader binaryReader = new BinaryReader(File.Open(fileName, FileMode.Open)))
                {
                    result = DataNodeBinary.FromBinaryStream(binaryReader);
                }
            }
            catch (Exception exception)
            {
                Debug.LogError("Binary file load failed!");
                Debug.LogException(exception);
                result = null;
            }
            return(result);
        }
 private static void WriteEmptyNode(DataNode node, BinaryWriter bw, Dictionary <string, int> header)
 {
     bw.Write((byte)0);
     DataNodeBinary.WriteNodeName(node, bw, header);
 }
 private static DataNode ReadEmptyNode(BinaryReader br, List <string> header)
 {
     return(new DataNode(DataNodeBinary.ReadString(br, header)));
 }