[monkeydoc] Introduce support for versioned tree and gracefully handle old trees.
authorJérémie Laval <jeremie.laval@gmail.com>
Wed, 19 Dec 2012 17:34:37 +0000 (18:34 +0100)
committerJérémie Laval <jeremie.laval@gmail.com>
Thu, 20 Dec 2012 19:35:09 +0000 (20:35 +0100)
mcs/tools/monkeydoc/MonkeyDoc/Tree.cs

index a9b33672af8d7a91226783fc1e7388dc367257bf..b62caa02f3e37325253fdaf880d5df116c1dcbd1 100644 (file)
@@ -18,6 +18,7 @@ namespace MonkeyDoc
         */
        public class Tree
        {
+               const long CurrentVersionNumber = 1;
                public readonly HelpSource HelpSource;
        
                FileStream InputStream;
@@ -31,6 +32,7 @@ namespace MonkeyDoc
                /// </summary>
                public Tree (HelpSource hs, string filename)
                {
+                       HelpSource = hs;
                        Encoding utf8 = new UTF8Encoding (false, true);
 
                        if (!File.Exists (filename)){
@@ -45,11 +47,15 @@ namespace MonkeyDoc
                                throw new Exception ("Invalid file format");
                
                        InputStream.Position = 4;
+                       // Try to read version information
+                       if (InputReader.ReadInt32 () == -(int)'v')
+                               VersionNumber = InputReader.ReadInt64 ();
+                       else
+                               InputStream.Position -= 4;
+
                        var position = InputReader.ReadInt32 ();
                        rootNode = new Node (this, position);
                        InflateNode (rootNode);
-
-                       HelpSource = hs;
                }
 
                /// <summary>
@@ -73,7 +79,7 @@ namespace MonkeyDoc
                        Encoding utf8 = new UTF8Encoding (false, true);
                        using (FileStream output = File.OpenWrite (file)){
                                // Skip over the pointer to the first node.
-                               output.Position = 8;
+                               output.Position = 4 + 4 + 8 + 4;
                        
                                using (BinaryWriter writer = new BinaryWriter (output, utf8)) {
                                        // Recursively dump
@@ -81,6 +87,8 @@ namespace MonkeyDoc
 
                                        output.Position = 0;
                                        writer.Write (new byte [] { (byte) 'M', (byte) 'o', (byte) 'H', (byte) 'P' });
+                                       writer.Write (-(int)'v');
+                                       writer.Write (CurrentVersionNumber);
                                        writer.Write (rootNode.Address);
                                }
                        }
@@ -92,6 +100,11 @@ namespace MonkeyDoc
                        }
                }
 
+               public long VersionNumber {
+                       get;
+                       private set;
+               }
+
                static bool GoodSig (byte [] sig)
                {
                        if (sig.Length != 4)