diff options
| author | archshift <admin@archshift.com> | 2014-10-28 22:52:56 -0700 | 
|---|---|---|
| committer | archshift <admin@archshift.com> | 2014-11-02 10:48:28 -0800 | 
| commit | 04c90c395d27e6bc205fb2d933ced50e70c1841a (patch) | |
| tree | 18f5e206016e383ad07493e3ad5ba1279301e6a8 /src/core/hle | |
| parent | 2ca12e7f3899a58e112ee8bb4e46d11ca61f7152 (diff) | |
Added CreateDirectory function to service/fs.cpp, and in Archive.
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/kernel/archive.cpp | 15 | ||||
| -rw-r--r-- | src/core/hle/kernel/archive.h | 12 | ||||
| -rw-r--r-- | src/core/hle/service/fs_user.cpp | 40 | 
3 files changed, 63 insertions, 4 deletions
| diff --git a/src/core/hle/kernel/archive.cpp b/src/core/hle/kernel/archive.cpp index 4a6140c71..764082d71 100644 --- a/src/core/hle/kernel/archive.cpp +++ b/src/core/hle/kernel/archive.cpp @@ -381,6 +381,21 @@ Handle OpenFileFromArchive(Handle archive_handle, const std::string& path, const  }  /** + * 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   * @param path Path to the Directory inside of the Archive diff --git a/src/core/hle/kernel/archive.h b/src/core/hle/kernel/archive.h index 593861f8e..0230996b6 100644 --- a/src/core/hle/kernel/archive.h +++ b/src/core/hle/kernel/archive.h @@ -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(); diff --git a/src/core/hle/service/fs_user.cpp b/src/core/hle/service/fs_user.cpp index 845c94103..48d806e2f 100644 --- a/src/core/hle/service/fs_user.cpp +++ b/src/core/hle/service/fs_user.cpp @@ -100,7 +100,7 @@ void OpenFileDirectly(Service::Interface* self) {      std::string archive_name = GetStringFromCmdBuff(archive_pointer, archive_size);      std::string file_name = GetStringFromCmdBuff(pointer, size); -    DEBUG_LOG(KERNEL, "archive_type=%d archive_size=%d archive_data=%s" +    DEBUG_LOG(KERNEL, "archive_type=%d archive_size=%d archive_data=%s "                        "file_type=%d file_size=%d file_mode=%d file_attrs=%d file_data=%s",                archive_type, archive_size, archive_name.c_str(),                file_type, size, mode, attributes, file_name.c_str()); @@ -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"}, | 
