diff --git a/src/core/hle/service/olsc/daemon_controller.cpp b/src/core/hle/service/olsc/daemon_controller.cpp index fe4252c24a..45f0f75b94 100644 --- a/src/core/hle/service/olsc/daemon_controller.cpp +++ b/src/core/hle/service/olsc/daemon_controller.cpp @@ -13,16 +13,17 @@ IDaemonController::IDaemonController(Core::System& system_) : ServiceFramework{system_, "IDaemonController"} { // clang-format off static const FunctionInfo functions[] = { - {0, D<&IDaemonController::GetAutoTransferEnabledForAccountAndApplication>, "GetAutoTransferEnabledForAccountAndApplication"}, - {1, nullptr, "SetAutoTransferEnabledForAccountAndApplication"}, - {2, nullptr, "GetGlobalUploadEnabledForAccount"}, - {3, nullptr, "SetGlobalUploadEnabledForAccount"}, - {4, nullptr, "TouchAccount"}, - {5, nullptr, "GetGlobalDownloadEnabledForAccount"}, - {6, nullptr, "SetGlobalDownloadEnabledForAccount"}, - {10, nullptr, "GetForbiddenSaveDataIndication"}, - {11, nullptr, "GetStopperObject"}, - {12, D<&IDaemonController::GetState>, "GetState"}, + {0, D<&IDaemonController::GetApplicationAutoTransferSetting>, "GetApplicationAutoTransferSetting"}, + {1, D<&IDaemonController::SetApplicationAutoTransferSetting>, "SetApplicationAutoTransferSetting"}, + {2, D<&IDaemonController::GetGlobalAutoUploadSetting>, "GetGlobalAutoUploadSetting"}, + {3, D<&IDaemonController::SetGlobalAutoUploadSetting>, "SetGlobalAutoUploadSetting"}, + {4, D<&IDaemonController::RunTransferTaskAutonomyRegistration>, "RunTransferTaskAutonomyRegistration"}, + {5, D<&IDaemonController::GetGlobalAutoDownloadSetting>, "GetGlobalAutoDownloadSetting"}, // 11.0.0+ + {6, D<&IDaemonController::SetGlobalAutoDownloadSetting>, "SetGlobalAutoDownloadSetting"}, // 11.0.0+ + {10, nullptr, "CreateForbiddenSaveDataInidication"}, + {11, nullptr, "StopAutonomyTaskExecution"}, + {12, D<&IDaemonController::GetAutonomyTaskStatus>, "GetAutonomyTaskStatus"}, + {13, nullptr, "Unknown13_20_0_0_Plus"}, // 20.0.0+ }; // clang-format on @@ -31,19 +32,73 @@ IDaemonController::IDaemonController(Core::System& system_) IDaemonController::~IDaemonController() = default; -Result IDaemonController::GetAutoTransferEnabledForAccountAndApplication(Out out_is_enabled, - Common::UUID user_id, - u64 application_id) { - LOG_WARNING(Service_OLSC, "(STUBBED) called, user_id={} application_id={:016X}", - user_id.FormattedString(), application_id); - *out_is_enabled = false; +Result IDaemonController::GetApplicationAutoTransferSetting(Out out_is_enabled, + Common::UUID user_id, + u64 application_id) { + LOG_INFO(Service_OLSC, "called, user_id={} application_id={:016X}", user_id.FormattedString(), + application_id); + AppKey key{user_id, application_id}; + const auto it = app_auto_transfer_.find(key); + *out_is_enabled = (it != app_auto_transfer_.end()) ? it->second : false; R_SUCCEED(); } -Result IDaemonController::GetState(Out state, Common::UUID user_id, u64 application_id) { - LOG_WARNING(Service_OLSC, "(STUBBED) called, user_id={} application_id={:016X}", - user_id.FormattedString(), application_id); - *state = 0; +Result IDaemonController::SetApplicationAutoTransferSetting(bool is_enabled, Common::UUID user_id, + u64 application_id) { + LOG_INFO(Service_OLSC, "called, user_id={} application_id={:016X} is_enabled={}", + user_id.FormattedString(), application_id, is_enabled); + AppKey key{user_id, application_id}; + app_auto_transfer_[key] = is_enabled; + R_SUCCEED(); +} + +Result IDaemonController::GetGlobalAutoUploadSetting(Out out_is_enabled, + Common::UUID user_id) { + LOG_INFO(Service_OLSC, "called, user_id={}", user_id.FormattedString()); + const auto it = global_auto_upload_.find(user_id); + *out_is_enabled = (it != global_auto_upload_.end()) ? it->second : false; + R_SUCCEED(); +} + +Result IDaemonController::SetGlobalAutoUploadSetting(bool is_enabled, Common::UUID user_id) { + LOG_INFO(Service_OLSC, "called, user_id={} is_enabled={}", user_id.FormattedString(), is_enabled); + global_auto_upload_[user_id] = is_enabled; + R_SUCCEED(); +} + +Result IDaemonController::RunTransferTaskAutonomyRegistration(Common::UUID user_id, + u64 application_id) { + LOG_INFO(Service_OLSC, "called, user_id={} application_id={:016X}", user_id.FormattedString(), + application_id); + // Simulate starting an autonomy task: set status to 1 (running) then back to 0 (idle) + AppKey key{user_id, application_id}; + autonomy_task_status_[key] = 1; // running + // TODO: In a real implementation this would be asynchronous. We'll immediately set to idle. + autonomy_task_status_[key] = 0; // idle + R_SUCCEED(); +} + +Result IDaemonController::GetGlobalAutoDownloadSetting(Out out_is_enabled, + Common::UUID user_id) { + LOG_INFO(Service_OLSC, "called, user_id={}", user_id.FormattedString()); + const auto it = global_auto_download_.find(user_id); + *out_is_enabled = (it != global_auto_download_.end()) ? it->second : false; + R_SUCCEED(); +} + +Result IDaemonController::SetGlobalAutoDownloadSetting(bool is_enabled, Common::UUID user_id) { + LOG_INFO(Service_OLSC, "called, user_id={} is_enabled={}", user_id.FormattedString(), is_enabled); + global_auto_download_[user_id] = is_enabled; + R_SUCCEED(); +} + +Result IDaemonController::GetAutonomyTaskStatus(Out out_state, Common::UUID user_id, + u64 application_id) { + LOG_INFO(Service_OLSC, "called, user_id={} application_id={:016X}", user_id.FormattedString(), + application_id); + AppKey key{user_id, application_id}; + const auto it = autonomy_task_status_.find(key); + *out_state = (it != autonomy_task_status_.end()) ? it->second : 0; // default idle R_SUCCEED(); } diff --git a/src/core/hle/service/olsc/daemon_controller.h b/src/core/hle/service/olsc/daemon_controller.h index 18c7b6204a..7e5416562e 100644 --- a/src/core/hle/service/olsc/daemon_controller.h +++ b/src/core/hle/service/olsc/daemon_controller.h @@ -1,9 +1,12 @@ +#pragma once // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include + #include "common/uuid.h" #include "core/hle/service/cmif_types.h" #include "core/hle/service/service.h" @@ -16,9 +19,43 @@ public: ~IDaemonController() override; private: - Result GetAutoTransferEnabledForAccountAndApplication(Out out_is_enabled, - Common::UUID user_id, u64 application_id); - Result GetState(Out state, Common::UUID user_id, u64 application_id); + Result GetApplicationAutoTransferSetting(Out out_is_enabled, Common::UUID user_id, + u64 application_id); + Result SetApplicationAutoTransferSetting(bool is_enabled, Common::UUID user_id, + u64 application_id); + + Result GetGlobalAutoUploadSetting(Out out_is_enabled, Common::UUID user_id); + Result SetGlobalAutoUploadSetting(bool is_enabled, Common::UUID user_id); + + Result RunTransferTaskAutonomyRegistration(Common::UUID user_id, u64 application_id); + + Result GetGlobalAutoDownloadSetting(Out out_is_enabled, Common::UUID user_id); + Result SetGlobalAutoDownloadSetting(bool is_enabled, Common::UUID user_id); + + Result GetAutonomyTaskStatus(Out out_state, Common::UUID user_id, u64 application_id); + + // Internal in-memory state to back the above APIs + struct AppKey { + Common::UUID user_id; + u64 application_id{}; + friend constexpr bool operator==(const AppKey& a, const AppKey& b) { + return a.user_id == b.user_id && a.application_id == b.application_id; + } + }; + struct AppKeyHash { + size_t operator()(const AppKey& k) const noexcept { + // Combine UUID hash and application_id + size_t h1 = std::hash{}(k.user_id); + size_t h2 = std::hash{}(k.application_id); + // Simple hash combine + return h1 ^ (h2 + 0x9e3779b97f4a7c15ULL + (h1 << 6) + (h1 >> 2)); + } + }; + + std::unordered_map app_auto_transfer_{}; + std::unordered_map global_auto_upload_{}; + std::unordered_map global_auto_download_{}; + std::unordered_map autonomy_task_status_{}; }; } // namespace Service::OLSC