Skip to content

Commit a82b4e3

Browse files
committed
CoreFoundation: extract Windows-Olson mapping
Move the plist into a Windows resource file. This cleans up the code path and makes it easier to work with.
1 parent 47382e2 commit a82b4e3

File tree

5 files changed

+370
-171
lines changed

5 files changed

+370
-171
lines changed

CoreFoundation/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ add_framework(CoreFoundation
205205
URL.subproj/CFURLAccess.h
206206
URL.subproj/CFURLComponents.h
207207
SOURCES
208+
$<$<PLATFORM_ID:Windows>:CoreFoundation.rc>
208209
# Base
209210
Base.subproj/CFBase.c
210211
Base.subproj/CFFileUtilities.c
@@ -315,6 +316,12 @@ add_framework(CoreFoundation
315316
URL.subproj/CFURLComponents.c
316317
URL.subproj/CFURLComponents_URIParser.c
317318
URL.subproj/CFURLSessionInterface.c)
319+
if(CMAKE_SYSTEM_NAME STREQUAL Windows)
320+
# NOTE(compnerd) this is a workaround for an empty include directory being
321+
# added to the RC invocation causing the resource file to be emitted to an
322+
# undesired path.
323+
set_property(SOURCE CoreFoundation.rc PROPERTY FLAG "")
324+
endif()
318325
if(CMAKE_SYSTEM_NAME STREQUAL Linux OR CMAKE_SYSTEM_NAME STREQUAL Android)
319326
target_compile_definitions(CoreFoundation
320327
PRIVATE

CoreFoundation/CoreFoundation.rc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
#include "resources.h"
3+
4+
IDR_WINDOWS_OLSON_MAPPING PLIST "WindowsOlsonMapping.plist"

CoreFoundation/NumberDate.subproj/CFTimeZone.c

Lines changed: 37 additions & 171 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,17 @@
3434
#endif
3535
#if TARGET_OS_WIN32
3636
#include <tchar.h>
37+
38+
#include "resources.h"
39+
#define NOMINMAX
40+
#define WIN32_LEAN_AND_MEAN
41+
#include "Windows.h"
3742
#endif
43+
3844
#if TARGET_OS_MAC
3945
#include <tzfile.h>
4046
#define MACOS_TZDIR1 "/usr/share/zoneinfo/" // 10.12 and earlier
4147
#define MACOS_TZDIR2 "/var/db/timezone/zoneinfo/" // 10.13 onwards
42-
4348
#elif TARGET_OS_LINUX || TARGET_OS_BSD
4449
#ifndef TZDIR
4550
#define TZDIR "/usr/share/zoneinfo/" /* Time zone object file directory */
@@ -463,172 +468,6 @@ CFTypeID CFTimeZoneGetTypeID(void) {
463468
}
464469

465470
#if TARGET_OS_WIN32
466-
static const char *__CFTimeZoneWinToOlsonDefaults =
467-
/* Mappings to time zones in Windows Registry are best-guess */
468-
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
469-
" <!DOCTYPE plist SYSTEM \"file://localhost/System/Library/DTDs/PropertyList.dtd\">"
470-
" <plist version=\"1.0\">"
471-
" <dict>"
472-
" <key>Afghanistan</key> <string>Asia/Kabul</string>"
473-
" <key>Afghanistan Standard Time</key> <string>Asia/Kabul</string>"
474-
" <key>Alaskan</key> <string>America/Anchorage</string>"
475-
" <key>Alaskan Standard Time</key> <string>America/Anchorage</string>"
476-
" <key>Arab</key> <string>Asia/Riyadh</string>"
477-
" <key>Arab Standard Time</key> <string>Asia/Riyadh</string>"
478-
" <key>Arabian</key> <string>Asia/Muscat</string>"
479-
" <key>Arabian Standard Time</key> <string>Asia/Muscat</string>"
480-
" <key>Arabic Standard Time</key> <string>Asia/Baghdad</string>"
481-
" <key>Atlantic</key> <string>America/Halifax</string>"
482-
" <key>Atlantic Standard Time</key> <string>America/Halifax</string>"
483-
" <key>AUS Central</key> <string>Australia/Darwin</string>"
484-
" <key>AUS Central Standard Time</key> <string>Australia/Darwin</string>"
485-
" <key>AUS Eastern</key> <string>Australia/Sydney</string>"
486-
" <key>AUS Eastern Standard Time</key> <string>Australia/Sydney</string>"
487-
" <key>Azerbaijan Standard Time</key> <string>Asia/Baku</string>"
488-
" <key>Azores</key> <string>Atlantic/Azores</string>"
489-
" <key>Azores Standard Time</key> <string>Atlantic/Azores</string>"
490-
" <key>Bangkok</key> <string>Asia/Bangkok</string>"
491-
" <key>Bangkok Standard Time</key> <string>Asia/Bangkok</string>"
492-
" <key>Beijing</key> <string>Asia/Shanghai</string>"
493-
" <key>Canada Central</key> <string>America/Regina</string>"
494-
" <key>Canada Central Standard Time</key> <string>America/Regina</string>"
495-
" <key>Cape Verde Standard Time</key> <string>Atlantic/Cape_Verde</string>"
496-
" <key>Caucasus</key> <string>Asia/Yerevan</string>"
497-
" <key>Caucasus Standard Time</key> <string>Asia/Yerevan</string>"
498-
" <key>Cen. Australia</key> <string>Australia/Adelaide</string>"
499-
" <key>Cen. Australia Standard Time</key> <string>Australia/Adelaide</string>"
500-
" <key>Central</key> <string>America/Chicago</string>"
501-
" <key>Central America Standard Time</key> <string>America/Regina</string>"
502-
" <key>Central Asia</key> <string>Asia/Dhaka</string>"
503-
" <key>Central Asia Standard Time</key> <string>Asia/Dhaka</string>"
504-
" <key>Central Brazilian Standard Time</key> <string>America/Manaus</string>"
505-
" <key>Central Europe</key> <string>Europe/Prague</string>"
506-
" <key>Central Europe Standard Time</key> <string>Europe/Prague</string>"
507-
" <key>Central European</key> <string>Europe/Belgrade</string>"
508-
" <key>Central European Standard Time</key> <string>Europe/Belgrade</string>"
509-
" <key>Central Pacific</key> <string>Pacific/Guadalcanal</string>"
510-
" <key>Central Pacific Standard Time</key> <string>Pacific/Guadalcanal</string>"
511-
" <key>Central Standard Time</key> <string>America/Chicago</string>"
512-
" <key>Central Standard Time (Mexico)</key> <string>America/Mexico_City</string>"
513-
" <key>China</key> <string>Asia/Shanghai</string>"
514-
" <key>China Standard Time</key> <string>Asia/Shanghai</string>"
515-
" <key>Dateline</key> <string>GMT-1200</string>"
516-
" <key>Dateline Standard Time</key> <string>GMT-1200</string>"
517-
" <key>E. Africa</key> <string>Africa/Nairobi</string>"
518-
" <key>E. Africa Standard Time</key> <string>Africa/Nairobi</string>"
519-
" <key>E. Australia</key> <string>Australia/Brisbane</string>"
520-
" <key>E. Australia Standard Time</key> <string>Australia/Brisbane</string>"
521-
" <key>E. Europe</key> <string>Europe/Minsk</string>"
522-
" <key>E. Europe Standard Time</key> <string>Europe/Minsk</string>"
523-
" <key>E. South America</key> <string>America/Sao_Paulo</string>"
524-
" <key>E. South America Standard Time</key> <string>America/Sao_Paulo</string>"
525-
" <key>Eastern</key> <string>America/New_York</string>"
526-
" <key>Eastern Standard Time</key> <string>America/New_York</string>"
527-
" <key>Egypt</key> <string>Africa/Cairo</string>"
528-
" <key>Egypt Standard Time</key> <string>Africa/Cairo</string>"
529-
" <key>Ekaterinburg</key> <string>Asia/Yekaterinburg</string>"
530-
" <key>Ekaterinburg Standard Time</key> <string>Asia/Yekaterinburg</string>"
531-
" <key>Fiji</key> <string>Pacific/Fiji</string>"
532-
" <key>Fiji Standard Time</key> <string>Pacific/Fiji</string>"
533-
" <key>FLE</key> <string>Europe/Helsinki</string>"
534-
" <key>FLE Standard Time</key> <string>Europe/Helsinki</string>"
535-
" <key>Georgian Standard Time</key> <string>Asia/Tbilisi</string>"
536-
" <key>GFT</key> <string>Europe/Athens</string>"
537-
" <key>GFT Standard Time</key> <string>Europe/Athens</string>"
538-
" <key>GMT</key> <string>Europe/London</string>"
539-
" <key>GMT Standard Time</key> <string>Europe/London</string>"
540-
" <key>Greenland Standard Time</key> <string>America/Godthab</string>"
541-
" <key>Greenwich</key> <string>GMT</string>"
542-
" <key>Greenwich Standard Time</key> <string>GMT</string>"
543-
" <key>GTB</key> <string>Europe/Athens</string>"
544-
" <key>GTB Standard Time</key> <string>Europe/Athens</string>"
545-
" <key>Hawaiian</key> <string>Pacific/Honolulu</string>"
546-
" <key>Hawaiian Standard Time</key> <string>Pacific/Honolulu</string>"
547-
" <key>India</key> <string>Asia/Calcutta</string>"
548-
" <key>India Standard Time</key> <string>Asia/Calcutta</string>"
549-
" <key>Iran</key> <string>Asia/Tehran</string>"
550-
" <key>Iran Standard Time</key> <string>Asia/Tehran</string>"
551-
" <key>Israel</key> <string>Asia/Jerusalem</string>"
552-
" <key>Israel Standard Time</key> <string>Asia/Jerusalem</string>"
553-
" <key>Jordan Standard Time</key> <string>Asia/Amman</string>"
554-
" <key>Korea</key> <string>Asia/Seoul</string>"
555-
" <key>Korea Standard Time</key> <string>Asia/Seoul</string>"
556-
" <key>Mexico</key> <string>America/Mexico_City</string>"
557-
" <key>Mexico Standard Time</key> <string>America/Mexico_City</string>"
558-
" <key>Mexico Standard Time 2</key> <string>America/Chihuahua</string>"
559-
" <key>Mid-Atlantic</key> <string>Atlantic/South_Georgia</string>"
560-
" <key>Mid-Atlantic Standard Time</key> <string>Atlantic/South_Georgia</string>"
561-
" <key>Middle East Standard Time</key> <string>Asia/Beirut</string>"
562-
" <key>Mountain</key> <string>America/Denver</string>"
563-
" <key>Mountain Standard Time</key> <string>America/Denver</string>"
564-
" <key>Mountain Standard Time (Mexico)</key> <string>America/Chihuahua</string>"
565-
" <key>Myanmar Standard Time</key> <string>Asia/Rangoon</string>"
566-
" <key>N. Central Asia Standard Time</key> <string>Asia/Novosibirsk</string>"
567-
" <key>Namibia Standard Time</key> <string>Africa/Windhoek</string>"
568-
" <key>Nepal Standard Time</key> <string>Asia/Katmandu</string>"
569-
" <key>New Zealand</key> <string>Pacific/Auckland</string>"
570-
" <key>New Zealand Standard Time</key> <string>Pacific/Auckland</string>"
571-
" <key>Newfoundland</key> <string>America/St_Johns</string>"
572-
" <key>Newfoundland Standard Time</key> <string>America/St_Johns</string>"
573-
" <key>North Asia East Standard Time</key> <string>Asia/Ulaanbaatar</string>"
574-
" <key>North Asia Standard Time</key> <string>Asia/Krasnoyarsk</string>"
575-
" <key>Pacific</key> <string>America/Los_Angeles</string>"
576-
" <key>Pacific SA</key> <string>America/Santiago</string>"
577-
" <key>Pacific SA Standard Time</key> <string>America/Santiago</string>"
578-
" <key>Pacific Standard Time</key> <string>America/Los_Angeles</string>"
579-
" <key>Pacific Standard Time (Mexico)</key> <string>America/Tijuana</string>"
580-
" <key>Prague Bratislava</key> <string>Europe/Prague</string>"
581-
" <key>Romance</key> <string>Europe/Paris</string>"
582-
" <key>Romance Standard Time</key> <string>Europe/Paris</string>"
583-
" <key>Russian</key> <string>Europe/Moscow</string>"
584-
" <key>Russian Standard Time</key> <string>Europe/Moscow</string>"
585-
" <key>SA Eastern</key> <string>America/Buenos_Aires</string>"
586-
" <key>SA Eastern Standard Time</key> <string>America/Buenos_Aires</string>"
587-
" <key>SA Pacific</key> <string>America/Bogota</string>"
588-
" <key>SA Pacific Standard Time</key> <string>America/Bogota</string>"
589-
" <key>SA Western</key> <string>America/Caracas</string>"
590-
" <key>SA Western Standard Time</key> <string>America/Caracas</string>"
591-
" <key>Samoa</key> <string>Pacific/Apia</string>"
592-
" <key>Samoa Standard Time</key> <string>Pacific/Apia</string>"
593-
" <key>Saudi Arabia</key> <string>Asia/Riyadh</string>"
594-
" <key>Saudi Arabia Standard Time</key> <string>Asia/Riyadh</string>"
595-
" <key>SE Asia Standard Time</key> <string>Asia/Bangkok</string>"
596-
" <key>Singapore</key> <string>Asia/Singapore</string>"
597-
" <key>Singapore Standard Time</key> <string>Asia/Singapore</string>"
598-
" <key>South Africa</key> <string>Africa/Harare</string>"
599-
" <key>South Africa Standard Time</key> <string>Africa/Harare</string>"
600-
" <key>Sri Lanka</key> <string>Asia/Colombo</string>"
601-
" <key>Sri Lanka Standard Time</key> <string>Asia/Colombo</string>"
602-
" <key>Sydney Standard Time</key> <string>Australia/Sydney</string>"
603-
" <key>Taipei</key> <string>Asia/Taipei</string>"
604-
" <key>Taipei Standard Time</key> <string>Asia/Taipei</string>"
605-
" <key>Tasmania</key> <string>Australia/Hobart</string>"
606-
" <key>Tasmania Standard Time</key> <string>Australia/Hobart</string>"
607-
" <key>Tasmania Standard Time</key> <string>Australia/Hobart</string>"
608-
" <key>Tokyo</key> <string>Asia/Tokyo</string>"
609-
" <key>Tokyo Standard Time</key> <string>Asia/Tokyo</string>"
610-
" <key>Tonga Standard Time</key> <string>Pacific/Tongatapu</string>"
611-
" <key>US Eastern</key> <string>America/Indianapolis</string>"
612-
" <key>US Eastern Standard Time</key> <string>America/Indianapolis</string>"
613-
" <key>US Mountain</key> <string>America/Phoenix</string>"
614-
" <key>US Mountain Standard Time</key> <string>America/Phoenix</string>"
615-
" <key>Vladivostok</key> <string>Asia/Vladivostok</string>"
616-
" <key>Vladivostok Standard Time</key> <string>Asia/Vladivostok</string>"
617-
" <key>W. Australia</key> <string>Australia/Perth</string>"
618-
" <key>W. Australia Standard Time</key> <string>Australia/Perth</string>"
619-
" <key>W. Central Africa Standard Time</key> <string>Africa/Luanda</string>"
620-
" <key>W. Europe</key> <string>Europe/Berlin</string>"
621-
" <key>W. Europe Standard Time</key> <string>Europe/Berlin</string>"
622-
" <key>Warsaw</key> <string>Europe/Warsaw</string>"
623-
" <key>West Asia</key> <string>Asia/Karachi</string>"
624-
" <key>West Asia Standard Time</key> <string>Asia/Karachi</string>"
625-
" <key>West Pacific</key> <string>Pacific/Guam</string>"
626-
" <key>West Pacific Standard Time</key> <string>Pacific/Guam</string>"
627-
" <key>Western Brazilian Standard Time</key> <string>America/Rio_Branco</string>"
628-
" <key>Yakutsk</key> <string>Asia/Yakutsk</string>"
629-
" </dict>"
630-
" </plist>";
631-
632471
CF_INLINE void __CFTimeZoneLockWinToOlson(void) {
633472
__CFLock(&__CFTimeZoneWinToOlsonLock);
634473
}
@@ -637,19 +476,46 @@ CF_INLINE void __CFTimeZoneUnlockWinToOlson(void) {
637476
__CFUnlock(&__CFTimeZoneWinToOlsonLock);
638477
}
639478

479+
static Boolean CFTimeZoneLoadWindowsOlsonPlist(LPVOID *ppResource, LPDWORD pdwSize) {
480+
HRSRC hResource;
481+
HGLOBAL hMemory;
482+
483+
hResource = FindResourceA(NULL, MAKEINTRESOURCEA(IDR_WINDOWS_OLSON_MAPPING), "PLIST");
484+
if (hResource == NULL) {
485+
return FALSE;
486+
}
487+
488+
hMemory = LoadResource(NULL, hResource);
489+
if (hMemory == NULL) {
490+
return FALSE;
491+
}
492+
493+
*pdwSize = SizeofResource(NULL, hResource);
494+
*ppResource = LockResource(hMemory);
495+
496+
return *pdwSize && *ppResource;
497+
}
498+
640499
CFDictionaryRef CFTimeZoneCopyWinToOlsonDictionary(void) {
641500
CFDictionaryRef dict;
501+
642502
__CFTimeZoneLockWinToOlson();
643503
if (NULL == __CFTimeZoneWinToOlsonDict) {
644-
CFDataRef data = CFDataCreate(kCFAllocatorSystemDefault, (uint8_t *)__CFTimeZoneWinToOlsonDefaults, strlen(__CFTimeZoneWinToOlsonDefaults));
645-
__CFTimeZoneWinToOlsonDict = (CFDictionaryRef)CFPropertyListCreateFromXMLData(kCFAllocatorSystemDefault, data, kCFPropertyListImmutable, NULL);
646-
CFRelease(data);
504+
const uint8_t *plist;
505+
DWORD dwSize;
506+
507+
if (CFTimeZoneLoadWindowsOlsonPlist(&plist, &dwSize)) {
508+
CFDataRef data = CFDataCreate(kCFAllocatorSystemDefault, plist, dwSize);
509+
__CFTimeZoneWinToOlsonDict = (CFDictionaryRef)CFPropertyListCreateFromXMLData(kCFAllocatorSystemDefault, data, kCFPropertyListImmutable, NULL);
510+
CFRelease(data);
511+
}
647512
}
648513
if (NULL == __CFTimeZoneWinToOlsonDict) {
649514
__CFTimeZoneWinToOlsonDict = CFDictionaryCreate(kCFAllocatorSystemDefault, NULL, NULL, 0, NULL, NULL);
650515
}
651-
dict = __CFTimeZoneWinToOlsonDict ? (CFDictionaryRef)CFRetain(__CFTimeZoneWinToOlsonDict) : NULL;
652516
__CFTimeZoneUnlockWinToOlson();
517+
518+
dict = __CFTimeZoneWinToOlsonDict ? (CFDictionaryRef)CFRetain(__CFTimeZoneWinToOlsonDict) : NULL;
653519
return dict;
654520
}
655521

0 commit comments

Comments
 (0)