summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitmodules3
-rw-r--r--CMakeLists.txt2
-rw-r--r--externals/nx_tzdb/CMakeLists.txt96
-rw-r--r--externals/nx_tzdb/NxTzdbCreateHeader.cmake8
-rw-r--r--externals/nx_tzdb/include/nx_tzdb.h2
m---------externals/nx_tzdb/tzdb_to_nx0
-rw-r--r--src/core/file_sys/system_archive/time_zone_binary.cpp2
-rw-r--r--src/core/hle/service/time/time_zone_manager.cpp5
-rw-r--r--src/core/hle/service/time/time_zone_service.cpp10
9 files changed, 82 insertions, 46 deletions
diff --git a/.gitmodules b/.gitmodules
index 95eae8109..89f2ad924 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -52,3 +52,6 @@
52[submodule "libadrenotools"] 52[submodule "libadrenotools"]
53 path = externals/libadrenotools 53 path = externals/libadrenotools
54 url = https://github.com/bylaws/libadrenotools 54 url = https://github.com/bylaws/libadrenotools
55[submodule "tzdb_to_nx"]
56 path = externals/nx_tzdb/tzdb_to_nx
57 url = https://github.com/lat9nq/tzdb_to_nx.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3d03bbf94..6d3146c9e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -59,6 +59,8 @@ option(YUZU_CHECK_SUBMODULES "Check if submodules are present" ON)
59 59
60option(YUZU_ENABLE_LTO "Enable link-time optimization" OFF) 60option(YUZU_ENABLE_LTO "Enable link-time optimization" OFF)
61 61
62option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" OFF)
63
62CMAKE_DEPENDENT_OPTION(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "NOT WIN32" OFF) 64CMAKE_DEPENDENT_OPTION(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "NOT WIN32" OFF)
63 65
64# On Android, fetch and compile libcxx before doing anything else 66# On Android, fetch and compile libcxx before doing anything else
diff --git a/externals/nx_tzdb/CMakeLists.txt b/externals/nx_tzdb/CMakeLists.txt
index 2f625c108..d5a1c6317 100644
--- a/externals/nx_tzdb/CMakeLists.txt
+++ b/externals/nx_tzdb/CMakeLists.txt
@@ -1,24 +1,60 @@
1# SPDX-FileCopyrightText: 2023 yuzu Emulator Project 1# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
2# SPDX-License-Identifier: GPL-2.0-or-later 2# SPDX-License-Identifier: GPL-2.0-or-later
3 3
4set(NX_TZDB_VERSION "220816") 4set(NX_TZDB_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include")
5set(NX_TZDB_DOWNLOAD_URL "https://github.com/lat9nq/tzdb_to_nx/releases/download/${NX_TZDB_VERSION}/${NX_TZDB_VERSION}.zip") 5
6add_library(nx_tzdb INTERFACE)
7
8find_program(GIT git)
9find_program(GNU_MAKE make)
10find_program(GNU_DATE date)
6 11
12set(CAN_BUILD_NX_TZDB true)
13
14if (NOT GIT)
15 set(CAN_BUILD_NX_TZDB false)
16endif()
17if (NOT GNU_MAKE)
18 set(CAN_BUILD_NX_TZDB false)
19endif()
20if (NOT GNU_DATE)
21 set(CAN_BUILD_NX_TZDB false)
22endif()
23if (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR ANDROID)
24 # tzdb_to_nx currently requires a posix-compliant host
25 # MinGW and Android are handled here due to the executable format being different from the host system
26 # TODO (lat9nq): cross-compiling support
27 set(CAN_BUILD_NX_TZDB false)
28endif()
29
30set(NX_TZDB_VERSION "220816")
7set(NX_TZDB_ARCHIVE "${CMAKE_CURRENT_BINARY_DIR}/${NX_TZDB_VERSION}.zip") 31set(NX_TZDB_ARCHIVE "${CMAKE_CURRENT_BINARY_DIR}/${NX_TZDB_VERSION}.zip")
8set(NX_TZDB_DIR "${CMAKE_CURRENT_BINARY_DIR}/nx_tzdb")
9 32
10set(NX_TZDB_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include") 33set(NX_TZDB_ROMFS_DIR "${CMAKE_CURRENT_BINARY_DIR}/nx_tzdb")
34
35if ((NOT CAN_BUILD_NX_TZDB OR YUZU_DOWNLOAD_TIME_ZONE_DATA) AND NOT EXISTS ${NX_TZDB_ARCHIVE})
36 set(NX_TZDB_DOWNLOAD_URL "https://github.com/lat9nq/tzdb_to_nx/releases/download/${NX_TZDB_VERSION}/${NX_TZDB_VERSION}.zip")
37
38 message(STATUS "Downloading time zone data from ${NX_TZDB_DOWNLOAD_URL}...")
39 file(DOWNLOAD ${NX_TZDB_DOWNLOAD_URL} ${NX_TZDB_ARCHIVE}
40 STATUS NX_TZDB_DOWNLOAD_STATUS)
41 list(GET NX_TZDB_DOWNLOAD_STATUS 0 NX_TZDB_DOWNLOAD_STATUS_CODE)
42 if (NOT NX_TZDB_DOWNLOAD_STATUS_CODE EQUAL 0)
43 message(FATAL_ERROR "Time zone data download failed (status code ${NX_TZDB_DOWNLOAD_STATUS_CODE})")
44 endif()
11 45
12if (NOT EXISTS ${NX_TZDB_ARCHIVE})
13 file(DOWNLOAD ${NX_TZDB_DOWNLOAD_URL} ${NX_TZDB_ARCHIVE})
14 file(ARCHIVE_EXTRACT 46 file(ARCHIVE_EXTRACT
15 INPUT 47 INPUT
16 ${NX_TZDB_ARCHIVE} 48 ${NX_TZDB_ARCHIVE}
17 DESTINATION 49 DESTINATION
18 ${NX_TZDB_DIR}) 50 ${NX_TZDB_ROMFS_DIR})
51elseif (CAN_BUILD_NX_TZDB AND NOT YUZU_DOWNLOAD_TIME_ZONE_DATA)
52 add_subdirectory(tzdb_to_nx)
53 add_dependencies(nx_tzdb x80e)
54
55 set(NX_TZDB_ROMFS_DIR "${NX_TZDB_DIR}")
19endif() 56endif()
20 57
21add_library(nx_tzdb INTERFACE)
22target_include_directories(nx_tzdb 58target_include_directories(nx_tzdb
23 INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include 59 INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include
24 INTERFACE ${NX_TZDB_INCLUDE_DIR}) 60 INTERFACE ${NX_TZDB_INCLUDE_DIR})
@@ -41,25 +77,25 @@ function(CreateHeader ZONE_PATH HEADER_NAME)
41 target_sources(nx_tzdb PRIVATE ${HEADER_PATH}) 77 target_sources(nx_tzdb PRIVATE ${HEADER_PATH})
42endfunction() 78endfunction()
43 79
44CreateHeader(${NX_TZDB_DIR} base) 80CreateHeader(${NX_TZDB_ROMFS_DIR} base)
45CreateHeader(${NX_TZDB_DIR}/zoneinfo zoneinfo) 81CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo zoneinfo)
46CreateHeader(${NX_TZDB_DIR}/zoneinfo/Africa africa) 82CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Africa africa)
47CreateHeader(${NX_TZDB_DIR}/zoneinfo/America america) 83CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America america)
48CreateHeader(${NX_TZDB_DIR}/zoneinfo/America/Argentina america_argentina) 84CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America/Argentina america_argentina)
49CreateHeader(${NX_TZDB_DIR}/zoneinfo/America/Indiana america_indiana) 85CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America/Indiana america_indiana)
50CreateHeader(${NX_TZDB_DIR}/zoneinfo/America/Kentucky america_kentucky) 86CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America/Kentucky america_kentucky)
51CreateHeader(${NX_TZDB_DIR}/zoneinfo/America/North_Dakota america_north_dakota) 87CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America/North_Dakota america_north_dakota)
52CreateHeader(${NX_TZDB_DIR}/zoneinfo/Antartica antartica) 88CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Antarctica antarctica)
53CreateHeader(${NX_TZDB_DIR}/zoneinfo/Arctic arctic) 89CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Arctic arctic)
54CreateHeader(${NX_TZDB_DIR}/zoneinfo/Asia asia) 90CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Asia asia)
55CreateHeader(${NX_TZDB_DIR}/zoneinfo/Atlantic atlantic) 91CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Atlantic atlantic)
56CreateHeader(${NX_TZDB_DIR}/zoneinfo/Australia australia) 92CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Australia australia)
57CreateHeader(${NX_TZDB_DIR}/zoneinfo/Brazil brazil) 93CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Brazil brazil)
58CreateHeader(${NX_TZDB_DIR}/zoneinfo/Canada canada) 94CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Canada canada)
59CreateHeader(${NX_TZDB_DIR}/zoneinfo/Chile chile) 95CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Chile chile)
60CreateHeader(${NX_TZDB_DIR}/zoneinfo/Etc etc) 96CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Etc etc)
61CreateHeader(${NX_TZDB_DIR}/zoneinfo/Europe europe) 97CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Europe europe)
62CreateHeader(${NX_TZDB_DIR}/zoneinfo/Indian indian) 98CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Indian indian)
63CreateHeader(${NX_TZDB_DIR}/zoneinfo/Mexico mexico) 99CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Mexico mexico)
64CreateHeader(${NX_TZDB_DIR}/zoneinfo/Pacific pacific) 100CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Pacific pacific)
65CreateHeader(${NX_TZDB_DIR}/zoneinfo/US us) 101CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/US us)
diff --git a/externals/nx_tzdb/NxTzdbCreateHeader.cmake b/externals/nx_tzdb/NxTzdbCreateHeader.cmake
index 69166aa5b..8c29e1167 100644
--- a/externals/nx_tzdb/NxTzdbCreateHeader.cmake
+++ b/externals/nx_tzdb/NxTzdbCreateHeader.cmake
@@ -15,7 +15,7 @@ set(DIRECTORY_NAME ${HEADER_NAME})
15 15
16set(FILE_DATA "") 16set(FILE_DATA "")
17foreach(ZONE_FILE ${FILE_LIST}) 17foreach(ZONE_FILE ${FILE_LIST})
18 if ("${ZONE_FILE}" STREQUAL "\n") 18 if (ZONE_FILE STREQUAL "\n")
19 continue() 19 continue()
20 endif() 20 endif()
21 21
@@ -26,13 +26,13 @@ foreach(ZONE_FILE ${FILE_LIST})
26 foreach(I RANGE 0 ${ZONE_DATA_LEN} 2) 26 foreach(I RANGE 0 ${ZONE_DATA_LEN} 2)
27 math(EXPR BREAK_LINE "(${I} + 2) % 38") 27 math(EXPR BREAK_LINE "(${I} + 2) % 38")
28 28
29 string(SUBSTRING "${ZONE_DATA}" "${I}" "2" HEX_DATA) 29 string(SUBSTRING "${ZONE_DATA}" "${I}" 2 HEX_DATA)
30 if ("${HEX_DATA}" STREQUAL "") 30 if (NOT HEX_DATA)
31 break() 31 break()
32 endif() 32 endif()
33 33
34 string(APPEND FILE_DATA "0x${HEX_DATA},") 34 string(APPEND FILE_DATA "0x${HEX_DATA},")
35 if ("${BREAK_LINE}" STREQUAL "0") 35 if (BREAK_LINE EQUAL 0)
36 string(APPEND FILE_DATA "\n") 36 string(APPEND FILE_DATA "\n")
37 else() 37 else()
38 string(APPEND FILE_DATA " ") 38 string(APPEND FILE_DATA " ")
diff --git a/externals/nx_tzdb/include/nx_tzdb.h b/externals/nx_tzdb/include/nx_tzdb.h
index d7b1e4304..1f7c6069a 100644
--- a/externals/nx_tzdb/include/nx_tzdb.h
+++ b/externals/nx_tzdb/include/nx_tzdb.h
@@ -9,7 +9,7 @@
9#include "nx_tzdb/america_indiana.h" 9#include "nx_tzdb/america_indiana.h"
10#include "nx_tzdb/america_kentucky.h" 10#include "nx_tzdb/america_kentucky.h"
11#include "nx_tzdb/america_north_dakota.h" 11#include "nx_tzdb/america_north_dakota.h"
12#include "nx_tzdb/antartica.h" 12#include "nx_tzdb/antarctica.h"
13#include "nx_tzdb/arctic.h" 13#include "nx_tzdb/arctic.h"
14#include "nx_tzdb/asia.h" 14#include "nx_tzdb/asia.h"
15#include "nx_tzdb/atlantic.h" 15#include "nx_tzdb/atlantic.h"
diff --git a/externals/nx_tzdb/tzdb_to_nx b/externals/nx_tzdb/tzdb_to_nx
new file mode 160000
Subproject 34df65eff295c2bd9ee9e6a077d662486d5cabb
diff --git a/src/core/file_sys/system_archive/time_zone_binary.cpp b/src/core/file_sys/system_archive/time_zone_binary.cpp
index ceb0b41c6..7c17bbefa 100644
--- a/src/core/file_sys/system_archive/time_zone_binary.cpp
+++ b/src/core/file_sys/system_archive/time_zone_binary.cpp
@@ -15,7 +15,7 @@ namespace FileSys::SystemArchive {
15const static std::map<std::string, const std::map<const char*, const std::vector<u8>>&> 15const static std::map<std::string, const std::map<const char*, const std::vector<u8>>&>
16 tzdb_zoneinfo_dirs = {{"Africa", NxTzdb::africa}, 16 tzdb_zoneinfo_dirs = {{"Africa", NxTzdb::africa},
17 {"America", NxTzdb::america}, 17 {"America", NxTzdb::america},
18 {"Antartica", NxTzdb::antartica}, 18 {"Antarctica", NxTzdb::antarctica},
19 {"Arctic", NxTzdb::arctic}, 19 {"Arctic", NxTzdb::arctic},
20 {"Asia", NxTzdb::asia}, 20 {"Asia", NxTzdb::asia},
21 {"Atlantic", NxTzdb::atlantic}, 21 {"Atlantic", NxTzdb::atlantic},
diff --git a/src/core/hle/service/time/time_zone_manager.cpp b/src/core/hle/service/time/time_zone_manager.cpp
index e1728c06d..63aacd19f 100644
--- a/src/core/hle/service/time/time_zone_manager.cpp
+++ b/src/core/hle/service/time/time_zone_manager.cpp
@@ -849,8 +849,9 @@ static Result CreateCalendarTime(s64 time, int gmt_offset, CalendarTimeInternal&
849static Result ToCalendarTimeInternal(const TimeZoneRule& rules, s64 time, 849static Result ToCalendarTimeInternal(const TimeZoneRule& rules, s64 time,
850 CalendarTimeInternal& calendar_time, 850 CalendarTimeInternal& calendar_time,
851 CalendarAdditionalInfo& calendar_additional_info) { 851 CalendarAdditionalInfo& calendar_additional_info) {
852 if ((rules.go_ahead && time < rules.ats[0]) || 852 ASSERT(rules.go_ahead ? rules.time_count > 0 : true);
853 (rules.go_back && time > rules.ats[rules.time_count - 1])) { 853 if ((rules.go_back && time < rules.ats[0]) ||
854 (rules.go_ahead && time > rules.ats[rules.time_count - 1])) {
854 s64 seconds{}; 855 s64 seconds{};
855 if (time < rules.ats[0]) { 856 if (time < rules.ats[0]) {
856 seconds = rules.ats[0] - time; 857 seconds = rules.ats[0] - time;
diff --git a/src/core/hle/service/time/time_zone_service.cpp b/src/core/hle/service/time/time_zone_service.cpp
index e8273e152..8171c82a5 100644
--- a/src/core/hle/service/time/time_zone_service.cpp
+++ b/src/core/hle/service/time/time_zone_service.cpp
@@ -112,20 +112,14 @@ void ITimeZoneService::LoadTimeZoneRule(HLERequestContext& ctx) {
112 LOG_DEBUG(Service_Time, "called, location_name={}", location_name); 112 LOG_DEBUG(Service_Time, "called, location_name={}", location_name);
113 113
114 TimeZone::TimeZoneRule time_zone_rule{}; 114 TimeZone::TimeZoneRule time_zone_rule{};
115 if (const Result result{ 115 const Result result{time_zone_content_manager.LoadTimeZoneRule(time_zone_rule, location_name)};
116 time_zone_content_manager.LoadTimeZoneRule(time_zone_rule, location_name)};
117 result != ResultSuccess) {
118 IPC::ResponseBuilder rb{ctx, 2};
119 rb.Push(result);
120 return;
121 }
122 116
123 std::vector<u8> time_zone_rule_outbuffer(sizeof(TimeZone::TimeZoneRule)); 117 std::vector<u8> time_zone_rule_outbuffer(sizeof(TimeZone::TimeZoneRule));
124 std::memcpy(time_zone_rule_outbuffer.data(), &time_zone_rule, sizeof(TimeZone::TimeZoneRule)); 118 std::memcpy(time_zone_rule_outbuffer.data(), &time_zone_rule, sizeof(TimeZone::TimeZoneRule));
125 ctx.WriteBuffer(time_zone_rule_outbuffer); 119 ctx.WriteBuffer(time_zone_rule_outbuffer);
126 120
127 IPC::ResponseBuilder rb{ctx, 2}; 121 IPC::ResponseBuilder rb{ctx, 2};
128 rb.Push(ResultSuccess); 122 rb.Push(result);
129} 123}
130 124
131void ITimeZoneService::ToCalendarTime(HLERequestContext& ctx) { 125void ITimeZoneService::ToCalendarTime(HLERequestContext& ctx) {