summaryrefslogtreecommitdiffstats
path: root/src/core/loader/ncch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/loader/ncch.cpp')
-rw-r--r--src/core/loader/ncch.cpp34
1 files changed, 32 insertions, 2 deletions
diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp
index ffc019560..7aff7f29b 100644
--- a/src/core/loader/ncch.cpp
+++ b/src/core/loader/ncch.cpp
@@ -4,7 +4,9 @@
#include <algorithm>
#include <cinttypes>
+#include <codecvt>
#include <cstring>
+#include <locale>
#include <memory>
#include "common/logging/log.h"
#include "common/string_util.h"
@@ -18,6 +20,7 @@
#include "core/loader/ncch.h"
#include "core/loader/smdh.h"
#include "core/memory.h"
+#include "network/network.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
// Loader namespace
@@ -342,9 +345,18 @@ ResultStatus AppLoader_NCCH::Load() {
if (result != ResultStatus::Success)
return result;
- LOG_INFO(Loader, "Program ID: %016" PRIX64, ncch_header.program_id);
+ std::string program_id{Common::StringFromFormat("%016" PRIX64, ncch_header.program_id)};
- Core::Telemetry().AddField(Telemetry::FieldType::Session, "ProgramId", ncch_header.program_id);
+ LOG_INFO(Loader, "Program ID: %s", program_id.c_str());
+
+ Core::Telemetry().AddField(Telemetry::FieldType::Session, "ProgramId", program_id);
+
+ if (auto room_member = Network::GetRoomMember().lock()) {
+ Network::GameInfo game_info;
+ ReadTitle(game_info.name);
+ game_info.id = ncch_header.program_id;
+ room_member->SendGameInfo(game_info);
+ }
is_loaded = true; // Set state to loaded
@@ -418,4 +430,22 @@ ResultStatus AppLoader_NCCH::ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_
return ResultStatus::ErrorNotUsed;
}
+ResultStatus AppLoader_NCCH::ReadTitle(std::string& title) {
+ std::vector<u8> data;
+ Loader::SMDH smdh;
+ ReadIcon(data);
+
+ if (!Loader::IsValidSMDH(data)) {
+ return ResultStatus::ErrorInvalidFormat;
+ }
+
+ memcpy(&smdh, data.data(), sizeof(Loader::SMDH));
+
+ const auto& short_title = smdh.GetShortTitle(SMDH::TitleLanguage::English);
+ auto title_end = std::find(short_title.begin(), short_title.end(), u'\0');
+ title = Common::UTF16ToUTF8(std::u16string{short_title.begin(), title_end});
+
+ return ResultStatus::Success;
+}
+
} // namespace Loader