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(); } }
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(); } }
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(); } }
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(); } }
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(); } }
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(); } }
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(); } }
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(); } }
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(); } }