Example #1
0
        public static Result MountCustomStorage(this FileSystemClient fs, U8Span mountName, CustomStorageId storageId)
        {
            Result rc = fs.Impl.CheckMountName(mountName);

            if (rc.IsFailure())
            {
                return(rc);
            }

            ReferenceCountedDisposable <IFileSystemSf> fileSystem = null;

            try
            {
                using ReferenceCountedDisposable <IFileSystemProxy> fsProxy = fs.Impl.GetFileSystemProxyServiceObject();

                rc = fsProxy.Target.OpenCustomStorageFileSystem(out fileSystem, storageId);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                var fileSystemAdapter = new FileSystemServiceObjectAdapter(fileSystem);
                return(fs.Register(mountName, fileSystemAdapter));
            }
            finally
            {
                fileSystem?.Dispose();
            }
        }
Example #2
0
            static Result Mount(FileSystemClient fs, U8Span mountName, GameCardHandle handle,
                                GameCardPartition partitionId)
            {
                Result rc = fs.Impl.CheckMountNameAcceptingReservedMountName(mountName);

                if (rc.IsFailure())
                {
                    return(rc);
                }

                using ReferenceCountedDisposable <IFileSystemProxy> fsProxy = fs.Impl.GetFileSystemProxyServiceObject();

                ReferenceCountedDisposable <IFileSystemSf> fileSystem = null;

                try
                {
                    rc = fsProxy.Target.OpenGameCardFileSystem(out fileSystem, handle, partitionId);
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }

                    var fileSystemAdapter  = new FileSystemServiceObjectAdapter(fileSystem);
                    var mountNameGenerator = new GameCardCommonMountNameGenerator(handle, partitionId);
                    return(fs.Register(mountName, fileSystemAdapter, mountNameGenerator));
                }
                finally
                {
                    fileSystem?.Dispose();
                }
            }
Example #3
0
            static Result Mount(FileSystemClientImpl fs, U8Span mountName, BisPartitionId partitionId)
            {
                Result rc = fs.CheckMountNameAcceptingReservedMountName(mountName);

                if (rc.IsFailure())
                {
                    return(rc);
                }

                using ReferenceCountedDisposable <IFileSystemProxy> fsProxy = fs.GetFileSystemProxyServiceObject();

                // Nintendo doesn't use the provided rootPath
                FspPath.CreateEmpty(out FspPath sfPath);

                ReferenceCountedDisposable <IFileSystemSf> fileSystem = null;

                try
                {
                    rc = fsProxy.Target.OpenBisFileSystem(out fileSystem, in sfPath, partitionId);
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }

                    var nameGenerator     = new BisCommonMountNameGenerator(partitionId);
                    var fileSystemAdapter = new FileSystemServiceObjectAdapter(fileSystem);

                    return(fs.Fs.Register(mountName, fileSystemAdapter, nameGenerator));
                }
                finally
                {
                    fileSystem?.Dispose();
                }
            }
            static Result Mount(FileSystemClient fs, U8Span mountName, ContentStorageId storageId)
            {
                // It can take some time for the system partition to be ready (if it's on the SD card).
                // Thus, we will retry up to 10 times, waiting one second each time.
                const int maxRetries    = 10;
                const int retryInterval = 1000;

                Result rc = fs.Impl.CheckMountNameAcceptingReservedMountName(mountName);

                if (rc.IsFailure())
                {
                    return(rc);
                }

                using ReferenceCountedDisposable <IFileSystemProxy> fsProxy = fs.Impl.GetFileSystemProxyServiceObject();

                ReferenceCountedDisposable <IFileSystemSf> fileSystem = null;

                try
                {
                    for (int i = 0; i < maxRetries; i++)
                    {
                        rc = fsProxy.Target.OpenContentStorageFileSystem(out fileSystem, storageId);

                        if (rc.IsSuccess())
                        {
                            break;
                        }

                        if (!ResultFs.SystemPartitionNotReady.Includes(rc))
                        {
                            return(rc);
                        }

                        if (i == maxRetries - 1)
                        {
                            return(rc);
                        }

                        fs.Hos.Os.SleepThread(TimeSpan.FromMilliSeconds(retryInterval));
                    }

                    var fileSystemAdapter  = new FileSystemServiceObjectAdapter(fileSystem);
                    var mountNameGenerator = new ContentStorageCommonMountNameGenerator(storageId);
                    return(fs.Register(mountName, fileSystemAdapter, mountNameGenerator));
                }
                finally
                {
                    fileSystem?.Dispose();
                }
            }
Example #5
0
        private static Result MountSaveDataImpl(this FileSystemClientImpl fs, U8Span mountName, SaveDataSpaceId spaceId,
                                                ProgramId programId, UserId userId, SaveDataType type, bool openReadOnly, ushort index)
        {
            Result rc = fs.CheckMountName(mountName);

            if (rc.IsFailure())
            {
                return(rc);
            }

            using ReferenceCountedDisposable <IFileSystemProxy> fsProxy = fs.GetFileSystemProxyServiceObject();

            rc = SaveDataAttribute.Make(out SaveDataAttribute attribute, programId, type, userId, 0, index);
            if (rc.IsFailure())
            {
                return(rc);
            }

            ReferenceCountedDisposable <IFileSystemSf> fileSystem = null;

            try
            {
                if (openReadOnly)
                {
                    rc = fsProxy.Target.OpenReadOnlySaveDataFileSystem(out fileSystem, spaceId, in attribute);
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }
                }
                else
                {
                    rc = fsProxy.Target.OpenSaveDataFileSystem(out fileSystem, spaceId, in attribute);
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }
                }

                var fileSystemAdapter = new FileSystemServiceObjectAdapter(fileSystem);

                return(fs.Fs.Register(mountName, fileSystemAdapter, fileSystemAdapter, null, false, true));
            }
            finally
            {
                fileSystem?.Dispose();
            }
        }
Example #6
0
            static Result Mount(FileSystemClient fs, U8Span mountName, SaveDataSpaceId spaceId, ulong saveDataId,
                                UserId userId)
            {
                Result rc = fs.Impl.CheckMountName(mountName);

                if (rc.IsFailure())
                {
                    return(rc);
                }

                using ReferenceCountedDisposable <IFileSystemProxy> fsProxy = fs.Impl.GetFileSystemProxyServiceObject();

                rc = SaveDataAttribute.Make(out SaveDataAttribute attribute, Fs.SaveData.InvalidProgramId,
                                            SaveDataType.System, userId, saveDataId);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                ReferenceCountedDisposable <IFileSystemSf> fileSystem = null;

                try
                {
                    rc = fsProxy.Target.OpenSaveDataFileSystemBySystemSaveDataId(out fileSystem, spaceId, in attribute);
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }

                    var fileSystemAdapter = new FileSystemServiceObjectAdapter(fileSystem);

                    if (spaceId == SaveDataSpaceId.System)
                    {
                        return(fs.Register(mountName, fileSystemAdapter, fileSystemAdapter, null, false, false));
                    }
                    else
                    {
                        return(fs.Register(mountName, fileSystemAdapter));
                    }
                }
                finally
                {
                    fileSystem?.Dispose();
                }
            }
Example #7
0
            static Result Mount(FileSystemClient fs, out CodeVerificationData verificationData,
                                U8Span mountName, U8Span path, ProgramId programId)
            {
                UnsafeHelpers.SkipParamInit(out verificationData);

                Result rc = fs.Impl.CheckMountName(mountName);

                if (rc.IsFailure())
                {
                    return(rc);
                }

                if (path.IsNull())
                {
                    return(ResultFs.NullptrArgument.Log());
                }

                rc = FspPath.FromSpan(out FspPath fsPath, path);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                using ReferenceCountedDisposable <IFileSystemProxyForLoader> fsProxy =
                          fs.Impl.GetFileSystemProxyForLoaderServiceObject();

                ReferenceCountedDisposable <IFileSystemSf> fileSystem = null;

                try
                {
                    rc = fsProxy.Target.OpenCodeFileSystem(out fileSystem, out verificationData, in fsPath, programId);
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }

                    var fileSystemAdapter = new FileSystemServiceObjectAdapter(fileSystem);
                    return(fs.Register(mountName, fileSystemAdapter));
                }
                finally
                {
                    fileSystem?.Dispose();
                }
            }
Example #8
0
        private static Result MountContentImpl(FileSystemClient fs, U8Span mountName, U8Span path, ulong id,
                                               ContentType contentType)
        {
            Result rc = fs.Impl.CheckMountNameAcceptingReservedMountName(mountName);

            if (rc.IsFailure())
            {
                return(rc);
            }

            FileSystemProxyType fsType = ConvertToFileSystemProxyType(contentType);

            if (path.IsNull())
            {
                return(ResultFs.NullptrArgument.Log());
            }

            rc = FspPath.FromSpan(out FspPath fsPath, path);
            if (rc.IsFailure())
            {
                return(rc);
            }

            using ReferenceCountedDisposable <IFileSystemProxy> fsProxy = fs.Impl.GetFileSystemProxyServiceObject();

            ReferenceCountedDisposable <IFileSystemSf> fileSystem = null;

            try
            {
                rc = fsProxy.Target.OpenFileSystemWithId(out fileSystem, in fsPath, id, fsType);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                var fileSystemAdapter = new FileSystemServiceObjectAdapter(fileSystem);
                return(fs.Register(mountName, fileSystemAdapter));
            }
            finally
            {
                fileSystem?.Dispose();
            }
        }
Example #9
0
            static Result Mount(FileSystemClient fs, U8Span mountName, U8Span path)
            {
                Result rc = fs.Impl.CheckMountName(mountName);

                if (rc.IsFailure())
                {
                    return(rc);
                }

                rc = FspPath.FromSpan(out FspPath sfPath, path);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                using ReferenceCountedDisposable <IFileSystemProxy> fsProxy = fs.Impl.GetFileSystemProxyServiceObject();

                ReferenceCountedDisposable <IFileSystemSf> fileSystem = null;

                try
                {
                    rc = fsProxy.Target.OpenFileSystemWithId(out fileSystem, in sfPath, Ncm.ProgramId.InvalidId.Value,
                                                             FileSystemProxyType.Package);
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }

                    var fileSystemAdapter = new FileSystemServiceObjectAdapter(fileSystem);
                    return(fs.Register(mountName, fileSystemAdapter));
                }
                finally
                {
                    fileSystem?.Dispose();
                }
            }
Example #10
0
            static Result Mount(FileSystemClient fs, U8Span mountName, Ncm.ApplicationId applicationId)
            {
                Result rc = fs.Impl.CheckMountName(mountName);

                if (rc.IsFailure())
                {
                    return(rc);
                }

                using ReferenceCountedDisposable <IFileSystemProxy> fsProxy = fs.Impl.GetFileSystemProxyServiceObject();

                rc = SaveDataAttribute.Make(out SaveDataAttribute attribute, applicationId, SaveDataType.Bcat,
                                            Fs.SaveData.InvalidUserId, 0);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                ReferenceCountedDisposable <IFileSystemSf> fileSystem = null;

                try
                {
                    rc = fsProxy.Target.OpenSaveDataFileSystem(out fileSystem, SaveDataSpaceId.User, in attribute);
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }

                    var fileSystemAdapter = new FileSystemServiceObjectAdapter(fileSystem);
                    return(fs.Register(mountName, fileSystemAdapter));
                }
                finally
                {
                    fileSystem?.Dispose();
                }
            }