예제 #1
0
        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;
        }