Switch-Toolbox/Switch_Toolbox_Library/Compression/CompressionMenus.cs

201 lines
7.9 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Toolbox.Library.Forms;
namespace Toolbox.Library.IO
{
public class CompressionMenus
{
public static List<ToolStripMenuItem> GetMenuItems()
{
CompressionMenus menus = new CompressionMenus();
return menus.MenuItems();
}
private List<ToolStripMenuItem> MenuItems()
{
var items = new List<ToolStripMenuItem>();
items.Add(new ToolStripMenuItem("Yaz0"));
items.Add(new ToolStripMenuItem("Gzip"));
items.Add(new ToolStripMenuItem("LZSS"));
items.Add(new ToolStripMenuItem("lZMA"));
items.Add(new ToolStripMenuItem("lZ4"));
items.Add(new ToolStripMenuItem("lZ4F"));
items.Add(new ToolStripMenuItem("ZSTD"));
items.Add(new ToolStripMenuItem("ZLIB"));
items.Add(new ToolStripMenuItem("ZLIB_GZ (Hyrule Warriors)"));
SetFunctions(items);
return items;
}
private void SetFunctions(List<ToolStripMenuItem> items)
{
foreach (var item in items)
item.DropDownItems.AddRange(FunctionItems());
}
private ToolStripItem[] FunctionItems()
{
var items = new List<ToolStripItem>();
items.Add(new ToolStripMenuItem("Decompress", null, Decompress));
items.Add(new ToolStripMenuItem("Compress", null, Compress));
return items.ToArray();
}
private void Decompress(object sender, EventArgs e)
{
ToolStripMenuItem curMenu = sender as ToolStripMenuItem;
ToolStrip toolStrip = curMenu.GetCurrentParent();
var itemCheck = (curMenu.GetCurrentParent() as ToolStripDropDown).OwnerItem;
SetToolStripFunctions(itemCheck.Text, false);
}
private void Compress(object sender, EventArgs e)
{
ToolStripMenuItem curMenu = sender as ToolStripMenuItem;
ToolStrip toolStrip = curMenu.GetCurrentParent();
var itemCheck = (curMenu.GetCurrentParent() as ToolStripDropDown).OwnerItem;
SetToolStripFunctions(itemCheck.Text, true);
}
private void SetToolStripFunctions(string Name, bool Compress)
{
if (Name == "Yaz0")
OpenFileForCompression(new Yaz0(), Compress);
else if (Name == "Gzip")
OpenFileForCompression(new Gzip(), Compress);
else if (Name.Contains("LZSS"))
OpenFileForCompression(new LZSS(), Compress);
else if (Name == "lZMA")
OpenFileForCompression(new LZMA(), Compress);
else if (Name == "lZ4")
OpenFileForCompression(new lz4(), Compress);
else if (Name == "lZ4F")
OpenFileForCompression(new LZ4F(), Compress);
else if (Name == "ZSTD")
OpenFileForCompression(new Zstb(), Compress);
else if (Name == "ZLIB")
OpenFileForCompression(new Zlib(), Compress);
else if (Name.Contains("ZLIB_GZ"))
OpenFileForCompression(new ZlibGZ(), Compress);
else throw new Exception("Unimplimented Type! " + Name);
}
private void OpenFileForCompression(ICompressionFormat compressionFormat, bool Compress)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "All files(*.*)|*.*";
ofd.Multiselect = true;
if (ofd.ShowDialog() == DialogResult.OK)
{
Cursor.Current = Cursors.WaitCursor;
SaveFileForCompression(Compress, ofd.FileNames, compressionFormat);
}
}
private void SaveFileForCompression(bool Compress, string[] fileNames, ICompressionFormat compressionFormat)
{
if (fileNames.Length == 0)
return;
string ext = Compress ? ".comp" : ".dec";
if (compressionFormat.Extension.Length > 0 && Compress)
ext = compressionFormat.Extension[0];
List<string> failedFiles = new List<string>();
if (fileNames.Length > 1)
{
FolderSelectDialog ofd = new FolderSelectDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
foreach (var file in fileNames)
{
string name = Path.GetFileName(file);
using (var data = new FileStream(file, FileMode.Open, FileAccess.Read))
{
try
{
Stream stream;
if (Compress)
stream = compressionFormat.Compress(data);
else
{
compressionFormat.Identify(data, file);
stream = compressionFormat.Decompress(data);
}
if (stream != null)
{
stream.ExportToFile($"{ofd.SelectedPath}/{name}{ext}");
stream.Flush();
stream.Close();
}
}
catch (Exception ex)
{
failedFiles.Add($"{file} \n\n {ex} \n\n");
}
}
}
if (failedFiles.Count > 0)
{
string action = Compress ? "compress" : "decompress";
STErrorDialog.Show($"Some files failed to {action}! See detail list of failed files.", "Switch Toolbox",
string.Join("\n", failedFiles.ToArray()));
}
else
MessageBox.Show("Files batched successfully!");
}
}
else
{
SaveFileDialog sfd = new SaveFileDialog();
string name = Path.GetFileName(fileNames[0]);
sfd.FileName = name + ext;
sfd.Filter = "All files(*.*)|*.*";
Cursor.Current = Cursors.Default;
if (sfd.ShowDialog() == DialogResult.OK)
{
try
{
using (var data = new FileStream(fileNames[0], FileMode.Open, FileAccess.Read))
{
Stream stream;
if (Compress)
stream = compressionFormat.Compress(data);
else
{
compressionFormat.Identify(data, sfd.FileName);
stream = compressionFormat.Decompress(data);
}
if (stream != null)
{
stream.ExportToFile(sfd.FileName);
stream.Flush();
stream.Close();
MessageBox.Show($"File has been saved to {sfd.FileName}", "Save Notification");
}
}
}
catch (Exception ex)
{
string action = Compress ? "compress" : "decompress";
STErrorDialog.Show($"Failed to {action}! See details for info.", "Switch Toolbox", ex.ToString());
}
}
}
}
}
}