Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix Lint and compilation errors Merge vffFatFs with FatFs Fix subtask support and conform to code style Mark iv and in_buf arguments for AES_OFB as const
- Loading branch information
1 parent
e9cbc59
commit b722a51
Showing
13 changed files
with
846 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,148 @@ | ||
// Copyright 2022 Dolphin Emulator Project | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
|
||
#include "Core/IOS/Network/KD/NWC24DL.h" | ||
|
||
#include "Common/CommonPaths.h" | ||
#include "Common/CommonTypes.h" | ||
#include "Common/Logging/Log.h" | ||
#include "Common/Swap.h" | ||
#include "Core/IOS/FS/FileSystem.h" | ||
#include "Core/IOS/Uids.h" | ||
|
||
namespace IOS::HLE::NWC24 | ||
{ | ||
constexpr const char DL_LIST_PATH[] = "/" WII_WC24CONF_DIR "/nwc24dl.bin"; | ||
|
||
NWC24Dl::NWC24Dl(std::shared_ptr<FS::FileSystem> fs) : m_fs{std::move(fs)} | ||
{ | ||
ReadDlList(); | ||
} | ||
|
||
void NWC24Dl::ReadDlList() | ||
{ | ||
const auto file = m_fs->OpenFile(PID_KD, PID_KD, DL_LIST_PATH, FS::Mode::Read); | ||
if (!file || !file->Read(&m_data, 1)) | ||
return; | ||
|
||
const s32 file_error = CheckNwc24DlList(); | ||
if (file_error) | ||
ERROR_LOG_FMT(IOS_WC24, "There is an error in the DL list for WC24: {}", file_error); | ||
} | ||
|
||
s32 NWC24Dl::CheckNwc24DlList() const | ||
{ | ||
// 'WcDl' magic | ||
if (Magic() != DL_LIST_MAGIC) | ||
{ | ||
ERROR_LOG_FMT(IOS_WC24, "DL list magic mismatch"); | ||
return -1; | ||
} | ||
|
||
if (Version() != 1) | ||
{ | ||
ERROR_LOG_FMT(IOS_WC24, "DL list version mismatch"); | ||
return -1; | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
void NWC24Dl::WriteDlList() const | ||
{ | ||
constexpr FS::Modes public_modes{FS::Mode::ReadWrite, FS::Mode::ReadWrite, FS::Mode::ReadWrite}; | ||
m_fs->CreateFullPath(PID_KD, PID_KD, DL_LIST_PATH, 0, public_modes); | ||
const auto file = m_fs->CreateAndOpenFile(PID_KD, PID_KD, DL_LIST_PATH, public_modes); | ||
|
||
if (!file || !file->Write(&m_data, 1)) | ||
ERROR_LOG_FMT(IOS_WC24, "Failed to open or write WC24 DL list file"); | ||
} | ||
|
||
void NWC24Dl::ResetConfig() | ||
{ | ||
// m_fs->Delete(PID_KD, PID_KD, CONFIG_PATH); | ||
// TODO: implement | ||
} | ||
|
||
std::string NWC24Dl::GetDownloadURL(u16 entry_index, std::optional<u8> subtask_id) const | ||
{ | ||
std::string url(m_data.entries[entry_index].dl_url); | ||
|
||
// Determine if we need to append the subtask to the URL. | ||
if ((Common::swap32(m_data.entries[entry_index].subtask_bitmask) & (1 << (2 - 1))) == 2 && | ||
subtask_id) | ||
{ | ||
url.append(fmt::format(".{:02d}", *subtask_id)); | ||
} | ||
|
||
return url; | ||
} | ||
|
||
std::string NWC24Dl::GetVFFContentName(u16 entry_index, std::optional<u8> subtask_id) const | ||
{ | ||
std::string content(m_data.entries[entry_index].filename); | ||
|
||
// Determine if we need to append the subtask to the name. | ||
if ((Common::swap32(m_data.entries[entry_index].subtask_bitmask) & (1 << (1 - 1))) == 1 && | ||
subtask_id) | ||
{ | ||
content.append(fmt::format(".{:02d}", *subtask_id)); | ||
} | ||
|
||
return content; | ||
} | ||
|
||
std::string NWC24Dl::GetVFFPath(u16 entry_index) const | ||
{ | ||
const u32 lower_title_id = Common::swap32(m_data.entries[entry_index].low_title_id); | ||
const u32 high_title_id = Common::swap32(m_data.entries[entry_index].high_title_id); | ||
|
||
return fmt::format("/title/{0:08x}/{1:08x}/data/wc24dl.vff", lower_title_id, high_title_id); | ||
} | ||
|
||
WC24PubkMod NWC24Dl::GetWC24PubkMod(u16 entry_index) const | ||
{ | ||
WC24PubkMod pubkMod; | ||
const u32 lower_title_id = Common::swap32(m_data.entries[entry_index].low_title_id); | ||
const u32 high_title_id = Common::swap32(m_data.entries[entry_index].high_title_id); | ||
|
||
const std::string path = | ||
fmt::format("/title/{0:08x}/{1:08x}/data/wc24pubk.mod", lower_title_id, high_title_id); | ||
|
||
const auto file = m_fs->OpenFile(PID_KD, PID_KD, path, IOS::HLE::FS::Mode::Read); | ||
file->Read(&pubkMod, 1); | ||
|
||
return pubkMod; | ||
} | ||
|
||
bool NWC24Dl::isEncrypted(u16 entry_index) const | ||
{ | ||
return (Common::swap32(m_data.entries[entry_index].flags) & (1 << (4 - 1))) == 8; | ||
} | ||
|
||
u32 NWC24Dl::Magic() const | ||
{ | ||
return Common::swap32(m_data.header.magic); | ||
} | ||
|
||
void NWC24Dl::SetMagic(u32 magic) | ||
{ | ||
m_data.header.magic = Common::swap32(magic); | ||
} | ||
|
||
u8 NWC24Dl::SubtaskID(u16 entry_index) const | ||
{ | ||
return m_data.entries[entry_index].subtask_flags; | ||
} | ||
|
||
u32 NWC24Dl::Version() const | ||
{ | ||
return Common::swap32(m_data.header.version); | ||
} | ||
|
||
void NWC24Dl::SetVersion(u32 version) | ||
{ | ||
m_data.header.version = Common::swap32(version); | ||
} | ||
|
||
} // namespace IOS::HLE::NWC24 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
// Copyright 2022 Dolphin Emulator Project | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
|
||
#pragma once | ||
|
||
#include <memory> | ||
#include <optional> | ||
#include <string> | ||
#include "Common/CommonTypes.h" | ||
#include "Core/IOS/Network/KD/WC24File.h" | ||
|
||
namespace IOS::HLE | ||
{ | ||
namespace FS | ||
{ | ||
class FileSystem; | ||
} | ||
namespace NWC24 | ||
{ | ||
// TODO: -3 for error code | ||
|
||
class NWC24Dl final | ||
{ | ||
public: | ||
explicit NWC24Dl(std::shared_ptr<FS::FileSystem> fs); | ||
|
||
void ReadDlList(); | ||
void WriteDlList() const; | ||
void ResetConfig(); | ||
|
||
s32 CheckNwc24DlList() const; | ||
|
||
bool isEncrypted(u16 entry_index) const; | ||
std::string GetVFFContentName(u16 entry_index, std::optional<u8> subtask_id) const; | ||
std::string GetDownloadURL(u16 entry_index, std::optional<u8> subtask_id) const; | ||
std::string GetVFFPath(u16 entry_index) const; | ||
WC24PubkMod GetWC24PubkMod(u16 entry_index) const; | ||
u8 SubtaskID(u16 entry_index) const; | ||
|
||
u32 Magic() const; | ||
void SetMagic(u32 magic); | ||
|
||
u32 Version() const; | ||
void SetVersion(u32 version); | ||
|
||
private: | ||
enum | ||
{ | ||
DL_LIST_MAGIC = 'WcDl', // 'WcDl' | ||
MAX_SUBENTRIES = 0x20, // 32 | ||
MAX_ENTRIES = 0x78, // 120 | ||
}; | ||
|
||
#pragma pack(push, 1) | ||
// The following format is partially based off of https://wiibrew.org/wiki//dev/net/kd/request. | ||
struct DLListHeader final | ||
{ | ||
u32 magic; // 'WcDl' 0x5763446c | ||
u32 version; // must be 1 | ||
u32 unk1; | ||
u32 unk2; | ||
u16 max_subentries; // Asserted to be less than max_entries | ||
u16 reserved_mailnum; | ||
u16 max_entries; | ||
u8 reserved[106]; | ||
}; | ||
|
||
struct DLListRecord final | ||
{ | ||
u32 low_title_id; | ||
u32 next_dl_timestamp; | ||
u32 last_modified_timestamp; | ||
u8 flags; | ||
u8 padding[3]; | ||
}; | ||
|
||
struct DLListEntry final | ||
{ | ||
uint16_t index; | ||
uint8_t type; /* TODO: make enum */ | ||
uint8_t record_flags; | ||
uint32_t flags; | ||
uint32_t high_title_id; | ||
u32 low_title_id; | ||
u32 _; | ||
uint16_t group_id; | ||
uint16_t field7_0x16; | ||
uint16_t count; /* count of what??? */ | ||
uint16_t error_count; | ||
uint16_t dl_frequency; /* ???????? */ | ||
uint16_t other_dl_freq; /* ???????? */ | ||
int32_t error_code; | ||
uint8_t subtask_id; | ||
uint8_t subtask_type; | ||
uint8_t subtask_flags; | ||
uint8_t field16_0x27; | ||
uint32_t subtask_bitmask; | ||
int unknownOtherValue; | ||
uint32_t dl_timestamp; /* Last DL time */ | ||
uint32_t subtask_timestamps[32]; | ||
char dl_url[236]; | ||
char filename[64]; /* Null-terminated */ | ||
uint8_t unk6[29]; | ||
uint8_t should_use_rootca; | ||
uint16_t field25_0x1fe; | ||
}; | ||
|
||
struct DLList final | ||
{ | ||
DLListHeader header; | ||
DLListRecord records[MAX_ENTRIES]; | ||
DLListEntry entries[MAX_ENTRIES]; | ||
}; | ||
#pragma pack(pop) | ||
|
||
std::shared_ptr<FS::FileSystem> m_fs; | ||
DLList m_data; | ||
}; | ||
} // namespace NWC24 | ||
} // namespace IOS::HLE |
Oops, something went wrong.