public static FileTree Read([NotNull] Stream data, [CanBeNull] string root) { var ms = DownloadManager.MemoryCache(data); List <Func <Stream, FileTree> > funcs; lock (_loadArchive) funcs = _loadArchive.ToList(); List <Exception> exs = null; exs = new List <Exception>(); foreach (var func in funcs) { try { var result = func(DownloadManager.MemoryCache(ms)); if (result is object) { if (root is object && result is Folder folder) { return(folder.GetPath(root)); } else { return(result); } } } catch (Exception ex) { exs.Add(ex); // ignored } } throw new AggregateException("unable to extract archive", exs); }
public static FileData FromStream([NotNull] Stream data) { return(new FileData() { _data = DownloadManager.MemoryCache(data) }); }
private static ModData LoadData([NotNull] Stream stream, [CanBeNull] out Folder archive) { archive = null; try { using (var sr = new StreamReader(DownloadManager.MemoryCache(stream))) using (var jr = new JsonTextReader(sr)) return(new JsonSerializer().Deserialize <ModData>(jr) ?? throw new InvalidOperationException("failed to read metadata")); } catch (JsonReaderException) { } var contents = AssetProcessor.Load(ArchiveExtractor.Read(DownloadManager.MemoryCache(stream), null)); if (contents is File file) { return(LoadData(file.Data, out archive)); } if (!(contents is Folder folder)) { throw new InvalidOperationException(); } if (folder.TryGetFile("dvmod.json", out var dvmod)) { using (var sr = new StreamReader(dvmod.Data)) using (var jr = new JsonTextReader(sr)) return(new JsonSerializer().Deserialize <ModData>(jr) ?? throw new InvalidOperationException("failed to read metadata")); } return(GuessModData(folder)); }
public static Mod DownloadMod([NotNull] Uri uri) { if (uri is null) { throw new ArgumentNullException(nameof(uri)); } var stream = DownloadManager.Download(uri) ?? throw new FileNotFoundException("failed to download mod", uri.ToString()); stream = DownloadManager.MemoryCache(stream); var data = LoadData(stream, out var archive); if (data.Origin is null) { data.Origin = uri; } else if (data.Origin != uri) { return(DownloadMod(data.Origin)); } return(new Mod(data) { BundledFiles = archive }); }
public Stream GetStream() { if (_data != null) { return(DownloadManager.MemoryCache(_data)); } if (_file != null) { using (var fs = new FileStream(_file, FileMode.Open)) _data = DownloadManager.MemoryCache(fs); return(DownloadManager.MemoryCache(_data)); } throw new InvalidOperationException(); }
public void Apply([NotNull] string file) { if (file == _file) { return; } using (var fs = new FileStream(file, FileMode.Create)) { if (_data is object) { DownloadManager.MemoryCache(_data).CopyTo(fs); } else if (_file is object) { System.IO.File.Copy(_file, file, true); } } }