Services/FS: Stubbed GetSdmcArchiveResource and GetNandArchiveResource.
Also rewritten how GetArchiveResource works so that they all use the same interface. We should decide what to do with these at some point. Related to #3131 and #3110
This commit is contained in:
		| @@ -288,6 +288,16 @@ ResultCode ArchiveManager::CreateSystemSaveData(u32 high, u32 low) { | |||||||
|     return RESULT_SUCCESS; |     return RESULT_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | ResultVal<ArchiveResource> ArchiveManager::GetArchiveResource(MediaType media_type) const { | ||||||
|  |     // TODO(Subv): Implement querying the actual size information for these storages. | ||||||
|  |     ArchiveResource resource{}; | ||||||
|  |     resource.sector_size_in_bytes = 512; | ||||||
|  |     resource.cluster_size_in_bytes = 16384; | ||||||
|  |     resource.partition_capacity_in_clusters = 0x80000; // 8GiB capacity | ||||||
|  |     resource.free_space_in_clusters = 0x80000;         // 8GiB free | ||||||
|  |     return MakeResult(resource); | ||||||
|  | } | ||||||
|  |  | ||||||
| void ArchiveManager::RegisterArchiveTypes() { | void ArchiveManager::RegisterArchiveTypes() { | ||||||
|     // TODO(Subv): Add the other archive types (see here for the known types: |     // TODO(Subv): Add the other archive types (see here for the known types: | ||||||
|     // http://3dbrew.org/wiki/FS:OpenArchive#Archive_idcodes). |     // http://3dbrew.org/wiki/FS:OpenArchive#Archive_idcodes). | ||||||
|   | |||||||
| @@ -49,6 +49,14 @@ enum class MediaType : u32 { NAND = 0, SDMC = 1, GameCard = 2 }; | |||||||
|  |  | ||||||
| typedef u64 ArchiveHandle; | typedef u64 ArchiveHandle; | ||||||
|  |  | ||||||
|  | struct ArchiveResource { | ||||||
|  |     u32 sector_size_in_bytes; | ||||||
|  |     u32 cluster_size_in_bytes; | ||||||
|  |     u32 partition_capacity_in_clusters; | ||||||
|  |     u32 free_space_in_clusters; | ||||||
|  | }; | ||||||
|  | static_assert(sizeof(ArchiveResource) == 0x10, "ArchiveResource has incorrect size"); | ||||||
|  |  | ||||||
| using FileSys::ArchiveBackend; | using FileSys::ArchiveBackend; | ||||||
| using FileSys::ArchiveFactory; | using FileSys::ArchiveFactory; | ||||||
|  |  | ||||||
| @@ -230,6 +238,13 @@ public: | |||||||
|      */ |      */ | ||||||
|     ResultCode CreateSystemSaveData(u32 high, u32 low); |     ResultCode CreateSystemSaveData(u32 high, u32 low); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Returns capacity and free space information about the given media type. | ||||||
|  |      * @param media_type The media type to obtain the information about. | ||||||
|  |      * @return The capacity information of the media type, or an error code if failed. | ||||||
|  |      */ | ||||||
|  |     ResultVal<ArchiveResource> GetArchiveResource(MediaType media_type) const; | ||||||
|  |  | ||||||
|     /// Registers a new NCCH file with the SelfNCCH archive factory |     /// Registers a new NCCH file with the SelfNCCH archive factory | ||||||
|     void RegisterSelfNCCH(Loader::AppLoader& app_loader); |     void RegisterSelfNCCH(Loader::AppLoader& app_loader); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -449,6 +449,41 @@ void FS_USER::GetFreeBytes(Kernel::HLERequestContext& ctx) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void FS_USER::GetSdmcArchiveResource(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x814, 0, 0); | ||||||
|  |  | ||||||
|  |     LOG_WARNING(Service_FS, "(STUBBED) called"); | ||||||
|  |  | ||||||
|  |     auto resource = archives.GetArchiveResource(MediaType::SDMC); | ||||||
|  |  | ||||||
|  |     if (resource.Failed()) { | ||||||
|  |         IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |         rb.Push(resource.Code()); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(5, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushRaw(*resource); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void FS_USER::GetNandArchiveResource(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x815, 0, 0); | ||||||
|  |  | ||||||
|  |     LOG_WARNING(Service_FS, "(STUBBED) called"); | ||||||
|  |  | ||||||
|  |     auto resource = archives.GetArchiveResource(MediaType::NAND); | ||||||
|  |     if (resource.Failed()) { | ||||||
|  |         IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |         rb.Push(resource.Code()); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(5, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushRaw(*resource); | ||||||
|  | } | ||||||
|  |  | ||||||
| void FS_USER::CreateExtSaveData(Kernel::HLERequestContext& ctx) { | void FS_USER::CreateExtSaveData(Kernel::HLERequestContext& ctx) { | ||||||
|     // TODO(Subv): Figure out the other parameters. |     // TODO(Subv): Figure out the other parameters. | ||||||
|     IPC::RequestParser rp(ctx, 0x0851, 9, 2); |     IPC::RequestParser rp(ctx, 0x0851, 9, 2); | ||||||
| @@ -601,16 +636,20 @@ void FS_USER::GetPriority(Kernel::HLERequestContext& ctx) { | |||||||
|  |  | ||||||
| void FS_USER::GetArchiveResource(Kernel::HLERequestContext& ctx) { | void FS_USER::GetArchiveResource(Kernel::HLERequestContext& ctx) { | ||||||
|     IPC::RequestParser rp(ctx, 0x849, 1, 0); |     IPC::RequestParser rp(ctx, 0x849, 1, 0); | ||||||
|     u32 system_media_type = rp.Pop<u32>(); |     auto media_type = rp.PopEnum<MediaType>(); | ||||||
|  |  | ||||||
|     LOG_WARNING(Service_FS, "(STUBBED) called Media type=0x{:08X}", system_media_type); |     LOG_WARNING(Service_FS, "(STUBBED) called Media type=0x{:08X}", static_cast<u32>(media_type)); | ||||||
|  |  | ||||||
|  |     auto resource = archives.GetArchiveResource(media_type); | ||||||
|  |     if (resource.Failed()) { | ||||||
|  |         IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |         rb.Push(resource.Code()); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(5, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(5, 0); | ||||||
|     rb.Push(RESULT_SUCCESS); |     rb.Push(RESULT_SUCCESS); | ||||||
|     rb.Push<u32>(512); |     rb.PushRaw(*resource); | ||||||
|     rb.Push<u32>(16384); |  | ||||||
|     rb.Push<u32>(0x80000); // 8GiB capacity |  | ||||||
|     rb.Push<u32>(0x80000); // 8GiB free |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void FS_USER::GetFormatInfo(Kernel::HLERequestContext& ctx) { | void FS_USER::GetFormatInfo(Kernel::HLERequestContext& ctx) { | ||||||
| @@ -798,8 +837,8 @@ FS_USER::FS_USER(Core::System& system) | |||||||
|         {0x08110040, nullptr, "DeleteSystemSaveData"}, |         {0x08110040, nullptr, "DeleteSystemSaveData"}, | ||||||
|         {0x08120080, &FS_USER::GetFreeBytes, "GetFreeBytes"}, |         {0x08120080, &FS_USER::GetFreeBytes, "GetFreeBytes"}, | ||||||
|         {0x08130000, nullptr, "GetCardType"}, |         {0x08130000, nullptr, "GetCardType"}, | ||||||
|         {0x08140000, nullptr, "GetSdmcArchiveResource"}, |         {0x08140000, &FS_USER::GetSdmcArchiveResource, "GetSdmcArchiveResource"}, | ||||||
|         {0x08150000, nullptr, "GetNandArchiveResource"}, |         {0x08150000, &FS_USER::GetNandArchiveResource, "GetNandArchiveResource"}, | ||||||
|         {0x08160000, nullptr, "GetSdmcFatfsError"}, |         {0x08160000, nullptr, "GetSdmcFatfsError"}, | ||||||
|         {0x08170000, &FS_USER::IsSdmcDetected, "IsSdmcDetected"}, |         {0x08170000, &FS_USER::IsSdmcDetected, "IsSdmcDetected"}, | ||||||
|         {0x08180000, &FS_USER::IsSdmcWriteable, "IsSdmcWritable"}, |         {0x08180000, &FS_USER::IsSdmcWriteable, "IsSdmcWritable"}, | ||||||
|   | |||||||
| @@ -291,6 +291,32 @@ private: | |||||||
|      */ |      */ | ||||||
|     void GetFreeBytes(Kernel::HLERequestContext& ctx); |     void GetFreeBytes(Kernel::HLERequestContext& ctx); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * FS_User::GetSdmcArchiveResource service function. | ||||||
|  |      *  Inputs: | ||||||
|  |      *      0 : 0x08140000 | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Sector byte-size | ||||||
|  |      *      3 : Cluster byte-size | ||||||
|  |      *      4 : Partition capacity in clusters | ||||||
|  |      *      5 : Available free space in clusters | ||||||
|  |      */ | ||||||
|  |     void GetSdmcArchiveResource(Kernel::HLERequestContext& ctx); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * FS_User::GetNandArchiveResource service function. | ||||||
|  |      *  Inputs: | ||||||
|  |      *      0 : 0x08150000 | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Sector byte-size | ||||||
|  |      *      3 : Cluster byte-size | ||||||
|  |      *      4 : Partition capacity in clusters | ||||||
|  |      *      5 : Available free space in clusters | ||||||
|  |      */ | ||||||
|  |     void GetNandArchiveResource(Kernel::HLERequestContext& ctx); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * FS_User::CreateExtSaveData service function |      * FS_User::CreateExtSaveData service function | ||||||
|      *  Inputs: |      *  Inputs: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user