From 6f22471a72a9d6bb0c3063b7e7a1e995ed188825 Mon Sep 17 00:00:00 2001 From: Rozlette Date: Wed, 17 Jan 2018 13:33:38 -0600 Subject: TIME: consolidate time:* interfaces, stub functions and structs --- src/core/CMakeLists.txt | 2 - src/core/hle/service/time/time.cpp | 130 ++++++++++++++++++++++++++++++++++- src/core/hle/service/time/time.h | 36 ++++++++++ src/core/hle/service/time/time_s.cpp | 58 ---------------- src/core/hle/service/time/time_s.h | 23 ------- 5 files changed, 164 insertions(+), 85 deletions(-) delete mode 100644 src/core/hle/service/time/time_s.cpp delete mode 100644 src/core/hle/service/time/time_s.h diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 20e41038b..661545e96 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -58,7 +58,6 @@ set(SRCS hle/service/sm/controller.cpp hle/service/sm/sm.cpp hle/service/time/time.cpp - hle/service/time/time_s.cpp hle/service/vi/vi.cpp hle/service/vi/vi_m.cpp hle/shared_page.cpp @@ -148,7 +147,6 @@ set(HEADERS hle/service/sm/controller.h hle/service/sm/sm.h hle/service/time/time.h - hle/service/time/time_s.h hle/service/vi/vi.h hle/service/vi/vi_m.h hle/shared_page.h diff --git a/src/core/hle/service/time/time.cpp b/src/core/hle/service/time/time.cpp index e3d58aa60..674b59509 100644 --- a/src/core/hle/service/time/time.cpp +++ b/src/core/hle/service/time/time.cpp @@ -2,14 +2,140 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include +#include "common/logging/log.h" +#include "core/hle/ipc_helpers.h" +#include "core/hle/kernel/client_port.h" +#include "core/hle/kernel/client_session.h" #include "core/hle/service/time/time.h" -#include "core/hle/service/time/time_s.h" namespace Service { namespace Time { +class ISystemClock final : public ServiceFramework { +public: + ISystemClock() : ServiceFramework("ISystemClock") { + static const FunctionInfo functions[] = { + {0, &ISystemClock::GetCurrentTime, "GetCurrentTime"}, + }; + RegisterHandlers(functions); + } + +private: + void GetCurrentTime(Kernel::HLERequestContext& ctx) { + const s64 time_since_epoch{std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()) + .count()}; + IPC::RequestBuilder rb{ctx, 4}; + rb.Push(RESULT_SUCCESS); + rb.Push(time_since_epoch); + LOG_DEBUG(Service, "called"); + } +}; + +class ISteadyClock final : public ServiceFramework { +public: + ISteadyClock() : ServiceFramework("ISteadyClock") {} +}; + +class ITimeZoneService final : public ServiceFramework { +public: + ITimeZoneService() : ServiceFramework("ITimeZoneService") { + static const FunctionInfo functions[] = { + {0, &ITimeZoneService::GetDeviceLocationName, "GetDeviceLocationName"}, + {101, &ITimeZoneService::ToCalendarTimeWithMyRule, "ToCalendarTimeWithMyRule"}, + }; + RegisterHandlers(functions); + } + +private: + void GetDeviceLocationName(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service, "(STUBBED) called"); + LocationName name{}; + IPC::RequestBuilder rb{ctx, 11}; + rb.Push(RESULT_SUCCESS); + rb.PushRaw(name); + } + + void ToCalendarTimeWithMyRule(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + u64 posixTime = rp.Pop(); + + LOG_WARNING(Service, "(STUBBED) called, posixTime=0x%016llX", posixTime); + + CalendarTime calendarTime{2018, 1, 1, 0, 0, 0}; + CalendarAdditionalInfo additionalInfo{}; + IPC::RequestBuilder rb{ctx, 10}; + rb.Push(RESULT_SUCCESS); + rb.PushRaw(calendarTime); + rb.PushRaw(additionalInfo); + } +}; + +void TIME::GetStandardUserSystemClock(Kernel::HLERequestContext& ctx) { + auto client_port = std::make_shared()->CreatePort(); + auto session = client_port->Connect(); + if (session.Succeeded()) { + LOG_DEBUG(Service, "called, initialized ISystemClock -> session=%u", + (*session)->GetObjectId()); + IPC::RequestBuilder rb{ctx, 2, 0, 1}; + rb.Push(RESULT_SUCCESS); + rb.PushMoveObjects(std::move(session).Unwrap()); + } else { + UNIMPLEMENTED(); + } +} + +void TIME::GetStandardNetworkSystemClock(Kernel::HLERequestContext& ctx) { + auto client_port = std::make_shared()->CreatePort(); + auto session = client_port->Connect(); + if (session.Succeeded()) { + LOG_DEBUG(Service, "called, initialized ISystemClock -> session=%u", + (*session)->GetObjectId()); + IPC::RequestBuilder rb{ctx, 2, 0, 1}; + rb.Push(RESULT_SUCCESS); + rb.PushMoveObjects(std::move(session).Unwrap()); + } else { + UNIMPLEMENTED(); + } +} + +void TIME::GetStandardSteadyClock(Kernel::HLERequestContext& ctx) { + auto client_port = std::make_shared()->CreatePort(); + auto session = client_port->Connect(); + if (session.Succeeded()) { + LOG_DEBUG(Service, "called, initialized ISteadyClock -> session=%u", + (*session)->GetObjectId()); + IPC::RequestBuilder rb{ctx, 2, 0, 1}; + rb.Push(RESULT_SUCCESS); + rb.PushMoveObjects(std::move(session).Unwrap()); + } else { + UNIMPLEMENTED(); + } +} + +void TIME::GetTimeZoneService(Kernel::HLERequestContext& ctx) { + IPC::RequestBuilder rb{ctx, 2, 0, 0, 1}; + rb.Push(RESULT_SUCCESS); + rb.PushIpcInterface(); + LOG_DEBUG(Service, "called"); +} + +TIME::TIME(const char* name) : ServiceFramework(name) { + static const FunctionInfo functions[] = { + {0x00000000, &TIME::GetStandardUserSystemClock, "GetStandardUserSystemClock"}, + {0x00000001, &TIME::GetStandardNetworkSystemClock, "GetStandardNetworkSystemClock"}, + {0x00000002, &TIME::GetStandardSteadyClock, "GetStandardSteadyClock"}, + {0x00000003, &TIME::GetTimeZoneService, "GetTimeZoneService"}, + }; + RegisterHandlers(functions); +} + void InstallInterfaces(SM::ServiceManager& service_manager) { - std::make_shared()->InstallAsService(service_manager); + std::make_shared