private Task <ZipThemeResults> ZipTheme_Execute(string bgmPath, bool start) { var viewModel = ViewModel; var busySavingTheme = MainResources.Busy_SavingTheme; var bmpPreview = RenderPreview(PreviewKind.Both); var task = new Task <ZipThemeResults>(() => { BusyText = busySavingTheme; var results = new ZipThemeResults { Saved = false, BGMPath = bgmPath, Data = null }; var themeName = viewModel.Info.ShortDescription; var rnd = new Random(); if (string.IsNullOrEmpty(themeName)) { var bytes = new byte[4]; rnd.NextBytes(bytes); themeName = "3DSThemeEditor-" + BitConverter.ToString(bytes); } themeName = Regex.Replace(themeName, "[^ -~]+", "_"); using (var ms = new MemoryStream()) { using (var arch = new ZipArchive(ms, ZipArchiveMode.Create)) { var bodyLz = arch.CreateEntry($"{themeName}/body_LZ.bin"); using (var tgt = bodyLz.Open()) using (var srcDec = new MemoryStream()) using (var srcCom = new MemoryStream()) { viewModel.Save(srcDec); srcDec.Position = 0; LZ11.Compress(srcDec, srcDec.Length, srcCom, true); srcCom.Position = 0; srcCom.CopyTo(tgt); } var info = arch.CreateEntry($"{themeName}/info.smdh"); using (var tgt = info.Open()) viewModel.Info.Save(tgt); var preview = arch.CreateEntry($"{themeName}/preview.png"); using (var tgt = preview.Open()) using (var src = new MemoryStream()) { var encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bmpPreview)); encoder.Save(src); src.Position = 0; src.CopyTo(tgt); } if (viewModel.Flags.BackgroundMusic) { var bgm = arch.CreateEntry($"{themeName}/BGM.BCSTM"); using (var src = File.OpenRead(results.BGMPath)) using (var tgt = bgm.Open()) src.CopyTo(tgt); } } results.Data = ms.ToArray(); results.Saved = true; #if DEBUG File.WriteAllBytes(@"C:\Temp\theme.zip", results.Data); #endif } return(results); }, TaskCreationOptions.LongRunning); if (start) { task.Start(); } return(task); }
private Task<ZipThemeResults> ZipTheme_Execute(string bgmPath, bool start) { var viewModel = ViewModel; var busySavingTheme = MainResources.Busy_SavingTheme; var bmpPreview = RenderPreview(PreviewKind.Both); var task = new Task<ZipThemeResults>(() => { BusyText = busySavingTheme; var results = new ZipThemeResults { Saved = false, BGMPath = bgmPath, Data = null }; var themeName = viewModel.Info.ShortDescription; var rnd = new Random(); if (string.IsNullOrEmpty(themeName)) { var bytes = new byte[4]; rnd.NextBytes(bytes); themeName = "3DSThemeEditor-" + BitConverter.ToString(bytes); } themeName = Regex.Replace(themeName, "[^ -~]+", "_"); using (var ms = new MemoryStream()) { using (var arch = new ZipArchive(ms, ZipArchiveMode.Create)) { var bodyLz = arch.CreateEntry($"{themeName}/body_LZ.bin"); using (var tgt = bodyLz.Open()) using (var srcDec = new MemoryStream()) using (var srcCom = new MemoryStream()) { viewModel.Save(srcDec); srcDec.Position = 0; LZ11.Compress(srcDec, srcDec.Length, srcCom, true); srcCom.Position = 0; srcCom.CopyTo(tgt); } var info = arch.CreateEntry($"{themeName}/info.smdh"); using (var tgt = info.Open()) viewModel.Info.Save(tgt); var preview = arch.CreateEntry($"{themeName}/preview.png"); using (var tgt = preview.Open()) using (var src = new MemoryStream()) { var encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bmpPreview)); encoder.Save(src); src.Position = 0; src.CopyTo(tgt); } if (viewModel.Flags.BackgroundMusic) { var bgm = arch.CreateEntry($"{themeName}/BGM.BCSTM"); using (var src = File.OpenRead(results.BGMPath)) using (var tgt = bgm.Open()) src.CopyTo(tgt); } } results.Data = ms.ToArray(); results.Saved = true; #if DEBUG File.WriteAllBytes(@"C:\Temp\theme.zip", results.Data); #endif } return results; }, TaskCreationOptions.LongRunning); if (start) task.Start(); return task; }