1 // Copyright 2019 yuzu emulator team
2 // Licensed under GPLv2 or any later version
3 // Refer to the license.txt file included.
4 
5 #pragma once
6 
7 #include <array>
8 
9 #include "common/common_funcs.h"
10 #include "common/common_types.h"
11 #include "common/swap.h"
12 
13 namespace Service::Time::TimeZone {
14 
15 using LocationName = std::array<char, 0x24>;
16 
17 /// https://switchbrew.org/wiki/Glue_services#ttinfo
18 struct TimeTypeInfo {
19     s32 gmt_offset{};
20     u8 is_dst{};
21     INSERT_PADDING_BYTES(3);
22     s32 abbreviation_list_index{};
23     u8 is_standard_time_daylight{};
24     u8 is_gmt{};
25     INSERT_PADDING_BYTES(2);
26 };
27 static_assert(sizeof(TimeTypeInfo) == 0x10, "TimeTypeInfo is incorrect size");
28 
29 /// https://switchbrew.org/wiki/Glue_services#TimeZoneRule
30 struct TimeZoneRule {
31     s32 time_count{};
32     s32 type_count{};
33     s32 char_count{};
34     u8 go_back{};
35     u8 go_ahead{};
36     INSERT_PADDING_BYTES(2);
37     std::array<s64, 1000> ats{};
38     std::array<s8, 1000> types{};
39     std::array<TimeTypeInfo, 128> ttis{};
40     std::array<char, 512> chars{};
41     s32 default_type{};
42     INSERT_PADDING_BYTES(0x12C4);
43 };
44 static_assert(sizeof(TimeZoneRule) == 0x4000, "TimeZoneRule is incorrect size");
45 
46 /// https://switchbrew.org/wiki/Glue_services#CalendarAdditionalInfo
47 struct CalendarAdditionalInfo {
48     u32 day_of_week{};
49     u32 day_of_year{};
50     std::array<char, 8> timezone_name;
51     u32 is_dst{};
52     s32 gmt_offset{};
53 };
54 static_assert(sizeof(CalendarAdditionalInfo) == 0x18, "CalendarAdditionalInfo is incorrect size");
55 
56 /// https://switchbrew.org/wiki/Glue_services#CalendarTime
57 struct CalendarTime {
58     s16 year{};
59     s8 month{};
60     s8 day{};
61     s8 hour{};
62     s8 minute{};
63     s8 second{};
64     INSERT_PADDING_BYTES(1);
65 };
66 static_assert(sizeof(CalendarTime) == 0x8, "CalendarTime is incorrect size");
67 
68 struct CalendarInfo {
69     CalendarTime time{};
70     CalendarAdditionalInfo additiona_info{};
71 };
72 static_assert(sizeof(CalendarInfo) == 0x20, "CalendarInfo is incorrect size");
73 
74 struct TzifHeader {
75     u32_be magic{};
76     u8 version{};
77     INSERT_PADDING_BYTES(15);
78     s32_be ttis_gmt_count{};
79     s32_be ttis_std_count{};
80     s32_be leap_count{};
81     s32_be time_count{};
82     s32_be type_count{};
83     s32_be char_count{};
84 };
85 static_assert(sizeof(TzifHeader) == 0x2C, "TzifHeader is incorrect size");
86 
87 } // namespace Service::Time::TimeZone
88