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!"); } }
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"; }
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 } }
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"); } } } }
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); } } }