public virtual void DownloadAddon(YomaConfig.YomaAddon addon) {
            var destination = FilesDir.GetChildFileWithName(addon.Url);
            var destinationUnpacked = Path.Combine(Destination.ToString(), addon.Path, addon.Pbo).ToAbsoluteFilePath();

            if (ConfirmFileValidity(destinationUnpacked, addon.Md5))
                return;

            var directory = destination.ParentDirectoryPath.ToString();
            directory.MakeSurePathExists();
            _downloader.DownloadFileAsync(Tools.Transfer.JoinUri(Url, addon.Url), destination);
        }
        public virtual async Task DownloadMod(YomaConfig.YomaMod mod) {
            Config.Addons.Where(x => !File.Exists(Path.Combine(Destination.ToString(), x.Path, x.Pbo))
                                     && FilesDir.GetChildFileWithName(x.Url).Exists).ForEach(UnpackAddon);
            var remoteFiles = Config.Addons
                .Where(
                    x =>
                        !ConfirmFileValidity(Path.Combine(Destination.ToString(), x.Path, x.Pbo).ToAbsoluteFilePath(),
                            x.Md5))
                .Select(x => x.Url);

            using (var statusRepo = new StatusRepo()) {
                await _downloader.DownloadFilesAsync(new[] {Url}, statusRepo,
                    remoteFiles.ToDictionary(x => new KeyValuePair<string, Func<IAbsoluteFilePath, bool>>(x, null),
                        x => (ITransferStatus) null), FilesDir).ConfigureAwait(false);
            }
        }
 public virtual void ParseConfig() {
     Config = new YomaConfig(TmpPath.GetChildFileWithName(YomaConfigFiles[0]),
         TmpPath.GetChildFileWithName(YomaConfigFiles[1]),
         TmpPath.GetChildFileWithName(YomaConfigFiles[2]));
 }
        public virtual void UnpackAddon(YomaConfig.YomaAddon addon) {
            var destination = FilesDir.GetChildFileWithName(addon.Url);
            var destinationUnpacked = Path.Combine(Destination.ToString(), addon.Path, addon.Pbo).ToAbsoluteFilePath();

            var directory = destinationUnpacked.ParentDirectoryPath;
            directory.MakeSurePathExists();

            Tools.Compression.Unpack(destination, directory, true);

            if (!ConfirmFileValidity(destinationUnpacked, addon.Md5)) {
                Tools.FileUtil.Ops.DeleteWithRetry(destination.ToString());
                Tools.FileUtil.Ops.DeleteWithRetry(destinationUnpacked.ToString());
                throw new InvalidFileHash(String.Format("{0} should be {1}", destinationUnpacked, addon.Md5));
            }
        }