public void Add(IFileSystemProvider fss) { Providers.Add(fss); foreach (var fs in fss.GetFileSystems()) { FileSystems.Add(fs); } }
/// <summary> /// Constructor /// </summary> /// <param name="fileSystems">The file systems.</param> public FileSystem(IEnumerable <IFileSystem> fileSystems) { fileSystems ??= Array.Empty <IFileSystem>(); FileSystems = fileSystems.Where(x => x.GetType().Assembly != typeof(FileSystem).Assembly) .ToDictionary(x => x.Name); foreach (var FileSystem in fileSystems.Where(x => x.GetType().Assembly == typeof(FileSystem).Assembly)) { if (!FileSystems.ContainsKey(FileSystem.Name)) { FileSystems.Add(FileSystem.Name, FileSystem); } } }
/// <summary> /// This function should discover the filesystem entries /// These are normally stored in a frostbite game as "fs" /// </summary> protected override void DiscoverFileSystems() { var s_BaseLayout = Layout[0].Value as DbObject; if (s_BaseLayout == null) #if DEBUG { throw new Exception("No Superbundles found in Layout. This probably means data is corrupted or the engine you're trying to load is unsupported."); } #else { return; } #endif var s_FileSystems = s_BaseLayout["fs"].Value as DbObject; // As seen on some fb game I can't remember, fs isn't always required... if (s_FileSystems == null) { return; } for (var i = 0; i < s_FileSystems.Count; ++i) { var s_FileSystemEntry = s_FileSystems[i].Value as string; if (string.IsNullOrWhiteSpace(s_FileSystemEntry)) { continue; } var s_Entry = new FileSystemEntry(s_FileSystemEntry); // Figure out in which package this entry is in (if any). if (!FileSystem.FileExists(s_Entry.BasePath)) #if DEBUG { throw new Exception("FileSystem '" + s_FileSystemEntry + "' could not be located. Please make sure your game data is not corrupt."); } #else { return; } #endif // Check whether this entry also exists in the authoritative package. if (AuthoritativePackage != null && FileSystem.FileExists("/game" + AuthoritativePackage.Path + "/Data/" + s_FileSystemEntry)) { s_Entry.AuthoritativePackage = AuthoritativePackage; } FileSystems.Add(s_Entry); } }
public Result Add(IFileSystem fileSystem) { if (FileSystems.Count >= MaxFileSystemCount) { return(ResultFs.MultiCommitFileSystemLimit.Log()); } // Check that the file system hasn't already been added for (int i = 0; i < FileSystems.Count; i++) { if (ReferenceEquals(FileSystems[i], fileSystem)) { return(ResultFs.MultiCommitFileSystemAlreadyAdded.Log()); } } FileSystems.Add(fileSystem); return(Result.Success); }
/// <summary> /// Adds a file system to the list of file systems to be committed. /// </summary> /// <param name="fileSystem">The file system to be committed.</param> /// <returns><see cref="Result.Success"/>: The operation was successful.<br/> /// <see cref="ResultFs.MultiCommitFileSystemLimit"/>: The maximum number of file systems have been added. /// <see cref="MaxFileSystemCount"/> file systems may be added to a single multi-commit.<br/> /// <see cref="ResultFs.MultiCommitFileSystemAlreadyAdded"/>: The provided file system has already been added.</returns> public Result Add(ReferenceCountedDisposable <IFileSystemSf> fileSystem) { if (FileSystems.Count >= MaxFileSystemCount) { return(ResultFs.MultiCommitFileSystemLimit.Log()); } ReferenceCountedDisposable <IFileSystem> fsaFileSystem = null; try { Result rc = fileSystem.Target.GetImpl(out fsaFileSystem); if (rc.IsFailure()) { return(rc); } // Check that the file system hasn't already been added foreach (ReferenceCountedDisposable <IFileSystem> fs in FileSystems) { if (ReferenceEquals(fs.Target, fsaFileSystem.Target)) { return(ResultFs.MultiCommitFileSystemAlreadyAdded.Log()); } } FileSystems.Add(fsaFileSystem); fsaFileSystem = null; return(Result.Success); } finally { fsaFileSystem?.Dispose(); } }
public void Add(IFileSystem fs) { FileSystems.Add(fs); }