mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	Merge pull request #229 from Subv/ensuresavedata_impl
FS: Make EnsureSaveData create the save data if it doesn't already exist.
This commit is contained in:
		@@ -2,12 +2,15 @@
 | 
			
		||||
// Licensed under GPLv2 or any later version
 | 
			
		||||
// Refer to the license.txt file included.
 | 
			
		||||
 | 
			
		||||
#include <cinttypes>
 | 
			
		||||
#include "core/file_sys/filesystem.h"
 | 
			
		||||
#include "core/hle/ipc_helpers.h"
 | 
			
		||||
#include "core/hle/kernel/event.h"
 | 
			
		||||
#include "core/hle/service/am/am.h"
 | 
			
		||||
#include "core/hle/service/am/applet_ae.h"
 | 
			
		||||
#include "core/hle/service/am/applet_oe.h"
 | 
			
		||||
#include "core/hle/service/apm/apm.h"
 | 
			
		||||
#include "core/hle/service/filesystem/filesystem.h"
 | 
			
		||||
#include "core/hle/service/nvflinger/nvflinger.h"
 | 
			
		||||
 | 
			
		||||
namespace Service {
 | 
			
		||||
@@ -416,9 +419,24 @@ void IApplicationFunctions::PopLaunchParameter(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IApplicationFunctions::EnsureSaveData(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    LOG_WARNING(Service, "(STUBBED) called");
 | 
			
		||||
    IPC::RequestParser rp{ctx};
 | 
			
		||||
    u128 uid = rp.PopRaw<u128>();
 | 
			
		||||
 | 
			
		||||
    LOG_WARNING(Service, "(STUBBED) called uid = %016" PRIX64 "%016" PRIX64, uid[1], uid[0]);
 | 
			
		||||
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 4};
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
 | 
			
		||||
    FileSys::Path unused;
 | 
			
		||||
    auto savedata = FileSystem::OpenFileSystem(FileSystem::Type::SaveData, unused);
 | 
			
		||||
    if (savedata.Failed()) {
 | 
			
		||||
        // Create the save data and return an error indicating that the operation was performed.
 | 
			
		||||
        FileSystem::FormatFileSystem(FileSystem::Type::SaveData);
 | 
			
		||||
        // TODO(Subv): Find out the correct error code for this.
 | 
			
		||||
        rb.Push(ResultCode(ErrorModule::FS, 40));
 | 
			
		||||
    } else {
 | 
			
		||||
        rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    rb.Push<u64>(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -43,6 +43,19 @@ ResultVal<std::unique_ptr<FileSys::FileSystemBackend>> OpenFileSystem(Type type,
 | 
			
		||||
    return itr->second->Open(path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultCode FormatFileSystem(Type type) {
 | 
			
		||||
    LOG_TRACE(Service_FS, "Formatting FileSystem with type=%d", type);
 | 
			
		||||
 | 
			
		||||
    auto itr = filesystem_map.find(type);
 | 
			
		||||
    if (itr == filesystem_map.end()) {
 | 
			
		||||
        // TODO(bunnei): Find a better error code for this
 | 
			
		||||
        return ResultCode(-1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    FileSys::Path unused;
 | 
			
		||||
    return itr->second->Format(unused);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RegisterFileSystems() {
 | 
			
		||||
    filesystem_map.clear();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -44,6 +44,13 @@ ResultCode RegisterFileSystem(std::unique_ptr<FileSys::FileSystemFactory>&& fact
 | 
			
		||||
ResultVal<std::unique_ptr<FileSys::FileSystemBackend>> OpenFileSystem(Type type,
 | 
			
		||||
                                                                      FileSys::Path& path);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Formats a file system
 | 
			
		||||
 * @param type Type of the file system to format
 | 
			
		||||
 * @return ResultCode of the operation
 | 
			
		||||
 */
 | 
			
		||||
ResultCode FormatFileSystem(Type type);
 | 
			
		||||
 | 
			
		||||
/// Registers all Filesystem services with the specified service manager.
 | 
			
		||||
void InstallInterfaces(SM::ServiceManager& service_manager);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -245,6 +245,7 @@ FSP_SRV::FSP_SRV() : ServiceFramework("fsp-srv") {
 | 
			
		||||
    static const FunctionInfo functions[] = {
 | 
			
		||||
        {1, &FSP_SRV::Initalize, "Initalize"},
 | 
			
		||||
        {18, &FSP_SRV::MountSdCard, "MountSdCard"},
 | 
			
		||||
        {22, &FSP_SRV::CreateSaveData, "CreateSaveData"},
 | 
			
		||||
        {51, &FSP_SRV::MountSaveData, "MountSaveData"},
 | 
			
		||||
        {200, &FSP_SRV::OpenDataStorageByCurrentProcess, "OpenDataStorageByCurrentProcess"},
 | 
			
		||||
        {202, nullptr, "OpenDataStorageByDataId"},
 | 
			
		||||
@@ -279,6 +280,19 @@ void FSP_SRV::MountSdCard(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void FSP_SRV::CreateSaveData(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    IPC::RequestParser rp{ctx};
 | 
			
		||||
 | 
			
		||||
    auto save_struct = rp.PopRaw<std::array<u8, 0x40>>();
 | 
			
		||||
    auto save_create_struct = rp.PopRaw<std::array<u8, 0x40>>();
 | 
			
		||||
    u128 uid = rp.PopRaw<u128>();
 | 
			
		||||
 | 
			
		||||
    LOG_WARNING(Service_FS, "(STUBBED) called uid = %016" PRIX64 "%016" PRIX64, uid[1], uid[0]);
 | 
			
		||||
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 2};
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void FSP_SRV::MountSaveData(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    LOG_WARNING(Service_FS, "(STUBBED) called");
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ private:
 | 
			
		||||
 | 
			
		||||
    void Initalize(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void MountSdCard(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void CreateSaveData(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void MountSaveData(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void GetGlobalAccessLogMode(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void OpenDataStorageByCurrentProcess(Kernel::HLERequestContext& ctx);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user