Ejemplo n.º 1
0
        /// <summary>
        /// Attempts to apply a patch of given type from a given URL or File Path via simple zip extraction.
        /// </summary>
        /// <param name="patchType"></param>
        /// <param name="path"></param>
        /// <returns></returns>
        public async Task ApplyPatch(FanPatchType patchType, string path)
        {
            var patchName = GetPatchTypeName(patchType);

            Stream buffer = await TryObtainFile(path);

            if (buffer == null)
            {
                Triggers.OnFanPatchNotFound();
                return;
            }

            Triggers.OnFanPatching(patchType.ToString());

            await Task.Run(() =>
            {
                var backupFolder = Path.Combine(Settings.BackupDirectory(), patchName);
                if (Directory.Exists(backupFolder) == false)
                {
                    Directory.CreateDirectory(backupFolder);
                }

                using (var archive = ArchiveFactory.Open(buffer))
                {
                    var reader = archive.ExtractAllEntries();
                    while (reader.MoveToNextEntry())
                    {
                        if (reader.Entry.IsDirectory)
                        {
                            continue;
                        }

                        var name   = Path.GetFileName(reader.Entry.Key);
                        var target = Path.Combine(Settings.DataWin32Directory(), name);
                        if (File.Exists(target))
                        {
                            var backup = Path.Combine(backupFolder, name);
                            File.Move(target, backup);
                        }

                        using (var file = new FileStream(target, FileMode.Create))
                        {
                            reader.WriteEntryTo(file);
                        }
                    }
                }
                buffer.Dispose();
            });

            if (patchType == FanPatchType.EnglishPatch)
            {
                Settings.EnglishPatchVersion = Path.GetFileNameWithoutExtension(path);
            }
            if (patchType == FanPatchType.EnglishLargePatch)
            {
                Settings.EnglishLargePatchVersion = Path.GetFileNameWithoutExtension(path);
            }

            Triggers.OnFanPatchSuccessful(patchName);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Gets the known, usual Tweaker backup directory.
 /// </summary>
 public static string BackupDirectory(this ITweakerSettings settings)
 {
     return(Path.Combine(settings.DataWin32Directory(), "backup"));
 }