Refactor time services

Use the new service naming convention.
Split out each sub-service into it's own file.
Fix some incorrect comments.
This commit is contained in:
Billy Laws 2020-02-16 18:42:38 +00:00 committed by ◱ PixelyIon
parent 704a5bdcb1
commit ab33f692c6
11 changed files with 189 additions and 165 deletions

View File

@ -62,7 +62,9 @@ add_library(skyline SHARED
${source_DIR}/skyline/services/am/applet.cpp
${source_DIR}/skyline/services/am/appletController.cpp
${source_DIR}/skyline/services/hid/hid.cpp
${source_DIR}/skyline/services/time/time.cpp
${source_DIR}/skyline/services/timesrv/IStaticService.cpp
${source_DIR}/skyline/services/timesrv/ISystemClock.cpp
${source_DIR}/skyline/services/timesrv/ITimeZoneService.cpp
${source_DIR}/skyline/services/fs/fs.cpp
${source_DIR}/skyline/services/nvdrv/nvdrv.cpp
${source_DIR}/skyline/services/nvnflinger/dispdrv.cpp

View File

@ -44,9 +44,9 @@ namespace skyline::service {
IAudioRenderer,
hid,
hid_IAppletResource,
time,
time_ISystemClock,
time_ITimeZoneService,
timesrv_IStaticService,
timesrv_ISystemClock,
timesrv_ITimeZoneService,
fs_fsp,
fs_IFileSystem,
nvdrv,
@ -69,8 +69,9 @@ namespace skyline::service {
{"audout:u", Service::audout_u},
{"audren:u", Service::IAudioRendererManager},
{"hid", Service::hid},
{"time:s", Service::time},
{"time:a", Service::time},
{"time:s", Service::timesrv_IStaticService},
{"time:a", Service::timesrv_IStaticService},
{"time:u", Service::timesrv_IStaticService},
{"fsp-srv", Service::fs_fsp},
{"nvdrv", Service::nvdrv},
{"nvdrv:a", Service::nvdrv},

View File

@ -8,7 +8,7 @@
#include "audout/audout.h"
#include "fatal/fatal.h"
#include "hid/hid.h"
#include "time/timesrv.h"
#include "timesrv/IStaticService.h"
#include "fs/fs.h"
#include "nvdrv/nvdrv.h"
#include "vi/vi_m.h"
@ -50,8 +50,8 @@ namespace skyline::service {
case Service::hid:
serviceObj = std::make_shared<hid::hid>(state, *this);
break;
case Service::time:
serviceObj = std::make_shared<time::time>(state, *this);
case Service::timesrv_IStaticService:
serviceObj = std::make_shared<timesrv::IStaticService>(state, *this);
break;
case Service::fs_fsp:
serviceObj = std::make_shared<fs::fsp>(state, *this);

View File

@ -1,59 +0,0 @@
#include "timesrv.h"
namespace skyline::service::time {
time::time(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::time, "time", {
{0x0, SFUNC(time::GetStandardUserSystemClock)},
{0x1, SFUNC(time::GetStandardNetworkSystemClock)},
{0x3, SFUNC(time::GetTimeZoneService)},
{0x4, SFUNC(time::GetStandardLocalSystemClock)}
}) {}
void time::GetStandardUserSystemClock(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
manager.RegisterService(std::make_shared<ISystemClock>(SystemClockType::User, state, manager), session, response);
}
void time::GetStandardNetworkSystemClock(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
manager.RegisterService(std::make_shared<ISystemClock>(SystemClockType::Network, state, manager), session, response);
}
void time::GetTimeZoneService(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
manager.RegisterService(std::make_shared<ITimeZoneService>(state, manager), session, response);
}
void time::GetStandardLocalSystemClock(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
manager.RegisterService(std::make_shared<ISystemClock>(SystemClockType::Local, state, manager), session, response);
}
ISystemClock::ISystemClock(SystemClockType clockType, const DeviceState &state, ServiceManager &manager) : type(clockType), BaseService(state, manager, Service::time_ISystemClock, "time:ISystemClock", {
{0x0, SFUNC(ISystemClock::GetCurrentTime)}
}) {}
void ISystemClock::GetCurrentTime(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
response.Push<u64>(static_cast<u64>(std::time(nullptr)));
}
ITimeZoneService::ITimeZoneService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::time_ITimeZoneService, "time:ITimeZoneService", {
{0x65, SFUNC(ITimeZoneService::ToCalendarTimeWithMyRule)}
}) {}
void ITimeZoneService::ToCalendarTimeWithMyRule(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
time_t curTime = std::time(nullptr);
tm calender = *std::gmtime(&curTime);
CalendarTime calendarTime{
.year = static_cast<u16>(calender.tm_year),
.month = static_cast<u8>(calender.tm_mon),
.day = static_cast<u8>(calender.tm_hour),
.minute = static_cast<u8>(calender.tm_min),
.second = static_cast<u8>(calender.tm_sec)
};
response.Push(calendarTime);
CalendarAdditionalInfo calendarInfo{
.day_week = static_cast<u32>(calender.tm_wday),
.day_month = static_cast<u32>(calender.tm_mday),
.name = *reinterpret_cast<const u64 *>(calender.tm_zone),
.dst = static_cast<i32>(calender.tm_isdst),
.utc_rel = static_cast<u32>(calender.tm_gmtoff)
};
response.Push(calendarInfo);
}
}

View File

@ -1,97 +0,0 @@
#pragma once
#include <services/base_service.h>
#include <services/serviceman.h>
namespace skyline::service::time {
/**
* @brief The type of a #SystemClockType
*/
enum class SystemClockType {
User, //!< Use time provided by user
Network, //!< Use network time
Local, //!< Use local time
};
/**
* @brief time (This covers both time:a and time:s) is responsible for providing handles to various clock services (https://switchbrew.org/wiki/PSC_services#time:su.2C_time:s)
*/
class time : public BaseService {
public:
time(const DeviceState &state, ServiceManager &manager);
/**
* @brief This returns a handle to a ISystemClock for user time (https://switchbrew.org/wiki/Services_API#GetStandardUserSystemClock)
*/
void GetStandardUserSystemClock(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
/**
* @brief This returns a handle to a ISystemClock for user time (https://switchbrew.org/wiki/Services_API#GetStandardNetworkSystemClock)
*/
void GetStandardNetworkSystemClock(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
/**
* @brief This returns a handle to a ISystemClock for user time (https://switchbrew.org/wiki/Services_API#GetStandardNetworkSystemClock)
*/
void GetTimeZoneService(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
/**
* @brief This returns a handle to a ISystemClock for user time (https://switchbrew.org/wiki/Services_API#GetStandardNetworkSystemClock)
*/
void GetStandardLocalSystemClock(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
};
/**
* @brief ISystemClock is used to retrieve and set time (https://switchbrew.org/wiki/PSC_services#ISystemClock)
*/
class ISystemClock : public BaseService {
public:
SystemClockType type; //!< The type of the system clock
ISystemClock(SystemClockType clockType, const DeviceState &state, ServiceManager &manager);
/**
* @brief This returns the amount of seconds since epoch
*/
void GetCurrentTime(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
};
/**
* @brief ITimeZoneService is used to retrieve and set time (https://switchbrew.org/wiki/PSC_services#ITimeZoneService)
*/
class ITimeZoneService : public BaseService {
public:
/**
* @brief This holds a particular time point in calendar format
*/
struct CalendarTime {
u16 year;
u8 month;
u8 day;
u8 hour;
u8 minute;
u8 second;
u8 : 8;
};
static_assert(sizeof(CalendarTime) == 8);
/**
* @brief This is passed in addition to CalendarTime
*/
struct CalendarAdditionalInfo {
u32 day_week;
u32 day_month;
u64 name;
i32 dst;
u32 utc_rel;
};
static_assert(sizeof(CalendarAdditionalInfo) == 24);
ITimeZoneService(const DeviceState &state, ServiceManager &manager);
/**
* @brief This receives a u64 #PosixTime (https://switchbrew.org/wiki/PSC_services#PosixTime), and returns a #CalendarTime (https://switchbrew.org/wiki/PSC_services#CalendarTime), #CalendarAdditionalInfo (https://switchbrew.org/wiki/PSC_services#CalendarAdditionalInfo)
*/
void ToCalendarTimeWithMyRule(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
};
}

View File

@ -0,0 +1,28 @@
#include "IStaticService.h"
#include "ISystemClock.h"
#include "ITimeZoneService.h"
namespace skyline::service::timesrv {
IStaticService::IStaticService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::timesrv_IStaticService, "timesrv:IStaticService", {
{0x0, SFUNC(IStaticService::GetStandardUserSystemClock)},
{0x1, SFUNC(IStaticService::GetStandardNetworkSystemClock)},
{0x3, SFUNC(IStaticService::GetTimeZoneService)},
{0x4, SFUNC(IStaticService::GetStandardLocalSystemClock)}
}) {}
void IStaticService::GetStandardUserSystemClock(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
manager.RegisterService(std::make_shared<ISystemClock>(SystemClockType::User, state, manager), session, response);
}
void IStaticService::GetStandardNetworkSystemClock(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
manager.RegisterService(std::make_shared<ISystemClock>(SystemClockType::Network, state, manager), session, response);
}
void IStaticService::GetTimeZoneService(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
manager.RegisterService(std::make_shared<ITimeZoneService>(state, manager), session, response);
}
void IStaticService::GetStandardLocalSystemClock(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
manager.RegisterService(std::make_shared<ISystemClock>(SystemClockType::Local, state, manager), session, response);
}
}

View File

@ -0,0 +1,34 @@
#pragma once
#include <services/base_service.h>
#include <services/serviceman.h>
namespace skyline::service::timesrv {
/**
* @brief IStaticService (This covers time:u, time:a and time:s) is responsible for providing handles to various clock services (https://switchbrew.org/wiki/PSC_services#time:su.2C_time:s)
*/
class IStaticService : public BaseService {
public:
IStaticService(const DeviceState &state, ServiceManager &manager);
/**
* @brief This returns a handle to a ISystemClock for user time
*/
void GetStandardUserSystemClock(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
/**
* @brief This returns a handle to a ISystemClock for network time
*/
void GetStandardNetworkSystemClock(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
/**
* @brief This returns a handle to a ITimeZoneService for reading time zone information
*/
void GetTimeZoneService(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
/**
* @brief This returns a handle to a ISystemClock for local time
*/
void GetStandardLocalSystemClock(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
};
}

View File

@ -0,0 +1,11 @@
#include "ISystemClock.h"
namespace skyline::service::timesrv {
ISystemClock::ISystemClock(const SystemClockType clockType, const DeviceState &state, ServiceManager &manager) : type(clockType), BaseService(state, manager, Service::timesrv_ISystemClock, "timesrv:ISystemClock", {
{0x0, SFUNC(ISystemClock::GetCurrentTime)}
}) {}
void ISystemClock::GetCurrentTime(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
response.Push<u64>(static_cast<u64>(std::time(nullptr)));
}
}

View File

@ -0,0 +1,30 @@
#pragma once
#include <services/base_service.h>
#include <services/serviceman.h>
namespace skyline::service::timesrv {
/**
* @brief The type of a #SystemClockType
*/
enum class SystemClockType {
User, //!< Use time provided by user
Network, //!< Use network time
Local, //!< Use local time
};
/**
* @brief ISystemClock is used to retrieve and set time (https://switchbrew.org/wiki/PSC_services#ISystemClock)
*/
class ISystemClock : public BaseService {
public:
const SystemClockType type; //!< The type of the system clock
ISystemClock(const SystemClockType clockType, const DeviceState &state, ServiceManager &manager);
/**
* @brief This returns the amount of seconds since epoch
*/
void GetCurrentTime(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
};
}

View File

@ -0,0 +1,28 @@
#include "ITimeZoneService.h"
namespace skyline::service::timesrv {
ITimeZoneService::ITimeZoneService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::timesrv_ITimeZoneService, "timesrv:ITimeZoneService", {
{0x65, SFUNC(ITimeZoneService::ToCalendarTimeWithMyRule)}
}) {}
void ITimeZoneService::ToCalendarTimeWithMyRule(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
time_t curTime = std::time(nullptr);
tm calender = *std::gmtime(&curTime);
CalendarTime calendarTime{
.year = static_cast<u16>(calender.tm_year),
.month = static_cast<u8>(calender.tm_mon),
.day = static_cast<u8>(calender.tm_hour),
.minute = static_cast<u8>(calender.tm_min),
.second = static_cast<u8>(calender.tm_sec)
};
response.Push(calendarTime);
CalendarAdditionalInfo calendarInfo{
.day_week = static_cast<u32>(calender.tm_wday),
.day_month = static_cast<u32>(calender.tm_mday),
.name = *reinterpret_cast<const u64 *>(calender.tm_zone),
.dst = static_cast<i32>(calender.tm_isdst),
.utc_rel = static_cast<u32>(calender.tm_gmtoff)
};
response.Push(calendarInfo);
}
}

View File

@ -0,0 +1,46 @@
#pragma once
#include <services/base_service.h>
#include <services/serviceman.h>
namespace skyline::service::timesrv {
/**
* @brief ITimeZoneService is used to retrieve and set time (https://switchbrew.org/wiki/PSC_services#ITimeZoneService)
*/
class ITimeZoneService : public BaseService {
private:
/**
* @brief This holds a particular time point in calendar format
*/
struct CalendarTime {
u16 year;
u8 month;
u8 day;
u8 hour;
u8 minute;
u8 second;
u8 _pad_;
};
static_assert(sizeof(CalendarTime) == 0x8);
/**
* @brief This is passed in addition to CalendarTime
*/
struct CalendarAdditionalInfo {
u32 day_week;
u32 day_month;
u64 name;
i32 dst;
u32 utc_rel;
};
static_assert(sizeof(CalendarAdditionalInfo) == 0x18);
public:
ITimeZoneService(const DeviceState &state, ServiceManager &manager);
/**
* @brief This receives a u64 #PosixTime (https://switchbrew.org/wiki/PSC_services#PosixTime), and returns a #CalendarTime (https://switchbrew.org/wiki/PSC_services#CalendarTime), #CalendarAdditionalInfo (https://switchbrew.org/wiki/PSC_services#CalendarAdditionalInfo)
*/
void ToCalendarTimeWithMyRule(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
};
}