mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Merge pull request #163 from archshift/create-directory
Added CreateDirectory function to service/fs.cpp, and in Archive.
This commit is contained in:
		
						commit
						9be17e4d84
					
				
					 8 changed files with 103 additions and 4 deletions
				
			
		|  | @ -56,6 +56,13 @@ public: | |||
|      */ | ||||
|     virtual std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const = 0; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Create a directory specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|      * @return Whether the directory could be created | ||||
|      */ | ||||
|     virtual bool CreateDirectory(const std::string& path) const = 0; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Open a directory specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|  |  | |||
|  | @ -33,6 +33,16 @@ std::unique_ptr<File> Archive_RomFS::OpenFile(const std::string& path, const Mod | |||
|     return std::unique_ptr<File>(new File_RomFS); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Create a directory specified by its path | ||||
|  * @param path Path relative to the archive | ||||
|  * @return Whether the directory could be created | ||||
|  */ | ||||
| bool Archive_RomFS::CreateDirectory(const std::string& path) const { | ||||
|     ERROR_LOG(FILESYS, "Attempted to create a directory in ROMFS."); | ||||
|     return false; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Open a directory specified by its path | ||||
|  * @param path Path relative to the archive | ||||
|  |  | |||
|  | @ -36,6 +36,13 @@ public: | |||
|      */ | ||||
|     std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const override; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Create a directory specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|      * @return Whether the directory could be created | ||||
|      */ | ||||
|     bool CreateDirectory(const std::string& path) const override; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Open a directory specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|  |  | |||
|  | @ -57,6 +57,15 @@ std::unique_ptr<File> Archive_SDMC::OpenFile(const std::string& path, const Mode | |||
|     return std::unique_ptr<File>(file); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Create a directory specified by its path | ||||
|  * @param path Path relative to the archive | ||||
|  * @return Whether the directory could be created | ||||
|  */ | ||||
| bool Archive_SDMC::CreateDirectory(const std::string& path) const { | ||||
|     return FileUtil::CreateDir(GetMountPoint() + path); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Open a directory specified by its path | ||||
|  * @param path Path relative to the archive | ||||
|  |  | |||
|  | @ -40,6 +40,13 @@ public: | |||
|      */ | ||||
|     std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const override; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Create a directory specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|      * @return Whether the directory could be created | ||||
|      */ | ||||
|     bool CreateDirectory(const std::string& path) const override; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Open a directory specified by its path | ||||
|      * @param path Path relative to the archive | ||||
|  |  | |||
|  | @ -380,6 +380,21 @@ Handle OpenFileFromArchive(Handle archive_handle, const std::string& path, const | |||
|     return handle; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * 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 | ||||
|  */ | ||||
| Result CreateDirectoryFromArchive(Handle archive_handle, const std::string& path) { | ||||
|     Archive* archive = Kernel::g_object_pool.GetFast<Archive>(archive_handle); | ||||
|     if (archive == nullptr) | ||||
|         return -1; | ||||
|     if (archive->backend->CreateDirectory(path)) | ||||
|         return 0; | ||||
|     return -1; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Open a Directory from an Archive | ||||
|  * @param archive_handle Handle to an open Archive object | ||||
|  |  | |||
|  | @ -43,7 +43,15 @@ Handle CreateArchive(FileSys::Archive* backend, const std::string& name); | |||
|  * @param mode Mode under which to open the File | ||||
|  * @return Opened File object | ||||
|  */ | ||||
| Handle OpenFileFromArchive(Handle handle, const std::string& name, const FileSys::Mode mode); | ||||
| Handle OpenFileFromArchive(Handle archive_handle, const std::string& name, const FileSys::Mode mode); | ||||
| 
 | ||||
| /**
 | ||||
|  * 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 Whether creation of directory succeeded | ||||
|  */ | ||||
| Result CreateDirectoryFromArchive(Handle archive_handle, const std::string& name); | ||||
| 
 | ||||
| /**
 | ||||
|  * Open a Directory from an Archive | ||||
|  | @ -51,7 +59,7 @@ Handle OpenFileFromArchive(Handle handle, const std::string& name, const FileSys | |||
|  * @param path Path to the Directory inside of the Archive | ||||
|  * @return Opened Directory object | ||||
|  */ | ||||
| Handle OpenDirectoryFromArchive(Handle handle, const std::string& name); | ||||
| Handle OpenDirectoryFromArchive(Handle archive_handle, const std::string& name); | ||||
| 
 | ||||
| /// Initialize archives
 | ||||
| void ArchiveInit(); | ||||
|  |  | |||
|  | @ -136,6 +136,42 @@ void OpenFileDirectly(Service::Interface* self) { | |||
|     DEBUG_LOG(KERNEL, "called"); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * FS_User::CreateDirectory service function | ||||
|  *  Inputs: | ||||
|  *      2 : Archive handle lower word | ||||
|  *      3 : Archive handle upper word | ||||
|  *      4 : Directory path string type | ||||
|  *      5 : Directory path string size | ||||
|  *      8 : Directory path string data | ||||
|  *  Outputs: | ||||
|  *      1 : Result of function, 0 on success, otherwise error code | ||||
|  */ | ||||
| void CreateDirectory(Service::Interface* self) { | ||||
|     u32* cmd_buff = Service::GetCommandBuffer(); | ||||
| 
 | ||||
|     // TODO: 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]); | ||||
|     LowPathType type = static_cast<LowPathType>(cmd_buff[4]); | ||||
|     u32 name_size = cmd_buff[5]; | ||||
|     u32 name_offset = cmd_buff[8]; | ||||
| 
 | ||||
|     if (type != LowPathType::Char) { | ||||
|         ERROR_LOG(KERNEL, "directory LowPath type other than char is currently unsupported"); | ||||
|         cmd_buff[1] = -1; | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     std::string dir_name = GetStringFromCmdBuff(name_offset, name_size); | ||||
| 
 | ||||
|     DEBUG_LOG(KERNEL, "type=%d size=%d data=%s", type, name_size, dir_name.c_str()); | ||||
| 
 | ||||
|     cmd_buff[1] = Kernel::CreateDirectoryFromArchive(archive_handle, dir_name); | ||||
| 
 | ||||
|     DEBUG_LOG(KERNEL, "called"); | ||||
| } | ||||
| 
 | ||||
| void OpenDirectory(Service::Interface* self) { | ||||
|     u32* cmd_buff = Service::GetCommandBuffer(); | ||||
| 
 | ||||
|  | @ -227,7 +263,7 @@ const Interface::FunctionInfo FunctionTable[] = { | |||
|     {0x08060142, nullptr,               "DeleteDirectory"}, | ||||
|     {0x08070142, nullptr,               "DeleteDirectoryRecursively"}, | ||||
|     {0x08080202, nullptr,               "CreateFile"}, | ||||
|     {0x08090182, nullptr,               "CreateDirectory"}, | ||||
|     {0x08090182, CreateDirectory,       "CreateDirectory"}, | ||||
|     {0x080A0244, nullptr,               "RenameDirectory"}, | ||||
|     {0x080B0102, OpenDirectory,         "OpenDirectory"}, | ||||
|     {0x080C00C2, OpenArchive,           "OpenArchive"}, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue