public void Add(IFileSystemProvider fss)
 {
     Providers.Add(fss);
     foreach (var fs in fss.GetFileSystems())
     {
         FileSystems.Add(fs);
     }
 }
示例#2
0
 /// <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);
         }
     }
 }
示例#3
0
        /// <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);
            }
        }
示例#4
0
        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);
        }
示例#5
0
        /// <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);
 }