Merge pull request #2526 from lioncash/global
core/telemetry_session: Remove usages of the global system accessor
This commit is contained in:
commit
799302bc9d
9 changed files with 98 additions and 75 deletions
|
@ -18,11 +18,6 @@
|
||||||
#include "core/file_sys/registered_cache.h"
|
#include "core/file_sys/registered_cache.h"
|
||||||
#include "core/file_sys/vfs_concat.h"
|
#include "core/file_sys/vfs_concat.h"
|
||||||
#include "core/file_sys/vfs_real.h"
|
#include "core/file_sys/vfs_real.h"
|
||||||
#include "core/frontend/applets/error.h"
|
|
||||||
#include "core/frontend/applets/general_frontend.h"
|
|
||||||
#include "core/frontend/applets/profile_select.h"
|
|
||||||
#include "core/frontend/applets/software_keyboard.h"
|
|
||||||
#include "core/frontend/applets/web_browser.h"
|
|
||||||
#include "core/gdbstub/gdbstub.h"
|
#include "core/gdbstub/gdbstub.h"
|
||||||
#include "core/hle/kernel/client_port.h"
|
#include "core/hle/kernel/client_port.h"
|
||||||
#include "core/hle/kernel/kernel.h"
|
#include "core/hle/kernel/kernel.h"
|
||||||
|
@ -37,9 +32,6 @@
|
||||||
#include "core/settings.h"
|
#include "core/settings.h"
|
||||||
#include "core/telemetry_session.h"
|
#include "core/telemetry_session.h"
|
||||||
#include "file_sys/cheat_engine.h"
|
#include "file_sys/cheat_engine.h"
|
||||||
#include "frontend/applets/profile_select.h"
|
|
||||||
#include "frontend/applets/software_keyboard.h"
|
|
||||||
#include "frontend/applets/web_browser.h"
|
|
||||||
#include "video_core/debug_utils/debug_utils.h"
|
#include "video_core/debug_utils/debug_utils.h"
|
||||||
#include "video_core/renderer_base.h"
|
#include "video_core/renderer_base.h"
|
||||||
#include "video_core/video_core.h"
|
#include "video_core/video_core.h"
|
||||||
|
@ -144,20 +136,10 @@ struct System::Impl {
|
||||||
ResultStatus Load(System& system, Frontend::EmuWindow& emu_window,
|
ResultStatus Load(System& system, Frontend::EmuWindow& emu_window,
|
||||||
const std::string& filepath) {
|
const std::string& filepath) {
|
||||||
app_loader = Loader::GetLoader(GetGameFileFromPath(virtual_filesystem, filepath));
|
app_loader = Loader::GetLoader(GetGameFileFromPath(virtual_filesystem, filepath));
|
||||||
|
|
||||||
if (!app_loader) {
|
if (!app_loader) {
|
||||||
LOG_CRITICAL(Core, "Failed to obtain loader for {}!", filepath);
|
LOG_CRITICAL(Core, "Failed to obtain loader for {}!", filepath);
|
||||||
return ResultStatus::ErrorGetLoader;
|
return ResultStatus::ErrorGetLoader;
|
||||||
}
|
}
|
||||||
std::pair<std::optional<u32>, Loader::ResultStatus> system_mode =
|
|
||||||
app_loader->LoadKernelSystemMode();
|
|
||||||
|
|
||||||
if (system_mode.second != Loader::ResultStatus::Success) {
|
|
||||||
LOG_CRITICAL(Core, "Failed to determine system mode (Error {})!",
|
|
||||||
static_cast<int>(system_mode.second));
|
|
||||||
|
|
||||||
return ResultStatus::ErrorSystemMode;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultStatus init_result{Init(system, emu_window)};
|
ResultStatus init_result{Init(system, emu_window)};
|
||||||
if (init_result != ResultStatus::Success) {
|
if (init_result != ResultStatus::Success) {
|
||||||
|
@ -167,6 +149,7 @@ struct System::Impl {
|
||||||
return init_result;
|
return init_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
telemetry_session->AddInitialInfo(*app_loader);
|
||||||
auto main_process = Kernel::Process::Create(system, "main");
|
auto main_process = Kernel::Process::Create(system, "main");
|
||||||
const auto [load_result, load_parameters] = app_loader->Load(*main_process);
|
const auto [load_result, load_parameters] = app_loader->Load(*main_process);
|
||||||
if (load_result != Loader::ResultStatus::Success) {
|
if (load_result != Loader::ResultStatus::Success) {
|
||||||
|
|
|
@ -98,7 +98,6 @@ public:
|
||||||
Success, ///< Succeeded
|
Success, ///< Succeeded
|
||||||
ErrorNotInitialized, ///< Error trying to use core prior to initialization
|
ErrorNotInitialized, ///< Error trying to use core prior to initialization
|
||||||
ErrorGetLoader, ///< Error finding the correct application loader
|
ErrorGetLoader, ///< Error finding the correct application loader
|
||||||
ErrorSystemMode, ///< Error determining the system mode
|
|
||||||
ErrorSystemFiles, ///< Error in finding system files
|
ErrorSystemFiles, ///< Error in finding system files
|
||||||
ErrorSharedFont, ///< Error in finding shared font
|
ErrorSharedFont, ///< Error in finding shared font
|
||||||
ErrorVideoCore, ///< Error in the video core
|
ErrorVideoCore, ///< Error in the video core
|
||||||
|
|
|
@ -121,6 +121,21 @@ void Applet::Initialize() {
|
||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AppletFrontendSet::AppletFrontendSet() = default;
|
||||||
|
|
||||||
|
AppletFrontendSet::AppletFrontendSet(ErrorApplet error, PhotoViewer photo_viewer,
|
||||||
|
ProfileSelect profile_select,
|
||||||
|
SoftwareKeyboard software_keyboard, WebBrowser web_browser)
|
||||||
|
: error{std::move(error)}, photo_viewer{std::move(photo_viewer)}, profile_select{std::move(
|
||||||
|
profile_select)},
|
||||||
|
software_keyboard{std::move(software_keyboard)}, web_browser{std::move(web_browser)} {}
|
||||||
|
|
||||||
|
AppletFrontendSet::~AppletFrontendSet() = default;
|
||||||
|
|
||||||
|
AppletFrontendSet::AppletFrontendSet(AppletFrontendSet&&) noexcept = default;
|
||||||
|
|
||||||
|
AppletFrontendSet& AppletFrontendSet::operator=(AppletFrontendSet&&) noexcept = default;
|
||||||
|
|
||||||
AppletManager::AppletManager() = default;
|
AppletManager::AppletManager() = default;
|
||||||
|
|
||||||
AppletManager::~AppletManager() = default;
|
AppletManager::~AppletManager() = default;
|
||||||
|
|
|
@ -137,11 +137,28 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AppletFrontendSet {
|
struct AppletFrontendSet {
|
||||||
std::unique_ptr<Core::Frontend::ErrorApplet> error;
|
using ErrorApplet = std::unique_ptr<Core::Frontend::ErrorApplet>;
|
||||||
std::unique_ptr<Core::Frontend::PhotoViewerApplet> photo_viewer;
|
using PhotoViewer = std::unique_ptr<Core::Frontend::PhotoViewerApplet>;
|
||||||
std::unique_ptr<Core::Frontend::ProfileSelectApplet> profile_select;
|
using ProfileSelect = std::unique_ptr<Core::Frontend::ProfileSelectApplet>;
|
||||||
std::unique_ptr<Core::Frontend::SoftwareKeyboardApplet> software_keyboard;
|
using SoftwareKeyboard = std::unique_ptr<Core::Frontend::SoftwareKeyboardApplet>;
|
||||||
std::unique_ptr<Core::Frontend::WebBrowserApplet> web_browser;
|
using WebBrowser = std::unique_ptr<Core::Frontend::WebBrowserApplet>;
|
||||||
|
|
||||||
|
AppletFrontendSet();
|
||||||
|
AppletFrontendSet(ErrorApplet error, PhotoViewer photo_viewer, ProfileSelect profile_select,
|
||||||
|
SoftwareKeyboard software_keyboard, WebBrowser web_browser);
|
||||||
|
~AppletFrontendSet();
|
||||||
|
|
||||||
|
AppletFrontendSet(const AppletFrontendSet&) = delete;
|
||||||
|
AppletFrontendSet& operator=(const AppletFrontendSet&) = delete;
|
||||||
|
|
||||||
|
AppletFrontendSet(AppletFrontendSet&&) noexcept;
|
||||||
|
AppletFrontendSet& operator=(AppletFrontendSet&&) noexcept;
|
||||||
|
|
||||||
|
ErrorApplet error;
|
||||||
|
PhotoViewer photo_viewer;
|
||||||
|
ProfileSelect profile_select;
|
||||||
|
SoftwareKeyboard software_keyboard;
|
||||||
|
WebBrowser web_browser;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AppletManager {
|
class AppletManager {
|
||||||
|
|
|
@ -153,17 +153,6 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual LoadResult Load(Kernel::Process& process) = 0;
|
virtual LoadResult Load(Kernel::Process& process) = 0;
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads the system mode that this application needs.
|
|
||||||
* This function defaults to 2 (96MB allocated to the application) if it can't read the
|
|
||||||
* information.
|
|
||||||
* @returns A pair with the optional system mode, and and the status.
|
|
||||||
*/
|
|
||||||
virtual std::pair<std::optional<u32>, ResultStatus> LoadKernelSystemMode() {
|
|
||||||
// 96MB allocated to the application.
|
|
||||||
return std::make_pair(2, ResultStatus::Success);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the code (typically .code section) of the application
|
* Get the code (typically .code section) of the application
|
||||||
* @param buffer Reference to buffer to store data
|
* @param buffer Reference to buffer to store data
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
#include "common/file_util.h"
|
#include "common/file_util.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
|
|
||||||
#include "core/core.h"
|
|
||||||
#include "core/file_sys/control_metadata.h"
|
#include "core/file_sys/control_metadata.h"
|
||||||
#include "core/file_sys/patch_manager.h"
|
#include "core/file_sys/patch_manager.h"
|
||||||
#include "core/loader/loader.h"
|
#include "core/loader/loader.h"
|
||||||
|
@ -101,7 +100,30 @@ bool VerifyLogin(const std::string& username, const std::string& token) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TelemetrySession::TelemetrySession() {
|
TelemetrySession::TelemetrySession() = default;
|
||||||
|
|
||||||
|
TelemetrySession::~TelemetrySession() {
|
||||||
|
// Log one-time session end information
|
||||||
|
const s64 shutdown_time{std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||||
|
std::chrono::system_clock::now().time_since_epoch())
|
||||||
|
.count()};
|
||||||
|
AddField(Telemetry::FieldType::Session, "Shutdown_Time", shutdown_time);
|
||||||
|
|
||||||
|
#ifdef ENABLE_WEB_SERVICE
|
||||||
|
auto backend = std::make_unique<WebService::TelemetryJson>(
|
||||||
|
Settings::values.web_api_url, Settings::values.yuzu_username, Settings::values.yuzu_token);
|
||||||
|
#else
|
||||||
|
auto backend = std::make_unique<Telemetry::NullVisitor>();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Complete the session, submitting to the web service backend if necessary
|
||||||
|
field_collection.Accept(*backend);
|
||||||
|
if (Settings::values.enable_telemetry) {
|
||||||
|
backend->Complete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TelemetrySession::AddInitialInfo(Loader::AppLoader& app_loader) {
|
||||||
// Log one-time top-level information
|
// Log one-time top-level information
|
||||||
AddField(Telemetry::FieldType::None, "TelemetryId", GetTelemetryId());
|
AddField(Telemetry::FieldType::None, "TelemetryId", GetTelemetryId());
|
||||||
|
|
||||||
|
@ -112,26 +134,28 @@ TelemetrySession::TelemetrySession() {
|
||||||
AddField(Telemetry::FieldType::Session, "Init_Time", init_time);
|
AddField(Telemetry::FieldType::Session, "Init_Time", init_time);
|
||||||
|
|
||||||
u64 program_id{};
|
u64 program_id{};
|
||||||
const Loader::ResultStatus res{System::GetInstance().GetAppLoader().ReadProgramId(program_id)};
|
const Loader::ResultStatus res{app_loader.ReadProgramId(program_id)};
|
||||||
if (res == Loader::ResultStatus::Success) {
|
if (res == Loader::ResultStatus::Success) {
|
||||||
const std::string formatted_program_id{fmt::format("{:016X}", program_id)};
|
const std::string formatted_program_id{fmt::format("{:016X}", program_id)};
|
||||||
AddField(Telemetry::FieldType::Session, "ProgramId", formatted_program_id);
|
AddField(Telemetry::FieldType::Session, "ProgramId", formatted_program_id);
|
||||||
|
|
||||||
std::string name;
|
std::string name;
|
||||||
System::GetInstance().GetAppLoader().ReadTitle(name);
|
app_loader.ReadTitle(name);
|
||||||
|
|
||||||
if (name.empty()) {
|
if (name.empty()) {
|
||||||
auto [nacp, icon_file] = FileSys::PatchManager(program_id).GetControlMetadata();
|
auto [nacp, icon_file] = FileSys::PatchManager(program_id).GetControlMetadata();
|
||||||
if (nacp != nullptr)
|
if (nacp != nullptr) {
|
||||||
name = nacp->GetApplicationName();
|
name = nacp->GetApplicationName();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!name.empty())
|
if (!name.empty()) {
|
||||||
AddField(Telemetry::FieldType::Session, "ProgramName", name);
|
AddField(Telemetry::FieldType::Session, "ProgramName", name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AddField(Telemetry::FieldType::Session, "ProgramFormat",
|
AddField(Telemetry::FieldType::Session, "ProgramFormat",
|
||||||
static_cast<u8>(System::GetInstance().GetAppLoader().GetFileType()));
|
static_cast<u8>(app_loader.GetFileType()));
|
||||||
|
|
||||||
// Log application information
|
// Log application information
|
||||||
Telemetry::AppendBuildInfo(field_collection);
|
Telemetry::AppendBuildInfo(field_collection);
|
||||||
|
@ -162,27 +186,6 @@ TelemetrySession::TelemetrySession() {
|
||||||
Settings::values.use_docked_mode);
|
Settings::values.use_docked_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
TelemetrySession::~TelemetrySession() {
|
|
||||||
// Log one-time session end information
|
|
||||||
const s64 shutdown_time{std::chrono::duration_cast<std::chrono::milliseconds>(
|
|
||||||
std::chrono::system_clock::now().time_since_epoch())
|
|
||||||
.count()};
|
|
||||||
AddField(Telemetry::FieldType::Session, "Shutdown_Time", shutdown_time);
|
|
||||||
|
|
||||||
#ifdef ENABLE_WEB_SERVICE
|
|
||||||
auto backend = std::make_unique<WebService::TelemetryJson>(
|
|
||||||
Settings::values.web_api_url, Settings::values.yuzu_username, Settings::values.yuzu_token);
|
|
||||||
#else
|
|
||||||
auto backend = std::make_unique<Telemetry::NullVisitor>();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Complete the session, submitting to web service if necessary
|
|
||||||
field_collection.Accept(*backend);
|
|
||||||
if (Settings::values.enable_telemetry)
|
|
||||||
backend->Complete();
|
|
||||||
backend = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TelemetrySession::SubmitTestcase() {
|
bool TelemetrySession::SubmitTestcase() {
|
||||||
#ifdef ENABLE_WEB_SERVICE
|
#ifdef ENABLE_WEB_SERVICE
|
||||||
auto backend = std::make_unique<WebService::TelemetryJson>(
|
auto backend = std::make_unique<WebService::TelemetryJson>(
|
||||||
|
|
|
@ -4,10 +4,13 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "common/telemetry.h"
|
#include "common/telemetry.h"
|
||||||
|
|
||||||
|
namespace Loader {
|
||||||
|
class AppLoader;
|
||||||
|
}
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -15,11 +18,33 @@ namespace Core {
|
||||||
* session, logging any one-time fields. Interfaces with the telemetry backend used for submitting
|
* session, logging any one-time fields. Interfaces with the telemetry backend used for submitting
|
||||||
* data to the web service. Submits session data on close.
|
* data to the web service. Submits session data on close.
|
||||||
*/
|
*/
|
||||||
class TelemetrySession : NonCopyable {
|
class TelemetrySession {
|
||||||
public:
|
public:
|
||||||
TelemetrySession();
|
explicit TelemetrySession();
|
||||||
~TelemetrySession();
|
~TelemetrySession();
|
||||||
|
|
||||||
|
TelemetrySession(const TelemetrySession&) = delete;
|
||||||
|
TelemetrySession& operator=(const TelemetrySession&) = delete;
|
||||||
|
|
||||||
|
TelemetrySession(TelemetrySession&&) = delete;
|
||||||
|
TelemetrySession& operator=(TelemetrySession&&) = delete;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds the initial telemetry info necessary when starting up a title.
|
||||||
|
*
|
||||||
|
* This includes information such as:
|
||||||
|
* - Telemetry ID
|
||||||
|
* - Initialization time
|
||||||
|
* - Title ID
|
||||||
|
* - Title name
|
||||||
|
* - Title file format
|
||||||
|
* - Miscellaneous settings values.
|
||||||
|
*
|
||||||
|
* @param app_loader The application loader to use to retrieve
|
||||||
|
* title-specific information.
|
||||||
|
*/
|
||||||
|
void AddInitialInfo(Loader::AppLoader& app_loader);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper around the Telemetry::FieldCollection::AddField method.
|
* Wrapper around the Telemetry::FieldCollection::AddField method.
|
||||||
* @param type Type of the field to add.
|
* @param type Type of the field to add.
|
||||||
|
|
|
@ -847,11 +847,6 @@ bool GMainWindow::LoadROM(const QString& filename) {
|
||||||
QMessageBox::critical(this, tr("Error while loading ROM!"),
|
QMessageBox::critical(this, tr("Error while loading ROM!"),
|
||||||
tr("The ROM format is not supported."));
|
tr("The ROM format is not supported."));
|
||||||
break;
|
break;
|
||||||
case Core::System::ResultStatus::ErrorSystemMode:
|
|
||||||
LOG_CRITICAL(Frontend, "Failed to load ROM!");
|
|
||||||
QMessageBox::critical(this, tr("Error while loading ROM!"),
|
|
||||||
tr("Could not determine the system mode."));
|
|
||||||
break;
|
|
||||||
case Core::System::ResultStatus::ErrorVideoCore:
|
case Core::System::ResultStatus::ErrorVideoCore:
|
||||||
QMessageBox::critical(
|
QMessageBox::critical(
|
||||||
this, tr("An error occurred initializing the video core."),
|
this, tr("An error occurred initializing the video core."),
|
||||||
|
|
|
@ -192,7 +192,7 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
switch (load_result) {
|
switch (load_result) {
|
||||||
case Core::System::ResultStatus::ErrorGetLoader:
|
case Core::System::ResultStatus::ErrorGetLoader:
|
||||||
LOG_CRITICAL(Frontend, "Failed to obtain loader for %s!", filepath.c_str());
|
LOG_CRITICAL(Frontend, "Failed to obtain loader for {}!", filepath);
|
||||||
return -1;
|
return -1;
|
||||||
case Core::System::ResultStatus::ErrorLoader:
|
case Core::System::ResultStatus::ErrorLoader:
|
||||||
LOG_CRITICAL(Frontend, "Failed to load ROM!");
|
LOG_CRITICAL(Frontend, "Failed to load ROM!");
|
||||||
|
@ -200,9 +200,6 @@ int main(int argc, char** argv) {
|
||||||
case Core::System::ResultStatus::ErrorNotInitialized:
|
case Core::System::ResultStatus::ErrorNotInitialized:
|
||||||
LOG_CRITICAL(Frontend, "CPUCore not initialized");
|
LOG_CRITICAL(Frontend, "CPUCore not initialized");
|
||||||
return -1;
|
return -1;
|
||||||
case Core::System::ResultStatus::ErrorSystemMode:
|
|
||||||
LOG_CRITICAL(Frontend, "Failed to determine system mode!");
|
|
||||||
return -1;
|
|
||||||
case Core::System::ResultStatus::ErrorVideoCore:
|
case Core::System::ResultStatus::ErrorVideoCore:
|
||||||
LOG_CRITICAL(Frontend, "Failed to initialize VideoCore!");
|
LOG_CRITICAL(Frontend, "Failed to initialize VideoCore!");
|
||||||
return -1;
|
return -1;
|
||||||
|
|
Loading…
Reference in a new issue