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; | ||||
| } | ||||
|  | ||||
| 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() { | ||||
|     // TODO(Subv): Add the other archive types (see here for the known types: | ||||
|     // 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; | ||||
|  | ||||
| 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::ArchiveFactory; | ||||
|  | ||||
| @@ -230,6 +238,13 @@ public: | ||||
|      */ | ||||
|     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 | ||||
|     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) { | ||||
|     // TODO(Subv): Figure out the other parameters. | ||||
|     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) { | ||||
|     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); | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.Push<u32>(512); | ||||
|     rb.Push<u32>(16384); | ||||
|     rb.Push<u32>(0x80000); // 8GiB capacity | ||||
|     rb.Push<u32>(0x80000); // 8GiB free | ||||
|     rb.PushRaw(*resource); | ||||
| } | ||||
|  | ||||
| void FS_USER::GetFormatInfo(Kernel::HLERequestContext& ctx) { | ||||
| @@ -798,8 +837,8 @@ FS_USER::FS_USER(Core::System& system) | ||||
|         {0x08110040, nullptr, "DeleteSystemSaveData"}, | ||||
|         {0x08120080, &FS_USER::GetFreeBytes, "GetFreeBytes"}, | ||||
|         {0x08130000, nullptr, "GetCardType"}, | ||||
|         {0x08140000, nullptr, "GetSdmcArchiveResource"}, | ||||
|         {0x08150000, nullptr, "GetNandArchiveResource"}, | ||||
|         {0x08140000, &FS_USER::GetSdmcArchiveResource, "GetSdmcArchiveResource"}, | ||||
|         {0x08150000, &FS_USER::GetNandArchiveResource, "GetNandArchiveResource"}, | ||||
|         {0x08160000, nullptr, "GetSdmcFatfsError"}, | ||||
|         {0x08170000, &FS_USER::IsSdmcDetected, "IsSdmcDetected"}, | ||||
|         {0x08180000, &FS_USER::IsSdmcWriteable, "IsSdmcWritable"}, | ||||
|   | ||||
| @@ -291,6 +291,32 @@ private: | ||||
|      */ | ||||
|     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 | ||||
|      *  Inputs: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user