Esempio n. 1
0
        void KthuraCheck(string map)
        {
            var mapfile  = $"{Old["Maps"]}/{map}";
            var modified = false;

            Print($"Checking Kthura map: {map}");
            Print($"= File: {mapfile}");
            var jd = JCR6.Dir(mapfile);

            foreach (var e in jd.Entries.Values)
            {
                if (e.Storage == "lzma")
                {
                    modified = true;
                    Print($"  = Entry {e.Entry} was packed with lzma, which is not (yet) supported in the new Kthura. So a repack is in order");
                }
            }
            if (modified)
            {
                //if (true) {
                Print("= Repacking in zlib");
                var ed = new SortedDictionary <string, byte[]>();
                foreach (var e in jd.Entries.Values)
                {
                    Print($"  = Reading: {e.Entry}");
                    ed[e.Entry] = jd.JCR_B(e.Entry);
                }
                var st = $"[IGNORECASE]\nLABELS=NO\nTAGS=NO\n\n[Save]\nStorage=zlib\n";
                ed["Options"] = new byte[st.Length];
                for (int i = 0; i < st.Length; ++i)
                {
                    ed["Options"][i] = (byte)st[i];
                }
                Print("= Saving new map");
                var jc = new TJCRCreate(mapfile, "zlib");
                foreach (var e in ed)
                {
                    Print($"  = Writing: {e.Key}");
                    jc.AddBytes(e.Value, e.Key, "zlib");
                }
                Print("= Finalizing");
                jc.Close();
            }
            else
            {
                Print("= Map appears to be in order. No changes needed!");
            }
        }
Esempio n. 2
0
        public Void()
        {
            graphics = new GraphicsDeviceManager(this);
            graphics.PreferredBackBufferWidth  = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width - 5;
            graphics.PreferredBackBufferHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height - 100;

            try {
                new JCR6_lzma();
                JCR = JCR6.Dir($"{qstr.StripExt(MKL.MyExe)}.jcr"); Assert(JCR, "Void.jcr has not been properly loaded!");
            } catch (Exception QuelleCatastrophe) {
#if DEBUG
                FatalError($"Exception Thrown:\n{QuelleCatastrophe.Message}\n\n{QuelleCatastrophe.StackTrace}");
#else
                FatalError($"Exception Thrown:\n{QuelleCatastrophe.Message}");
#endif
            }

            Content.RootDirectory = "Content";
        }
Esempio n. 3
0
        public override void Run(FlagParse fp)
        {
            if (fp.Args.Length == 1 || fp.GetBool("h"))
            {
                QCol.Green("Extract files from a JCR file! Available switches are:\n\n");
                QCol.Yellow("-nx             "); QCol.Cyan("No eXternals. This means that any file imported from external JCR files will be ignored\n");
                QCol.Yellow("-ow             "); QCol.Cyan("Overwrite existing files\n");
                QCol.Yellow("-nodir          "); QCol.Cyan("Remove paths from file names\n");
                QCol.Yellow("-nac            "); QCol.Cyan("No auto-creation of new directories if needed\n");
                QCol.Yellow("-output <path>  "); QCol.Cyan("Define output path\n");
                QCol.Magenta("\n\nWhat is important to note is that JCR6 was never set up as a real archiver like ZIP, RAR and 7z.\nIt has therefore features that ZIP, RAR, 7z nor any other archiver has.\n\nIt also lacks features the others have.\n\nExtracting was never a full feature of JCR6, but was rather added for completeness sake.\nExtracting files from it can therefore have some funny results.\n\n");
                return;
            }
            var nx         = fp.GetBool("nx");
            var ow         = fp.GetBool("ow");
            var nodir      = fp.GetBool("nodir");
            var autocreate = fp.GetBool("nac");
            var outdir     = fp.GetString("output");

            if (outdir != "")
            {
                outdir = outdir.Replace("\\", "/");
                if (!qstr.Suffixed(outdir, "/"))
                {
                    outdir += "/";
                }
            }
            QCol.Doing("Reading", fp.Args[1]);
            var jcr = JCR6.Dir(fp.Args[1]);

            if (JCR6.JERROR != "")
            {
                QCol.QuickError($"JCR6 Error: {JCR6.JERROR}");
                return;
            }
            try {
                var skipreason = "";
                var allow      = true;
                var offsets    = new Dictionary <string, List <TJCREntry> >();
                var alias      = aliashanding.Ignore;
                void skip(string reason)
                {
                    if (skipreason != "")
                    {
                        skipreason += "; ";
                    }
                    skipreason += reason;
                    allow       = false;
                }
                var shared = false;
                foreach (TJCREntry Ent in jcr.Entries.Values)
                {
                    var tag = $"{Ent.MainFile}:{Ent.Offset}";
                    if (!offsets.ContainsKey(tag))
                    {
                        offsets[tag] = new List <TJCREntry>();
                    }
                    else
                    {
                        shared = true;
                    }
                    offsets[tag].Add(Ent);
                }
                if (shared)
                {
                    Console.Beep();
                    QCol.Red("\n\nWARNING!\n");
                    QCol.Yellow("This resource has some shared-references or aliases as they are properly called in JCR6.\n");
                    QCol.Yellow("Extracting from this file can therefore create tons of duplicate files, as JCR6 cannot tell which entry is more relevant than others.\n");
                    QCol.Yellow("It's strongly recommended to extract files from this resource unless you are sure about what you are doing and what the consequences are and how to deal with them\n");
                    QCol.Cyan("1 = Continue, but ask about any files that has aliases, what to do with them\n");
                    QCol.Cyan("2 = Continue, but skip all files with aliases\n");
                    QCol.Cyan("3 = Continue, and just let the duplicate files come, I don't fear them!\n");
                    QCol.Cyan("Q = Cancel this operation\n");
                    QCol.Magenta("What do you want to do? "); QCol.Green("");
                    {
                        var loop = true;
                        do
                        {
                            var ch = Console.ReadKey();
                            switch (ch.KeyChar)
                            {
                            case '1': alias = aliashanding.Ask; loop = false; break;

                            case '2': alias = aliashanding.Skip; loop = false; break;

                            case '3': alias = aliashanding.Ignore; loop = false; break;

                            case 'q':
                            case 'Q': return;
                            }
                        } while (loop);
                        Console.WriteLine($" -- {alias}");
                    }
                }
                foreach (TJCREntry Ent in jcr.Entries.Values)
                {
                    allow      = true;
                    skipreason = "";
                    // can we do this?
                    var source = Ent.Entry;
                    var target = Ent.Entry;
                    var tag    = $"{Ent.MainFile}:{Ent.Offset}";
                    if (!JCR6.CompDrivers.ContainsKey(Ent.Storage))
                    {
                        skip($"Unknown compression method ({Ent.Storage})");
                    }
                    if (offsets[tag].Count > 1)
                    {
                        switch (alias)
                        {
                        case aliashanding.Skip: skip($"Offset reference as {offsets[tag].Count} entries, and system has been set to skip those"); break;

                        case aliashanding.Ask: {
                            Console.Beep();
                            QCol.Red($"Entry {Ent.Entry} has been aliased.\n");
                            foreach (TJCREntry aliasentry in offsets[tag])
                            {
                                QCol.Magenta("= "); QCol.Cyan($"{aliasentry.Entry}\n");
                            }
                            QCol.Green("Extract ? <Y/N> ");
                            do
                            {
                                var d = Console.ReadKey().KeyChar;
                                if (d == 'Y' || d == 'y')
                                {
                                    break;
                                }
                                if (d == 'N' || d == 'n')
                                {
                                    skip("User decided not to extract"); break;
                                }
                            } while (true);
                            Console.Write("\r");
                            break;
                        }
                        }
                    }
                    if (Ent.MainFile != fp.Args[1] && nx)
                    {
                        skip("No Externals");
                    }
                    if (nodir)
                    {
                        target = qstr.StripDir(target);
                    }
                    target = $"{outdir}{target}";
                    if (!Directory.Exists(qstr.ExtractDir(target)) && !autocreate)
                    {
                        Console.Beep();
                        QCol.Red($"{target}! ");
                        QCol.Yellow($"Create directory {qstr.ExtractDir(target)} ? <Y/N> ");
                        do
                        {
                            var d = Console.ReadKey().KeyChar;
                            if (d == 'Y' || d == 'y')
                            {
                                break;
                            }
                            if (d == 'N' || d == 'n')
                            {
                                skip("User decided not to extract"); break;
                            }
                        } while (true);
                        Console.Write("\n");
                    }
                    if (File.Exists(target) && (!ow))
                    {
                        Console.Beep();
                        QCol.Red($"{target} exists! ");
                        QCol.Yellow($"Overwrite ? <Y/N> ");
                        do
                        {
                            var d = Console.ReadKey().KeyChar;
                            if (d == 'Y' || d == 'y')
                            {
                                break;
                            }
                            if (d == 'N' || d == 'n')
                            {
                                skip("User decided not to extract"); break;
                            }
                        } while (true);
                        Console.Write("\n");
                    }
                    if (allow)
                    {
                        QCol.Doing("Extracting", target, "\r");
                        Directory.CreateDirectory(qstr.ExtractDir(target));
                        var b = jcr.JCR_B(source);
                        QuickStream.SaveBytes(target, b);
                        QCol.Doing(" Extracted", target);
                    }
                    else
                    {
                        QCol.Doing("   Skipped", target, "\t"); QCol.Red($"{skipreason}\n");
                    }
                }
            } catch (Exception e) {
                QCol.QuickError($".NET Error: {e.Message}");
#if DEBUG
                QCol.Magenta(e.StackTrace);
#endif
            }
        }
Esempio n. 4
0
        public override void Run(FlagParse fp)
        {
            var ShowXStuff = fp.GetBool("x");
            var ShowAlias  = fp.GetBool("a");
            var ShowAllDat = fp.GetBool("xd");

            if (fp.Args.Length == 1)
            {
                QCol.Green("Verboses the files in a JCR resource:\n\n");
                QCol.Yellow("-x              "); QCol.Cyan("Show notes and author (if available)\n");
                QCol.Yellow("-a              "); QCol.Cyan("List out all aliases");
                QCol.Yellow("-xd             "); QCol.Cyan("Show all entry variable settings");
                return;
            }
            if (fp.Args.Length > 2)
            {
                QCol.QuickError("Only ONE file please!");
                return;
            }
            var jcr = JCR6.Dir(fp.Args[1]);

            if (jcr == null)
            {
                QCol.QuickError(JCR6.JERROR); return;
            }
            { // Resources
                var ResCount = new TMap <string, int>();
                var CmpCount = new TMap <string, int>();
                foreach (TJCREntry ent in jcr.Entries.Values)
                {
                    ResCount[ent.MainFile]++;
                    CmpCount[ent.Storage]++;
                }
                XPrint(15, ConsoleColor.White, "Type");
                XPrint(9, ConsoleColor.White, "Entries", Just.Right);
                XPrint(10, ConsoleColor.White, " Resource:"); Console.WriteLine();
                XPrint(15, ConsoleColor.White, "====");
                XPrint(9, ConsoleColor.White, " =======", Just.Right);
                XPrint(10, ConsoleColor.White, " ========="); Console.WriteLine();
                foreach (string k in ResCount.Keys)
                {
                    var rec = JCR6.Recognize(k);
                    if (rec != "NONE")
                    {
                        XPrint(15, ConsoleColor.Blue, JCR6.FileDrivers[rec].name);
                        XPrint(9, ConsoleColor.Cyan, ResCount[k]);
                        Console.ForegroundColor = ConsoleColor.White;
                        Console.WriteLine($" {k}");
                    }
                }
                Console.WriteLine();
                XPrint(20, ConsoleColor.White, "Storage Method");
                XPrint(10, ConsoleColor.White, "Used", Just.Right); Console.WriteLine();
                XPrint(20, ConsoleColor.White, "==============");
                XPrint(10, ConsoleColor.White, "====", Just.Right); Console.WriteLine();
                foreach (string k in CmpCount.Keys)
                {
                    XPrint(20, ConsoleColor.Blue, k);
                    XPrint(10, ConsoleColor.Cyan, CmpCount[k], Just.Right);
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.WriteLine();
                }
            }
            Console.WriteLine();
            // Comments
            foreach (string name in jcr.Comments.Keys)
            {
                QCol.White($"{name}\n");
                for (int i = 0; i < name.Length; i++)
                {
                    QCol.White("=");
                }
                QCol.Yellow($"\n{jcr.Comments[name]}\n\n");
            }
            // Blocks (if any)
            //if (jcr.Blocks.Count>0) {
            bool bfirst = true;

            foreach (var B in jcr.Blocks.Values)
            {
                if (bfirst)
                {
                    bfirst = false;
                    Console.WriteLine();
                    XPrint(5, ConsoleColor.White, "Block", Just.Right); WhiteSpace(2);
                    XPrint(10, ConsoleColor.White, "Compressed", Just.Right); WhiteSpace(2);
                    XPrint(10, ConsoleColor.White, "Size", Just.Right); WhiteSpace(2);
                    XPrint(5, ConsoleColor.White, "Ratio", Just.Right); WhiteSpace(2);
                    XPrint(7, ConsoleColor.White, "Storage"); Console.WriteLine();
                    XPrint(5, ConsoleColor.White, "=====", Just.Right); WhiteSpace(2);
                    XPrint(10, ConsoleColor.White, "==========", Just.Right); WhiteSpace(2);
                    XPrint(10, ConsoleColor.White, "====", Just.Right); WhiteSpace(2);
                    XPrint(5, ConsoleColor.White, "=====", Just.Right); WhiteSpace(2);
                    XPrint(7, ConsoleColor.White, "======="); Console.WriteLine();
                }
                XPrint(5, ConsoleColor.Blue, B.ID); WhiteSpace(2);
                XPrint(10, ConsoleColor.Green, B.CompressedSize); WhiteSpace(2);
                XPrint(10, ConsoleColor.Red, B.Size); WhiteSpace(2);
                XPrint(5, ConsoleColor.Magenta, $"{B.Ratio}%", Just.Right); WhiteSpace(2);
                XPrint(7, ConsoleColor.Yellow, B.Storage); Console.WriteLine();
            }
            //foreach (var BK in jcr.Blocks.Keys) Console.WriteLine(BK);

            //}
            // Entries
            Console.WriteLine();
            XPrint(15, ConsoleColor.White, "Kind"); WhiteSpace(2);
            XPrint(10, ConsoleColor.White, "Compressed", Just.Right); WhiteSpace(2);
            XPrint(10, ConsoleColor.White, "Size", Just.Right); WhiteSpace(2);
            XPrint(5, ConsoleColor.White, "Ratio", Just.Right); WhiteSpace(2);
            XPrint(7, ConsoleColor.White, "Storage"); WhiteSpace(2);
            Console.WriteLine("Entry");
            XPrint(15, ConsoleColor.White, "===="); WhiteSpace(2);
            XPrint(10, ConsoleColor.White, "==========", Just.Right); WhiteSpace(2);
            XPrint(10, ConsoleColor.White, "====", Just.Right); WhiteSpace(2);
            XPrint(5, ConsoleColor.White, "=====", Just.Right); WhiteSpace(2);
            XPrint(7, ConsoleColor.White, "======="); WhiteSpace(2);
            Console.WriteLine("=====");
            foreach (TJCREntry ent in jcr.Entries.Values)
            {
                Console.BackgroundColor = ConsoleColor.Black;
                if (ent.MainFile != fp.Args                    [1].Replace("\\", "/"))
                {
                    Console.BackgroundColor = ConsoleColor.DarkBlue;
                }
                XPrint(15, ConsoleColor.Blue, FTypes[qstr.ExtractExt(ent.Entry).ToLower()]); WhiteSpace(2);
                if (ent.Block == 0)
                {
                    XPrint(10, ConsoleColor.Green, ent.CompressedSize);
                }
                else
                {
                    XPrint(10, ConsoleColor.DarkGreen, $"Block: {ent.Block}");
                }
                WhiteSpace(2);
                XPrint(10, ConsoleColor.Red, ent.Size); WhiteSpace(2);
                if (ent.Block == 0)
                {
                    XPrint(5, ConsoleColor.Magenta, ent.Ratio, Just.Right);
                }
                else
                {
                    XPrint(5, ConsoleColor.Magenta, "");
                } WhiteSpace(2);
                XPrint(7, ConsoleColor.Yellow, ent.Storage); WhiteSpace(2);
                Console.ForegroundColor = ConsoleColor.White;
                Console.WriteLine(ent.Entry);
                if (ShowXStuff)
                {
                    if (ent.Author != "")
                    {
                        QCol.Doing("\tAuthor", ent.Author);
                    }
                    if (ent.Notes != "")
                    {
                        QCol.Green($"{ent.Notes}\n");
                    }
                }
                if (ShowAlias)
                {
                    foreach (string AlFile in jcr.Aliases(ent))
                    {
                        QCol.Doing("\tAlias", AlFile);
                    }
                }
                if (ShowAllDat)
                {
                    foreach (string k in ent.databool.Keys)
                    {
                        QCol.Magenta("\tbool   "); QCol.Yellow(k); QCol.White(" = "); if (ent.databool[k])
                        {
                            QCol.Green("True\n");
                        }
                        else
                        {
                            QCol.Red("False\n");
                        }
                    }
                    foreach (string k in ent.datastring.Keys)
                    {
                        QCol.Magenta("\tstring "); QCol.Yellow(k); QCol.White(" = "); QCol.Green($"\"{ent.datastring[k]}\"\n");
                    }
                    foreach (string k in ent.dataint.Keys)
                    {
                        QCol.Magenta("\tint    "); QCol.Yellow(k); QCol.White(" = "); QCol.Cyan($"{ent.dataint[k]}\n");
                    }
                }
            }
        }
Esempio n. 5
0
File: F_Add.cs Progetto: jcr6/NJCR
        public void Go()
        {
            // Create or update?
            TJCRCreate jout;
            var        temp = $"{qstr.ExtractDir(jcrfile)}/{qstr.md5($"{jcrfile}.{DateTime.Now.ToString()}")}.$jcr";
            TJCRDIR    jtmp = null;

            if (updating)
            {
                jout = new TJCRCreate(temp, filetablecompression, sig);
            }
            else
            {
                jout = new TJCRCreate(jcrfile, filetablecompression, sig);
            }
            if (jout == null || jout.mystream == null)
            {
                QCol.QuickError($"Error creating JCR file >> {JCR6.JERROR}");
                return;
            }


            // Add Comments
            foreach (string n in Comments.Keys)
            {
                QCol.Doing("Comment", n);
                jout.AddComment(n, Comments[n]);
            }

            // Add Dependencies
            foreach (var d in Imports)
            {
                QCol.Doing("Import", d);
                jout.Import(d);
            }
            foreach (var d in Requires)
            {
                QCol.Doing("Require", d);
                jout.Require(d);
            }



            // Add files
            foreach (Fil2Add aFile in Jiffy)
            {
                try {
                    if (nomerge || JCR6.Recognize(aFile.source) == "NONE")
                    {
                        QCol.Doing("Adding", aFile.source, "\r");
                        jout.AddFile(aFile.source, aFile.target, aFile.storage, aFile.author, aFile.notes);
                        //Console.WriteLine("\nBefore AfterAdd\n");
#if DEBUG
                        QCol.Doing("TARGET:", $"{aFile.target}=>{aFile.TARGET}");
#endif
                        var E = jout.Entries[aFile.TARGET];
                        AfterAdd(E, aFile);
                        //Console.WriteLine("\nAfter AfterAdd\n");
                    }
                    else
                    {
                        QCol.Doing("Merging", aFile.source);
                        var merge = JCR6.Dir(aFile.source);
                        foreach (TJCREntry ent in merge.Entries.Values)
                        {
                            QCol.Doing("Adding", "", "");
                            QCol.Magenta($"{aFile.source}/");
                            QCol.Cyan($"{ent.Entry}\r");
                            var tar = $"{aFile.target}/{ent.Entry}";
                            if (puremerge)
                            {
                                jout.JCRCopy(merge, ent.Entry, tar);
                            }
                            else
                            {
                                var buf = merge.JCR_B(ent.Entry);
                                jout.AddBytes(buf, tar, aFile.storage, ent.Author, ent.Notes);
                            }
                            //var E = jout.Entries[tar.ToUpper()];
                            var E = jout.LastAddedEntry;
                            AfterAdd(E, aFile);
                        }
                    }
                } catch (Exception crap) {
                    QCol.Red("     Failed:\n");
                    if (JCR6.JERROR != "")
                    {
                        QCol.QuickError($"JCR6: {JCR6.JERROR}");
                    }
                    QCol.QuickError($".NET: {crap.Message}");
#if DEBUG
                    QCol.Magenta($"{crap.StackTrace}\n\n");
#endif
                }
            }

            // Process aliases
            //foreach(string ori in AliasList.Keys) {
            foreach (SAlias SAL in AliasList)
            {
                QCol.Yellow("Alias: ");
                QCol.Red(SAL.ori);
                QCol.White(" => ");
                QCol.Green(SAL.tar);
                jout.Alias(SAL.ori, SAL.tar);
                QCol.White("\n");
            }

            // Reorganize Files
            if (updating)
            {
                try {
                    QCol.Doing("Reorganizing", "Data");
                    jtmp = JCR6.Dir(jcrfile);
                    if (jtmp == null)
                    {
                        throw new Exception($"JCR failed to analyse the old archive: {JCR6.JERROR}");
                    }
                    var indicator = 0;
                    foreach (TJCREntry entry in jtmp.Entries.Values)
                    {
                        indicator++;
                        if (indicator % 5 == 0)
                        {
                            QCol.Blue("\r                \r.\b");
                        }
                        else
                        {
                            QCol.Blue(".\b");
                        }
                        if (!jout.Entries.ContainsKey(entry.Entry.ToUpper()))
                        {
                            QCol.Green("O");
                            jout.JCRCopy(jtmp, entry.Entry);
                        }
                        else
                        {
                            QCol.Red("X");
                        }
                    }
                    Console.WriteLine();
                } catch (Exception well) {
                    QCol.QuickError(well.Message);
                }
            }

            // Add dependency requests
            // TODO: Dependency requests

            // Closure and overwrite old JCR file if applicable.
            QCol.Doing("Finalizing", jcrfile);
            jout.Close();
            if (updating)
            {
                try {
                    File.Delete(jcrfile);
                    File.Move(temp, jcrfile);
                } catch (Exception E) {
                    QCol.QuickError(E.Message);
                }
            }
        }