예제 #1
0
파일: Program.cs 프로젝트: leppie/spb2xml
        static void Main(string[] args)
        {
            string simPropSearchPath = null;
            string file           = null;
            string outFileName    = null;
            string modelsDescName = null;
            bool   verbose        = false;

            // big command line loop
            for (int i = 0; i < args.Length; i++)
            {
                string s = args[i];
                if ("-h".Equals(s, StringComparison.InvariantCultureIgnoreCase))
                {
                    PrintHelp();
                    return;
                }
                else if ("-s".Equals(s, StringComparison.InvariantCultureIgnoreCase))
                {
                    if (i == (args.Length - 1))
                    {
                        Console.WriteLine("Error: must specify simprop search path");
                        return;
                    }
                    simPropSearchPath = args[++i];
                }
                else if ("-m".Equals(s, StringComparison.InvariantCultureIgnoreCase))
                {
                    if (i == (args.Length - 1))
                    {
                        Console.WriteLine("Error: must library models file path");
                        return;
                    }
                    modelsDescName = args[++i];
                }
                else if ("-v".Equals(s))
                {
                    verbose = true;
                }
                else if (file == null)
                {
                    file = s;
                }
                else if (outFileName == null)
                {
                    outFileName = s;
                }
                else
                {
                    Console.WriteLine("Error: unexpected argument {0}", s);
                    return;
                }
            }

            //
            // init simprop data
            //

            var cacheFn   = "propdefs.cache";
            var exeDir    = AppDomain.CurrentDomain.BaseDirectory;
            var cachePath = Path.Combine(exeDir, cacheFn);

            if (File.Exists(cachePath))
            {
                Console.WriteLine("Search property definition files from cache");
                using (var f = File.OpenRead(cachePath))
                {
                    var sb = (SymbolBank) new BinaryFormatter().Deserialize(f);
                    SymbolBank.Instance = sb;
                }
            }
            else
            {
                if (simPropSearchPath is null)
                {
#if DEBUG
                    simPropSearchPath = @"g:\MSFS Base\Packages\fs-base-propdefs\Propdefs\1.0\";
#else
                    Console.WriteLine("Error: MSFS not found, you should specify simprop search path with -s");
                    return;
#endif
                }

                Console.WriteLine("Search property definition files in {0}", simPropSearchPath);

                //
                // parse all propdefs
                //
                SymbolBank    sb  = SymbolBank.Instance;
                DirectoryInfo cdi = new DirectoryInfo(simPropSearchPath);
                foreach (FileInfo fi in cdi.GetFiles("*.xml"))
                {
                    if (verbose)
                    {
                        Console.WriteLine("Add property definition file {0}", fi.Name);
                    }
                    try
                    {
                        sb.AddSymbolDefinitionFile(fi.FullName);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Warning: Cannot parse property definition file {0}", fi.FullName);
                        if (verbose)
                        {
                            Console.WriteLine("\t {0}", ex.Message);
                        }
                    }
                }

                using (var f = File.Create(cachePath))
                {
                    new BinaryFormatter().Serialize(f, SymbolBank.Instance);
                }
            }

            Console.WriteLine();

            //
            // force culture to us (better printing)
            //
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

            //
            // models bank
            //
            ModelBank mb = null;
            if (modelsDescName != null)
            {
                try
                {
                    mb = new ModelBank(modelsDescName);
                    if (verbose)
                    {
                        Console.WriteLine("Read {0} models descriptions", mb.Size());
                    }
                }
                catch (Exception e)
                {
                    if (verbose)
                    {
                        Console.WriteLine("Cannot read models bank file: {0}", e.Message);
                    }
                }
            }

            if (file is null)
            {
                foreach (var f in Directory.GetFiles(".", "*.spb", SearchOption.AllDirectories))
                {
                    Decompile(f, null);
                }
            }
            else
            {
                Decompile(file, outFileName);
            }


            void Decompile(string f, string outFN)
            {
                //
                // ok for the real thing
                //
                try
                {
                    if (outFN == null)
                    {
                        // guess it from name
                        int i = f.LastIndexOf('.');
                        if (i != -1)
                        {
                            outFN = f.Substring(0, i) + ".xml";
                        }
                        else
                        {
                            outFN = f + ".xml";
                        }
                    }

                    using (Stream output = new FileStream(outFN, FileMode.Create))
                    {
                        Decompiler dec = new Decompiler(f);
                        if (mb != null)
                        {
                            dec.SetModels(mb);
                        }
                        dec.Decompile(output);
                    }

                    if (outFN != null)
                    {
                        Console.WriteLine("Wrote to {0}", outFN);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error: cannot decompile file {0} ({1})", f, e.Message);
                    if (outFN != null)
                    {
                        File.Delete(outFN);
                    }
                }
            }
        }
예제 #2
0
 public void SetModels(ModelBank mBank)
 {
     models = mBank;
 }