From 7f74a3cf7db8bac33ac090f480f8ab52266ce957 Mon Sep 17 00:00:00 2001 From: morkt Date: Sat, 17 Sep 2016 17:36:39 +0400 Subject: [PATCH] moved serialization code to GameRes. --- GUI/App.xaml.cs | 18 ++------------- GameRes/FormatCatalog.cs | 48 +++++++++++++++++++++++++++++----------- 2 files changed, 37 insertions(+), 29 deletions(-) diff --git a/GUI/App.xaml.cs b/GUI/App.xaml.cs index a25d6602..dc4ce559 100644 --- a/GUI/App.xaml.cs +++ b/GUI/App.xaml.cs @@ -80,11 +80,11 @@ namespace GARbro.GUI if (string.IsNullOrEmpty (InitPath)) InitPath = Directory.GetCurrentDirectory(); - string scheme_file = Path.Combine (exe_dir, "Formats.dat"); + string scheme_file = Path.Combine (FormatCatalog.Instance.DataDirectory, "Formats.dat"); try { using (var file = File.OpenRead (scheme_file)) - DeserializeScheme (file); + FormatCatalog.Instance.DeserializeScheme (file); } catch (Exception X) { @@ -117,19 +117,5 @@ namespace GARbro.GUI if (Settings.Default.winState == System.Windows.WindowState.Minimized) Settings.Default.winState = System.Windows.WindowState.Normal; } - - void DeserializeScheme (Stream file) - { - using (var reader = new BinaryReader (file)) - { - var scheme_id = FormatCatalog.Instance.SchemeID; - var header = reader.ReadChars (scheme_id.Length); - if (!header.SequenceEqual (scheme_id)) - throw new FormatException ("Invalid serialization file"); - int version = reader.ReadInt32(); - using (var zs = new ZLibStream (file, CompressionMode.Decompress)) - FormatCatalog.Instance.DeserializeScheme (zs); - } - } } } diff --git a/GameRes/FormatCatalog.cs b/GameRes/FormatCatalog.cs index f5fe25bc..738cc9f4 100644 --- a/GameRes/FormatCatalog.cs +++ b/GameRes/FormatCatalog.cs @@ -31,6 +31,7 @@ using System.IO; using System.Linq; using GameRes.Collections; using System.Runtime.Serialization.Formatters.Binary; +using GameRes.Compression; namespace GameRes { @@ -203,19 +204,28 @@ namespace GameRes public void DeserializeScheme (Stream input) { - var bin = new BinaryFormatter(); - var db = (SchemeDataBase)bin.Deserialize (input); - if (db.Version <= CurrentSchemeVersion) - return; - - foreach (var format in Formats) + using (var reader = new BinaryReader (input, System.Text.Encoding.UTF8, true)) { - ResourceScheme scheme; - if (!db.SchemeMap.TryGetValue (format.Tag, out scheme)) - continue; - format.Scheme = scheme; + var header = reader.ReadChars (SchemeID.Length); + if (!header.SequenceEqual (SchemeID)) + throw new FormatException ("Invalid serialization file"); + int version = reader.ReadInt32(); + if (version <= CurrentSchemeVersion) + return; + } + using (var zs = new ZLibStream (input, CompressionMode.Decompress)) + { + var bin = new BinaryFormatter(); + var db = (SchemeDataBase)bin.Deserialize (zs); + + foreach (var format in Formats) + { + ResourceScheme scheme; + if (db.SchemeMap.TryGetValue (format.Tag, out scheme)) + format.Scheme = scheme; + } + CurrentSchemeVersion = db.Version; } - CurrentSchemeVersion = db.Version; } public void SerializeScheme (Stream output) @@ -230,8 +240,20 @@ namespace GameRes if (null != scheme) db.SchemeMap[format.Tag] = scheme; } - var bin = new BinaryFormatter(); - bin.Serialize (output, db); + SerializeScheme (output, db); + } + + public void SerializeScheme (Stream output, SchemeDataBase db) + { + using (var writer = new BinaryWriter (output)) + { + writer.Write (SchemeID.ToCharArray()); + writer.Write (db.Version); + writer.Flush(); + var bin = new BinaryFormatter(); + using (var zs = new ZLibStream (output, CompressionMode.Compress)) + bin.Serialize (zs, db); + } } }