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