Просмотр исходного кода

service: time: Implement ToPosixTimeWithMyRule.

- Used by Pokemon Mystery Dungeon.
bunnei 6 лет назад
Родитель
Сommit
ed76c71319

+ 9 - 0
src/core/hle/service/time/time_zone_manager.cpp

@@ -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;

+ 1 - 0
src/core/hle/service/time/time_zone_manager.h

@@ -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{};

+ 23 - 1
src/core/hle/service/time/time_zone_service.cpp

@@ -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

+ 1 - 0
src/core/hle/service/time/time_zone_service.h

@@ -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;