summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/core.h9
-rw-r--r--src/core/hle/service/apt/apt.cpp4
-rw-r--r--src/core/loader/loader.h9
-rw-r--r--src/core/loader/ncch.cpp20
-rw-r--r--src/core/loader/ncch.h14
-rw-r--r--src/core/telemetry_session.cpp17
6 files changed, 57 insertions, 16 deletions
diff --git a/src/core/core.h b/src/core/core.h
index 4e3b6b409..9805cc694 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -7,6 +7,7 @@
#include <memory>
#include <string>
#include "common/common_types.h"
+#include "core/loader/loader.h"
#include "core/memory.h"
#include "core/perf_stats.h"
#include "core/telemetry_session.h"
@@ -14,10 +15,6 @@
class EmuWindow;
class ARM_Interface;
-namespace Loader {
-class AppLoader;
-}
-
namespace Core {
class System {
@@ -119,6 +116,10 @@ public:
return status_details;
}
+ Loader::AppLoader& GetAppLoader() const {
+ return *app_loader;
+ }
+
private:
/**
* Initialize the emulated system.
diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp
index 4e6b7b6f5..0109fa2b2 100644
--- a/src/core/hle/service/apt/apt.cpp
+++ b/src/core/hle/service/apt/apt.cpp
@@ -75,6 +75,10 @@ void Initialize(Service::Interface* self) {
void GetSharedFont(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x44, 0, 0); // 0x00440000
IPC::RequestBuilder rb = rp.MakeBuilder(2, 2);
+
+ // Log in telemetry if the game uses the shared font
+ Core::Telemetry().AddField(Telemetry::FieldType::Session, "RequiresSharedFont", true);
+
if (!shared_font_loaded) {
LOG_ERROR(Service_APT, "shared font file missing - go dump it from your 3ds");
rb.Push<u32>(-1); // TODO: Find the right error code
diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h
index 48bbf687d..e731888a2 100644
--- a/src/core/loader/loader.h
+++ b/src/core/loader/loader.h
@@ -166,6 +166,15 @@ public:
return ResultStatus::ErrorNotImplemented;
}
+ /**
+ * Get the title of the application
+ * @param title Reference to store the application title into
+ * @return ResultStatus result of function
+ */
+ virtual ResultStatus ReadTitle(std::string& title) {
+ return ResultStatus::ErrorNotImplemented;
+ }
+
protected:
FileUtil::IOFile file;
bool is_loaded = false;
diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp
index fc4d14a59..c007069a9 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"
@@ -420,4 +422,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
diff --git a/src/core/loader/ncch.h b/src/core/loader/ncch.h
index 0ebd47fd5..e40cef764 100644
--- a/src/core/loader/ncch.h
+++ b/src/core/loader/ncch.h
@@ -191,23 +191,13 @@ public:
ResultStatus ReadLogo(std::vector<u8>& buffer) override;
- /**
- * Get the program id of the application
- * @param out_program_id Reference to store program id into
- * @return ResultStatus result of function
- */
ResultStatus ReadProgramId(u64& out_program_id) override;
- /**
- * Get the RomFS of the application
- * @param romfs_file Reference to buffer to store data
- * @param offset Offset in the file to the RomFS
- * @param size Size of the RomFS in bytes
- * @return ResultStatus result of function
- */
ResultStatus ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
u64& size) override;
+ ResultStatus ReadTitle(std::string& title) override;
+
private:
/**
* Reads an application ExeFS section of an NCCH file into AppLoader (e.g. .code, .logo, etc.)
diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp
index 841d6cfa1..94483f385 100644
--- a/src/core/telemetry_session.cpp
+++ b/src/core/telemetry_session.cpp
@@ -7,6 +7,7 @@
#include "common/assert.h"
#include "common/scm_rev.h"
#include "common/x64/cpu_detect.h"
+#include "core/core.h"
#include "core/settings.h"
#include "core/telemetry_session.h"
@@ -39,12 +40,19 @@ TelemetrySession::TelemetrySession() {
std::chrono::system_clock::now().time_since_epoch())
.count()};
AddField(Telemetry::FieldType::Session, "Init_Time", init_time);
+ std::string program_name;
+ const Loader::ResultStatus res{System::GetInstance().GetAppLoader().ReadTitle(program_name)};
+ if (res == Loader::ResultStatus::Success) {
+ AddField(Telemetry::FieldType::Session, "ProgramName", program_name);
+ }
// Log application information
const bool is_git_dirty{std::strstr(Common::g_scm_desc, "dirty") != nullptr};
AddField(Telemetry::FieldType::App, "Git_IsDirty", is_git_dirty);
AddField(Telemetry::FieldType::App, "Git_Branch", Common::g_scm_branch);
AddField(Telemetry::FieldType::App, "Git_Revision", Common::g_scm_rev);
+ AddField(Telemetry::FieldType::App, "BuildDate", Common::g_build_date);
+ AddField(Telemetry::FieldType::App, "BuildName", Common::g_build_name);
// Log user system information
AddField(Telemetry::FieldType::UserSystem, "CPU_Model", Common::GetCPUCaps().cpu_string);
@@ -68,6 +76,15 @@ TelemetrySession::TelemetrySession() {
Common::GetCPUCaps().sse4_1);
AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE42",
Common::GetCPUCaps().sse4_2);
+#ifdef __APPLE__
+ AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Apple");
+#elif defined(_WIN32)
+ AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Windows");
+#elif defined(__linux__) || defined(linux) || defined(__linux)
+ AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Linux");
+#else
+ AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Unknown");
+#endif
// Log user configuration information
AddField(Telemetry::FieldType::UserConfig, "Audio_EnableAudioStretching",