mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	FS: Make EnsureSaveData create the savedata folder when called for the first time.
This commit is contained in:
		
							parent
							
								
									7e7110b3b9
								
							
						
					
					
						commit
						0eefe6e4d1
					
				@ -183,10 +183,9 @@ public:
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Deletes the archive contents and then re-creates the base folder
 | 
					     * Deletes the archive contents and then re-creates the base folder
 | 
				
			||||||
     * @param path Path to the archive
 | 
					     * @param path Path to the archive
 | 
				
			||||||
     * @param format_info Format information for the new archive
 | 
					 | 
				
			||||||
     * @return ResultCode of the operation, 0 on success
 | 
					     * @return ResultCode of the operation, 0 on success
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    virtual ResultCode Format(const Path& path, const FileSys::ArchiveFormatInfo& format_info) = 0;
 | 
					    virtual ResultCode Format(const Path& path) = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Retrieves the format info about the archive with the specified path
 | 
					     * Retrieves the format info about the archive with the specified path
 | 
				
			||||||
 | 
				
			|||||||
@ -23,7 +23,7 @@ ResultVal<std::unique_ptr<FileSystemBackend>> RomFS_Factory::Open(const Path& pa
 | 
				
			|||||||
    return MakeResult<std::unique_ptr<FileSystemBackend>>(std::move(archive));
 | 
					    return MakeResult<std::unique_ptr<FileSystemBackend>>(std::move(archive));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ResultCode RomFS_Factory::Format(const Path& path, const FileSys::ArchiveFormatInfo& format_info) {
 | 
					ResultCode RomFS_Factory::Format(const Path& path) {
 | 
				
			||||||
    LOG_ERROR(Service_FS, "Unimplemented Format archive %s", GetName().c_str());
 | 
					    LOG_ERROR(Service_FS, "Unimplemented Format archive %s", GetName().c_str());
 | 
				
			||||||
    // TODO(bunnei): Find the right error code for this
 | 
					    // TODO(bunnei): Find the right error code for this
 | 
				
			||||||
    return ResultCode(-1);
 | 
					    return ResultCode(-1);
 | 
				
			||||||
 | 
				
			|||||||
@ -23,7 +23,7 @@ public:
 | 
				
			|||||||
        return "ArchiveFactory_RomFS";
 | 
					        return "ArchiveFactory_RomFS";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ResultVal<std::unique_ptr<FileSystemBackend>> Open(const Path& path) override;
 | 
					    ResultVal<std::unique_ptr<FileSystemBackend>> Open(const Path& path) override;
 | 
				
			||||||
    ResultCode Format(const Path& path, const FileSys::ArchiveFormatInfo& format_info) override;
 | 
					    ResultCode Format(const Path& path) override;
 | 
				
			||||||
    ResultVal<ArchiveFormatInfo> GetFormatInfo(const Path& path) const override;
 | 
					    ResultVal<ArchiveFormatInfo> GetFormatInfo(const Path& path) const override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
 | 
				
			|||||||
@ -17,20 +17,26 @@ SaveData_Factory::SaveData_Factory(std::string nand_directory)
 | 
				
			|||||||
    : nand_directory(std::move(nand_directory)) {}
 | 
					    : nand_directory(std::move(nand_directory)) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ResultVal<std::unique_ptr<FileSystemBackend>> SaveData_Factory::Open(const Path& path) {
 | 
					ResultVal<std::unique_ptr<FileSystemBackend>> SaveData_Factory::Open(const Path& path) {
 | 
				
			||||||
    u64 title_id = Kernel::g_current_process->program_id;
 | 
					    std::string save_directory = GetFullPath();
 | 
				
			||||||
    // TODO(Subv): Somehow obtain this value.
 | 
					    // Return an error if the save data doesn't actually exist.
 | 
				
			||||||
    u32 user = 0;
 | 
					    if (!FileUtil::IsDirectory(save_directory)) {
 | 
				
			||||||
    std::string save_directory = Common::StringFromFormat("%ssave/%016" PRIX64 "/%08X",
 | 
					        // TODO(Subv): Find out correct error code.
 | 
				
			||||||
                                                          nand_directory.c_str(), title_id, user);
 | 
					        return ResultCode(-1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    auto archive = std::make_unique<Disk_FileSystem>(save_directory);
 | 
					    auto archive = std::make_unique<Disk_FileSystem>(save_directory);
 | 
				
			||||||
    return MakeResult<std::unique_ptr<FileSystemBackend>>(std::move(archive));
 | 
					    return MakeResult<std::unique_ptr<FileSystemBackend>>(std::move(archive));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ResultCode SaveData_Factory::Format(const Path& path,
 | 
					ResultCode SaveData_Factory::Format(const Path& path) {
 | 
				
			||||||
                                    const FileSys::ArchiveFormatInfo& format_info) {
 | 
					    LOG_WARNING(Service_FS, "Format archive %s", GetName().c_str());
 | 
				
			||||||
    LOG_ERROR(Service_FS, "Unimplemented Format archive %s", GetName().c_str());
 | 
					    // Create the save data directory.
 | 
				
			||||||
    // TODO(bunnei): Find the right error code for this
 | 
					    if (!FileUtil::CreateFullPath(GetFullPath())) {
 | 
				
			||||||
 | 
					        // TODO(Subv): Find the correct error code.
 | 
				
			||||||
        return ResultCode(-1);
 | 
					        return ResultCode(-1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return RESULT_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ResultVal<ArchiveFormatInfo> SaveData_Factory::GetFormatInfo(const Path& path) const {
 | 
					ResultVal<ArchiveFormatInfo> SaveData_Factory::GetFormatInfo(const Path& path) const {
 | 
				
			||||||
@ -39,4 +45,12 @@ ResultVal<ArchiveFormatInfo> SaveData_Factory::GetFormatInfo(const Path& path) c
 | 
				
			|||||||
    return ResultCode(-1);
 | 
					    return ResultCode(-1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string SaveData_Factory::GetFullPath() const {
 | 
				
			||||||
 | 
					    u64 title_id = Kernel::g_current_process->program_id;
 | 
				
			||||||
 | 
					    // TODO(Subv): Somehow obtain this value.
 | 
				
			||||||
 | 
					    u32 user = 0;
 | 
				
			||||||
 | 
					    return Common::StringFromFormat("%ssave/%016" PRIX64 "/%08X/", nand_directory.c_str(), title_id,
 | 
				
			||||||
 | 
					                                    user);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace FileSys
 | 
					} // namespace FileSys
 | 
				
			||||||
 | 
				
			|||||||
@ -21,11 +21,13 @@ public:
 | 
				
			|||||||
        return "SaveData_Factory";
 | 
					        return "SaveData_Factory";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ResultVal<std::unique_ptr<FileSystemBackend>> Open(const Path& path) override;
 | 
					    ResultVal<std::unique_ptr<FileSystemBackend>> Open(const Path& path) override;
 | 
				
			||||||
    ResultCode Format(const Path& path, const FileSys::ArchiveFormatInfo& format_info) override;
 | 
					    ResultCode Format(const Path& path) override;
 | 
				
			||||||
    ResultVal<ArchiveFormatInfo> GetFormatInfo(const Path& path) const override;
 | 
					    ResultVal<ArchiveFormatInfo> GetFormatInfo(const Path& path) const override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    std::string nand_directory;
 | 
					    std::string nand_directory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    std::string GetFullPath() const;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace FileSys
 | 
					} // namespace FileSys
 | 
				
			||||||
 | 
				
			|||||||
@ -2,12 +2,15 @@
 | 
				
			|||||||
// Licensed under GPLv2 or any later version
 | 
					// Licensed under GPLv2 or any later version
 | 
				
			||||||
// Refer to the license.txt file included.
 | 
					// Refer to the license.txt file included.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <cinttypes>
 | 
				
			||||||
 | 
					#include "core/file_sys/filesystem.h"
 | 
				
			||||||
#include "core/hle/ipc_helpers.h"
 | 
					#include "core/hle/ipc_helpers.h"
 | 
				
			||||||
#include "core/hle/kernel/event.h"
 | 
					#include "core/hle/kernel/event.h"
 | 
				
			||||||
#include "core/hle/service/am/am.h"
 | 
					#include "core/hle/service/am/am.h"
 | 
				
			||||||
#include "core/hle/service/am/applet_ae.h"
 | 
					#include "core/hle/service/am/applet_ae.h"
 | 
				
			||||||
#include "core/hle/service/am/applet_oe.h"
 | 
					#include "core/hle/service/am/applet_oe.h"
 | 
				
			||||||
#include "core/hle/service/apm/apm.h"
 | 
					#include "core/hle/service/apm/apm.h"
 | 
				
			||||||
 | 
					#include "core/hle/service/filesystem/filesystem.h"
 | 
				
			||||||
#include "core/hle/service/nvflinger/nvflinger.h"
 | 
					#include "core/hle/service/nvflinger/nvflinger.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Service {
 | 
					namespace Service {
 | 
				
			||||||
@ -416,9 +419,24 @@ void IApplicationFunctions::PopLaunchParameter(Kernel::HLERequestContext& ctx) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void IApplicationFunctions::EnsureSaveData(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};
 | 
					    IPC::ResponseBuilder rb{ctx, 4};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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(RESULT_SUCCESS);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    rb.Push<u64>(0);
 | 
					    rb.Push<u64>(0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -43,6 +43,19 @@ ResultVal<std::unique_ptr<FileSys::FileSystemBackend>> OpenFileSystem(Type type,
 | 
				
			|||||||
    return itr->second->Open(path);
 | 
					    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() {
 | 
					void RegisterFileSystems() {
 | 
				
			||||||
    filesystem_map.clear();
 | 
					    filesystem_map.clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -44,6 +44,13 @@ ResultCode RegisterFileSystem(std::unique_ptr<FileSys::FileSystemFactory>&& fact
 | 
				
			|||||||
ResultVal<std::unique_ptr<FileSys::FileSystemBackend>> OpenFileSystem(Type type,
 | 
					ResultVal<std::unique_ptr<FileSys::FileSystemBackend>> OpenFileSystem(Type type,
 | 
				
			||||||
                                                                      FileSys::Path& path);
 | 
					                                                                      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.
 | 
					/// Registers all Filesystem services with the specified service manager.
 | 
				
			||||||
void InstallInterfaces(SM::ServiceManager& service_manager);
 | 
					void InstallInterfaces(SM::ServiceManager& service_manager);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user