Merge pull request #2526 from lioncash/global
core/telemetry_session: Remove usages of the global system accessor
This commit is contained in:
		| @@ -18,11 +18,6 @@ | ||||
| #include "core/file_sys/registered_cache.h" | ||||
| #include "core/file_sys/vfs_concat.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/hle/kernel/client_port.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| @@ -37,9 +32,6 @@ | ||||
| #include "core/settings.h" | ||||
| #include "core/telemetry_session.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/renderer_base.h" | ||||
| #include "video_core/video_core.h" | ||||
| @@ -144,20 +136,10 @@ struct System::Impl { | ||||
|     ResultStatus Load(System& system, Frontend::EmuWindow& emu_window, | ||||
|                       const std::string& filepath) { | ||||
|         app_loader = Loader::GetLoader(GetGameFileFromPath(virtual_filesystem, filepath)); | ||||
|  | ||||
|         if (!app_loader) { | ||||
|             LOG_CRITICAL(Core, "Failed to obtain loader for {}!", filepath); | ||||
|             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)}; | ||||
|         if (init_result != ResultStatus::Success) { | ||||
| @@ -167,6 +149,7 @@ struct System::Impl { | ||||
|             return init_result; | ||||
|         } | ||||
|  | ||||
|         telemetry_session->AddInitialInfo(*app_loader); | ||||
|         auto main_process = Kernel::Process::Create(system, "main"); | ||||
|         const auto [load_result, load_parameters] = app_loader->Load(*main_process); | ||||
|         if (load_result != Loader::ResultStatus::Success) { | ||||
|   | ||||
| @@ -98,7 +98,6 @@ public: | ||||
|         Success,             ///< Succeeded | ||||
|         ErrorNotInitialized, ///< Error trying to use core prior to initialization | ||||
|         ErrorGetLoader,      ///< Error finding the correct application loader | ||||
|         ErrorSystemMode,     ///< Error determining the system mode | ||||
|         ErrorSystemFiles,    ///< Error in finding system files | ||||
|         ErrorSharedFont,     ///< Error in finding shared font | ||||
|         ErrorVideoCore,      ///< Error in the video core | ||||
|   | ||||
| @@ -121,6 +121,21 @@ void Applet::Initialize() { | ||||
|     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; | ||||
|   | ||||
| @@ -137,11 +137,28 @@ protected: | ||||
| }; | ||||
|  | ||||
| struct AppletFrontendSet { | ||||
|     std::unique_ptr<Core::Frontend::ErrorApplet> error; | ||||
|     std::unique_ptr<Core::Frontend::PhotoViewerApplet> photo_viewer; | ||||
|     std::unique_ptr<Core::Frontend::ProfileSelectApplet> profile_select; | ||||
|     std::unique_ptr<Core::Frontend::SoftwareKeyboardApplet> software_keyboard; | ||||
|     std::unique_ptr<Core::Frontend::WebBrowserApplet> web_browser; | ||||
|     using ErrorApplet = std::unique_ptr<Core::Frontend::ErrorApplet>; | ||||
|     using PhotoViewer = std::unique_ptr<Core::Frontend::PhotoViewerApplet>; | ||||
|     using ProfileSelect = std::unique_ptr<Core::Frontend::ProfileSelectApplet>; | ||||
|     using SoftwareKeyboard = std::unique_ptr<Core::Frontend::SoftwareKeyboardApplet>; | ||||
|     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 { | ||||
|   | ||||
| @@ -153,17 +153,6 @@ public: | ||||
|      */ | ||||
|     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 | ||||
|      * @param buffer Reference to buffer to store data | ||||
|   | ||||
| @@ -12,7 +12,6 @@ | ||||
| #include "common/file_util.h" | ||||
| #include "common/logging/log.h" | ||||
|  | ||||
| #include "core/core.h" | ||||
| #include "core/file_sys/control_metadata.h" | ||||
| #include "core/file_sys/patch_manager.h" | ||||
| #include "core/loader/loader.h" | ||||
| @@ -101,7 +100,30 @@ bool VerifyLogin(const std::string& username, const std::string& token) { | ||||
| #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 | ||||
|     AddField(Telemetry::FieldType::None, "TelemetryId", GetTelemetryId()); | ||||
|  | ||||
| @@ -112,26 +134,28 @@ TelemetrySession::TelemetrySession() { | ||||
|     AddField(Telemetry::FieldType::Session, "Init_Time", init_time); | ||||
|  | ||||
|     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) { | ||||
|         const std::string formatted_program_id{fmt::format("{:016X}", program_id)}; | ||||
|         AddField(Telemetry::FieldType::Session, "ProgramId", formatted_program_id); | ||||
|  | ||||
|         std::string name; | ||||
|         System::GetInstance().GetAppLoader().ReadTitle(name); | ||||
|         app_loader.ReadTitle(name); | ||||
|  | ||||
|         if (name.empty()) { | ||||
|             auto [nacp, icon_file] = FileSys::PatchManager(program_id).GetControlMetadata(); | ||||
|             if (nacp != nullptr) | ||||
|             if (nacp != nullptr) { | ||||
|                 name = nacp->GetApplicationName(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (!name.empty()) | ||||
|         if (!name.empty()) { | ||||
|             AddField(Telemetry::FieldType::Session, "ProgramName", name); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     AddField(Telemetry::FieldType::Session, "ProgramFormat", | ||||
|              static_cast<u8>(System::GetInstance().GetAppLoader().GetFileType())); | ||||
|              static_cast<u8>(app_loader.GetFileType())); | ||||
|  | ||||
|     // Log application information | ||||
|     Telemetry::AppendBuildInfo(field_collection); | ||||
| @@ -162,27 +186,6 @@ TelemetrySession::TelemetrySession() { | ||||
|              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() { | ||||
| #ifdef ENABLE_WEB_SERVICE | ||||
|     auto backend = std::make_unique<WebService::TelemetryJson>( | ||||
|   | ||||
| @@ -4,10 +4,13 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include "common/telemetry.h" | ||||
|  | ||||
| namespace Loader { | ||||
| class AppLoader; | ||||
| } | ||||
|  | ||||
| namespace Core { | ||||
|  | ||||
| /** | ||||
| @@ -15,11 +18,33 @@ namespace Core { | ||||
|  * session, logging any one-time fields. Interfaces with the telemetry backend used for submitting | ||||
|  * data to the web service. Submits session data on close. | ||||
|  */ | ||||
| class TelemetrySession : NonCopyable { | ||||
| class TelemetrySession { | ||||
| public: | ||||
|     TelemetrySession(); | ||||
|     explicit 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. | ||||
|      * @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!"), | ||||
|                                   tr("The ROM format is not supported.")); | ||||
|             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: | ||||
|             QMessageBox::critical( | ||||
|                 this, tr("An error occurred initializing the video core."), | ||||
|   | ||||
| @@ -192,7 +192,7 @@ int main(int argc, char** argv) { | ||||
|  | ||||
|     switch (load_result) { | ||||
|     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; | ||||
|     case Core::System::ResultStatus::ErrorLoader: | ||||
|         LOG_CRITICAL(Frontend, "Failed to load ROM!"); | ||||
| @@ -200,9 +200,6 @@ int main(int argc, char** argv) { | ||||
|     case Core::System::ResultStatus::ErrorNotInitialized: | ||||
|         LOG_CRITICAL(Frontend, "CPUCore not initialized"); | ||||
|         return -1; | ||||
|     case Core::System::ResultStatus::ErrorSystemMode: | ||||
|         LOG_CRITICAL(Frontend, "Failed to determine system mode!"); | ||||
|         return -1; | ||||
|     case Core::System::ResultStatus::ErrorVideoCore: | ||||
|         LOG_CRITICAL(Frontend, "Failed to initialize VideoCore!"); | ||||
|         return -1; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user