mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Merge pull request #191 from archshift/deletexyz
Added DeleteFile and DeleteDirectory functions to FS:USER and the archives.
This commit is contained in:
		
						commit
						ef1b16a7eb
					
				
					 8 changed files with 194 additions and 26 deletions
				
			
		|  | @ -184,6 +184,20 @@ public: | |||
|      */ | ||||
|     virtual std::unique_ptr<File> OpenFile(const Path& path, const Mode mode) const = 0; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Delete a file specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|      * @return Whether the file could be deleted | ||||
|      */ | ||||
|     virtual bool DeleteFile(const FileSys::Path& path) const = 0; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Delete a directory specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|      * @return Whether the directory could be deleted | ||||
|      */ | ||||
|     virtual bool DeleteDirectory(const FileSys::Path& path) const = 0; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Create a directory specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|  |  | |||
|  | @ -33,6 +33,26 @@ std::unique_ptr<File> Archive_RomFS::OpenFile(const Path& path, const Mode mode) | |||
|     return std::unique_ptr<File>(new File_RomFS); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Delete a file specified by its path | ||||
|  * @param path Path relative to the archive | ||||
|  * @return Whether the file could be deleted | ||||
|  */ | ||||
| bool Archive_RomFS::DeleteFile(const FileSys::Path& path) const { | ||||
|     ERROR_LOG(FILESYS, "Attempted to delete a file from ROMFS."); | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Delete a directory specified by its path | ||||
|  * @param path Path relative to the archive | ||||
|  * @return Whether the directory could be deleted | ||||
|  */ | ||||
| bool Archive_RomFS::DeleteDirectory(const FileSys::Path& path) const { | ||||
|     ERROR_LOG(FILESYS, "Attempted to delete a directory from ROMFS."); | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Create a directory specified by its path | ||||
|  * @param path Path relative to the archive | ||||
|  |  | |||
|  | @ -36,6 +36,20 @@ public: | |||
|      */ | ||||
|     std::unique_ptr<File> OpenFile(const Path& path, const Mode mode) const override; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Delete a file specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|      * @return Whether the file could be deleted | ||||
|      */ | ||||
|     bool DeleteFile(const FileSys::Path& path) const override; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Delete a directory specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|      * @return Whether the directory could be deleted | ||||
|      */ | ||||
|     bool DeleteDirectory(const FileSys::Path& path) const override; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Create a directory specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|  |  | |||
|  | @ -57,6 +57,24 @@ std::unique_ptr<File> Archive_SDMC::OpenFile(const Path& path, const Mode mode) | |||
|     return std::unique_ptr<File>(file); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Delete a file specified by its path | ||||
|  * @param path Path relative to the archive | ||||
|  * @return Whether the file could be deleted | ||||
|  */ | ||||
| bool Archive_SDMC::DeleteFile(const FileSys::Path& path) const { | ||||
|     return FileUtil::Delete(GetMountPoint() + path.AsString()); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Delete a directory specified by its path | ||||
|  * @param path Path relative to the archive | ||||
|  * @return Whether the directory could be deleted | ||||
|  */ | ||||
| bool Archive_SDMC::DeleteDirectory(const FileSys::Path& path) const { | ||||
|     return FileUtil::DeleteDir(GetMountPoint() + path.AsString()); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Create a directory specified by its path | ||||
|  * @param path Path relative to the archive | ||||
|  |  | |||
|  | @ -40,6 +40,20 @@ public: | |||
|      */ | ||||
|     std::unique_ptr<File> OpenFile(const Path& path, const Mode mode) const override; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Delete a file specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|      * @return Whether the file could be deleted | ||||
|      */ | ||||
|     bool DeleteFile(const FileSys::Path& path) const override; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Delete a directory specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|      * @return Whether the directory could be deleted | ||||
|      */ | ||||
|     bool DeleteDirectory(const FileSys::Path& path) const override; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Create a directory specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|  |  | |||
|  | @ -391,11 +391,41 @@ Handle OpenFileFromArchive(Handle archive_handle, const FileSys::Path& path, con | |||
|     return handle; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Delete a File from an Archive | ||||
|  * @param archive_handle Handle to an open Archive object | ||||
|  * @param path Path to the File inside of the Archive | ||||
|  * @return Whether deletion succeeded | ||||
|  */ | ||||
| Result DeleteFileFromArchive(Handle archive_handle, const FileSys::Path& path) { | ||||
|     Archive* archive = Kernel::g_object_pool.GetFast<Archive>(archive_handle); | ||||
|     if (archive == nullptr) | ||||
|         return -1; | ||||
|     if (archive->backend->DeleteFile(path)) | ||||
|         return 0; | ||||
|     return -1; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Delete a Directory from an Archive | ||||
|  * @param archive_handle Handle to an open Archive object | ||||
|  * @param path Path to the Directory inside of the Archive | ||||
|  * @return Whether deletion succeeded | ||||
|  */ | ||||
| Result DeleteDirectoryFromArchive(Handle archive_handle, const FileSys::Path& path) { | ||||
|     Archive* archive = Kernel::g_object_pool.GetFast<Archive>(archive_handle); | ||||
|     if (archive == nullptr) | ||||
|         return -1; | ||||
|     if (archive->backend->DeleteDirectory(path)) | ||||
|         return 0; | ||||
|     return -1; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Create a Directory from an Archive | ||||
|  * @param archive_handle Handle to an open Archive object | ||||
|  * @param path Path to the Directory inside of the Archive | ||||
|  * @return Opened Directory object | ||||
|  * @return Whether creation succeeded | ||||
|  */ | ||||
| Result CreateDirectoryFromArchive(Handle archive_handle, const FileSys::Path& path) { | ||||
|     Archive* archive = Kernel::g_object_pool.GetFast<Archive>(archive_handle); | ||||
|  |  | |||
|  | @ -45,6 +45,22 @@ Handle CreateArchive(FileSys::Archive* backend, const std::string& name); | |||
|  */ | ||||
| Handle OpenFileFromArchive(Handle archive_handle, const FileSys::Path& path, const FileSys::Mode mode); | ||||
| 
 | ||||
| /**
 | ||||
|  * Delete a File from an Archive | ||||
|  * @param archive_handle Handle to an open Archive object | ||||
|  * @param path Path to the File inside of the Archive | ||||
|  * @return Whether deletion succeeded | ||||
|  */ | ||||
| Result DeleteFileFromArchive(Handle archive_handle, const FileSys::Path& path); | ||||
| 
 | ||||
| /**
 | ||||
|  * Delete a Directory from an Archive | ||||
|  * @param archive_handle Handle to an open Archive object | ||||
|  * @param path Path to the Directory inside of the Archive | ||||
|  * @return Whether deletion succeeded | ||||
|  */ | ||||
| Result DeleteDirectoryFromArchive(Handle archive_handle, const FileSys::Path& path); | ||||
| 
 | ||||
| /**
 | ||||
|  * Create a Directory from an Archive | ||||
|  * @param archive_handle Handle to an open Archive object | ||||
|  |  | |||
|  | @ -137,6 +137,68 @@ static void OpenFileDirectly(Service::Interface* self) { | |||
|     DEBUG_LOG(KERNEL, "called"); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * FS_User::DeleteFile service function | ||||
|  *  Inputs: | ||||
|  *      2 : Archive handle lower word | ||||
|  *      3 : Archive handle upper word | ||||
|  *      4 : File path string type | ||||
|  *      5 : File path string size | ||||
|  *      7 : File path string data | ||||
|  *  Outputs: | ||||
|  *      1 : Result of function, 0 on success, otherwise error code | ||||
|  */ | ||||
| void DeleteFile(Service::Interface* self) { | ||||
|     u32* cmd_buff = Service::GetCommandBuffer(); | ||||
| 
 | ||||
|     // TODO(Link Mauve): cmd_buff[2], aka archive handle lower word, isn't used according to
 | ||||
|     // 3dmoo's or ctrulib's implementations.  Triple check if it's really the case.
 | ||||
|     Handle archive_handle = static_cast<Handle>(cmd_buff[3]); | ||||
|     auto filename_type    = static_cast<FileSys::LowPathType>(cmd_buff[4]); | ||||
|     u32 filename_size     = cmd_buff[5]; | ||||
|     u32 filename_ptr      = cmd_buff[7]; | ||||
| 
 | ||||
|     FileSys::Path file_path(filename_type, filename_size, filename_ptr); | ||||
| 
 | ||||
|     DEBUG_LOG(KERNEL, "type=%d size=%d data=%s", | ||||
|               filename_type, filename_size, file_path.DebugStr().c_str()); | ||||
| 
 | ||||
|     cmd_buff[1] = Kernel::DeleteFileFromArchive(archive_handle, file_path); | ||||
|      | ||||
|     DEBUG_LOG(KERNEL, "called"); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * FS_User::DeleteDirectory service function | ||||
|  *  Inputs: | ||||
|  *      2 : Archive handle lower word | ||||
|  *      3 : Archive handle upper word | ||||
|  *      4 : Directory path string type | ||||
|  *      5 : Directory path string size | ||||
|  *      7 : Directory path string data | ||||
|  *  Outputs: | ||||
|  *      1 : Result of function, 0 on success, otherwise error code | ||||
|  */ | ||||
| void DeleteDirectory(Service::Interface* self) { | ||||
|     u32* cmd_buff = Service::GetCommandBuffer(); | ||||
| 
 | ||||
|     // TODO(Link Mauve): cmd_buff[2], aka archive handle lower word, isn't used according to
 | ||||
|     // 3dmoo's or ctrulib's implementations.  Triple check if it's really the case.
 | ||||
|     Handle archive_handle = static_cast<Handle>(cmd_buff[3]); | ||||
|     auto dirname_type     = static_cast<FileSys::LowPathType>(cmd_buff[4]); | ||||
|     u32 dirname_size      = cmd_buff[5]; | ||||
|     u32 dirname_ptr       = cmd_buff[7]; | ||||
| 
 | ||||
|     FileSys::Path dir_path(dirname_type, dirname_size, dirname_ptr); | ||||
| 
 | ||||
|     DEBUG_LOG(KERNEL, "type=%d size=%d data=%s", | ||||
|               dirname_type, dirname_size, dir_path.DebugStr().c_str()); | ||||
|      | ||||
|     cmd_buff[1] = Kernel::DeleteDirectoryFromArchive(archive_handle, dir_path); | ||||
|      | ||||
|     DEBUG_LOG(KERNEL, "called"); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * FS_User::CreateDirectory service function | ||||
|  *  Inputs: | ||||
|  | @ -159,18 +221,8 @@ static void CreateDirectory(Service::Interface* self) { | |||
|     u32 dirname_ptr = cmd_buff[8]; | ||||
| 
 | ||||
|     FileSys::Path dir_path(dirname_type, dirname_size, dirname_ptr); | ||||
|     std::string dir_string; | ||||
|     switch (dir_path.GetType()) { | ||||
|     case FileSys::Char: | ||||
|     case FileSys::Wchar: | ||||
|         dir_string = dir_path.AsString(); | ||||
|         break; | ||||
|     default: | ||||
|         cmd_buff[1] = -1; | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     DEBUG_LOG(KERNEL, "type=%d size=%d data=%s", dirname_type, dirname_size, dir_string.c_str()); | ||||
|     DEBUG_LOG(KERNEL, "type=%d size=%d data=%s", dirname_type, dirname_size, dir_path.DebugStr().c_str()); | ||||
| 
 | ||||
|     cmd_buff[1] = Kernel::CreateDirectoryFromArchive(archive_handle, dir_path); | ||||
| 
 | ||||
|  | @ -188,25 +240,15 @@ static void OpenDirectory(Service::Interface* self) { | |||
|     u32 dirname_ptr = cmd_buff[6]; | ||||
| 
 | ||||
|     FileSys::Path dir_path(dirname_type, dirname_size, dirname_ptr); | ||||
|     std::string dir_string; | ||||
|     switch (dir_path.GetType()) { | ||||
|     case FileSys::Char: | ||||
|     case FileSys::Wchar: | ||||
|         dir_string = dir_path.AsString(); | ||||
|         break; | ||||
|     default: | ||||
|         cmd_buff[1] = -1; | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     DEBUG_LOG(KERNEL, "type=%d size=%d data=%s", dirname_type, dirname_size, dir_string.c_str()); | ||||
|     DEBUG_LOG(KERNEL, "type=%d size=%d data=%s", dirname_type, dirname_size, dir_path.DebugStr().c_str()); | ||||
| 
 | ||||
|     Handle handle = Kernel::OpenDirectoryFromArchive(archive_handle, dir_path); | ||||
|     if (handle) { | ||||
|         cmd_buff[1] = 0; | ||||
|         cmd_buff[3] = handle; | ||||
|     } else { | ||||
|         ERROR_LOG(KERNEL, "failed to get a handle for directory %s", dir_string.c_str()); | ||||
|         ERROR_LOG(KERNEL, "failed to get a handle for directory"); | ||||
|         // TODO(Link Mauve): check for the actual error values, this one was just chosen arbitrarily.
 | ||||
|         cmd_buff[1] = -1; | ||||
|     } | ||||
|  | @ -279,9 +321,9 @@ const Interface::FunctionInfo FunctionTable[] = { | |||
|     {0x08010002, Initialize,            "Initialize"}, | ||||
|     {0x080201C2, OpenFile,              "OpenFile"}, | ||||
|     {0x08030204, OpenFileDirectly,      "OpenFileDirectly"}, | ||||
|     {0x08040142, nullptr,               "DeleteFile"}, | ||||
|     {0x08040142, DeleteFile,            "DeleteFile"}, | ||||
|     {0x08050244, nullptr,               "RenameFile"}, | ||||
|     {0x08060142, nullptr,               "DeleteDirectory"}, | ||||
|     {0x08060142, DeleteDirectory,       "DeleteDirectory"}, | ||||
|     {0x08070142, nullptr,               "DeleteDirectoryRecursively"}, | ||||
|     {0x08080202, nullptr,               "CreateFile"}, | ||||
|     {0x08090182, CreateDirectory,       "CreateDirectory"}, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue