コード例 #1
0
        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);
        }
コード例 #2
0
 public static FileData FromStream([NotNull] Stream data)
 {
     return(new FileData()
     {
         _data = DownloadManager.MemoryCache(data)
     });
 }
コード例 #3
0
        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));
        }
コード例 #4
0
        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
            });
        }
コード例 #5
0
        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();
        }
コード例 #6
0
        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);
                }
            }
        }