34
34
#endif
35
35
#if TARGET_OS_WIN32
36
36
#include <tchar.h>
37
+
38
+ #include "WindowsResources.h"
39
+ #define NOMINMAX
40
+ #define WIN32_LEAN_AND_MEAN
41
+ #include "Windows.h"
37
42
#endif
43
+
38
44
#if TARGET_OS_MAC
39
45
#include <tzfile.h>
40
46
#define MACOS_TZDIR1 "/usr/share/zoneinfo/" // 10.12 and earlier
41
47
#define MACOS_TZDIR2 "/var/db/timezone/zoneinfo/" // 10.13 onwards
42
-
43
48
#elif TARGET_OS_LINUX || TARGET_OS_BSD
44
49
#ifndef TZDIR
45
50
#define TZDIR "/usr/share/zoneinfo/" /* Time zone object file directory */
@@ -463,172 +468,6 @@ CFTypeID CFTimeZoneGetTypeID(void) {
463
468
}
464
469
465
470
#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
-
632
471
CF_INLINE void __CFTimeZoneLockWinToOlson (void ) {
633
472
__CFLock (& __CFTimeZoneWinToOlsonLock );
634
473
}
@@ -637,19 +476,46 @@ CF_INLINE void __CFTimeZoneUnlockWinToOlson(void) {
637
476
__CFUnlock (& __CFTimeZoneWinToOlsonLock );
638
477
}
639
478
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
+
640
499
CFDictionaryRef CFTimeZoneCopyWinToOlsonDictionary (void ) {
641
500
CFDictionaryRef dict ;
501
+
642
502
__CFTimeZoneLockWinToOlson ();
643
503
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
+ }
647
512
}
648
513
if (NULL == __CFTimeZoneWinToOlsonDict ) {
649
514
__CFTimeZoneWinToOlsonDict = CFDictionaryCreate (kCFAllocatorSystemDefault , NULL , NULL , 0 , NULL , NULL );
650
515
}
651
- dict = __CFTimeZoneWinToOlsonDict ? (CFDictionaryRef )CFRetain (__CFTimeZoneWinToOlsonDict ) : NULL ;
652
516
__CFTimeZoneUnlockWinToOlson ();
517
+
518
+ dict = __CFTimeZoneWinToOlsonDict ? (CFDictionaryRef )CFRetain (__CFTimeZoneWinToOlsonDict ) : NULL ;
653
519
return dict ;
654
520
}
655
521
0 commit comments