service: time: Implement ToPosixTimeWithMyRule.

- Used by Pokemon Mystery Dungeon.
This commit is contained in:
bunnei 2020-01-22 23:19:25 -05:00
parent 89b326e396
commit ed76c71319
4 changed files with 34 additions and 1 deletions

View File

@ -1019,6 +1019,15 @@ ResultCode TimeZoneManager::ToPosixTime(const TimeZoneRule& rules,
return RESULT_SUCCESS; return RESULT_SUCCESS;
} }
ResultCode TimeZoneManager::ToPosixTimeWithMyRule(const CalendarTime& calendar_time,
s64& posix_time) const {
if (is_initialized) {
return ToPosixTime(time_zone_rule, calendar_time, posix_time);
}
posix_time = 0;
return ERROR_UNINITIALIZED_CLOCK;
}
ResultCode TimeZoneManager::GetDeviceLocationName(LocationName& value) const { ResultCode TimeZoneManager::GetDeviceLocationName(LocationName& value) const {
if (!is_initialized) { if (!is_initialized) {
return ERROR_UNINITIALIZED_CLOCK; return ERROR_UNINITIALIZED_CLOCK;

View File

@ -39,6 +39,7 @@ public:
ResultCode ParseTimeZoneRuleBinary(TimeZoneRule& rules, FileSys::VirtualFile& vfs_file) const; ResultCode ParseTimeZoneRuleBinary(TimeZoneRule& rules, FileSys::VirtualFile& vfs_file) const;
ResultCode ToPosixTime(const TimeZoneRule& rules, const CalendarTime& calendar_time, ResultCode ToPosixTime(const TimeZoneRule& rules, const CalendarTime& calendar_time,
s64& posix_time) const; s64& posix_time) const;
ResultCode ToPosixTimeWithMyRule(const CalendarTime& calendar_time, s64& posix_time) const;
private: private:
bool is_initialized{}; bool is_initialized{};

View File

@ -22,7 +22,7 @@ ITimeZoneService ::ITimeZoneService(TimeZone::TimeZoneContentManager& time_zone_
{100, &ITimeZoneService::ToCalendarTime, "ToCalendarTime"}, {100, &ITimeZoneService::ToCalendarTime, "ToCalendarTime"},
{101, &ITimeZoneService::ToCalendarTimeWithMyRule, "ToCalendarTimeWithMyRule"}, {101, &ITimeZoneService::ToCalendarTimeWithMyRule, "ToCalendarTimeWithMyRule"},
{201, &ITimeZoneService::ToPosixTime, "ToPosixTime"}, {201, &ITimeZoneService::ToPosixTime, "ToPosixTime"},
{202, nullptr, "ToPosixTimeWithMyRule"}, {202, &ITimeZoneService::ToPosixTimeWithMyRule, "ToPosixTimeWithMyRule"},
}; };
RegisterHandlers(functions); RegisterHandlers(functions);
} }
@ -145,4 +145,26 @@ void ITimeZoneService::ToPosixTime(Kernel::HLERequestContext& ctx) {
ctx.WriteBuffer(&posix_time, sizeof(s64)); ctx.WriteBuffer(&posix_time, sizeof(s64));
} }
void ITimeZoneService::ToPosixTimeWithMyRule(Kernel::HLERequestContext& ctx) {
LOG_DEBUG(Service_Time, "called");
IPC::RequestParser rp{ctx};
const auto calendar_time{rp.PopRaw<TimeZone::CalendarTime>()};
s64 posix_time{};
if (const ResultCode result{
time_zone_content_manager.GetTimeZoneManager().ToPosixTimeWithMyRule(calendar_time,
posix_time)};
result != RESULT_SUCCESS) {
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(result);
return;
}
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(RESULT_SUCCESS);
rb.PushRaw<u32>(1); // Number of times we're returning
ctx.WriteBuffer(&posix_time, sizeof(s64));
}
} // namespace Service::Time } // namespace Service::Time

View File

@ -22,6 +22,7 @@ private:
void ToCalendarTime(Kernel::HLERequestContext& ctx); void ToCalendarTime(Kernel::HLERequestContext& ctx);
void ToCalendarTimeWithMyRule(Kernel::HLERequestContext& ctx); void ToCalendarTimeWithMyRule(Kernel::HLERequestContext& ctx);
void ToPosixTime(Kernel::HLERequestContext& ctx); void ToPosixTime(Kernel::HLERequestContext& ctx);
void ToPosixTimeWithMyRule(Kernel::HLERequestContext& ctx);
private: private:
TimeZone::TimeZoneContentManager& time_zone_content_manager; TimeZone::TimeZoneContentManager& time_zone_content_manager;