16e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 26e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// Copyright 2006-2008 Adobe Systems Incorporated 36e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// All Rights Reserved. 46e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// 56e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// NOTICE: Adobe permits you to use, modify, and distribute this file in 66e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// accordance with the terms of the Adobe license agreement accompanying it. 76e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 86e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 96e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_date_time.cpp#2 $ */ 106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $DateTime: 2012/06/01 07:28:57 $ */ 116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Change: 832715 $ */ 126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Author: tknoll $ */ 136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_date_time.h" 176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_exceptions.h" 196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_mutex.h" 206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_stream.h" 216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_string.h" 226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_utils.h" 236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include <time.h> 256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#if qMacOS 272dd7464aac6607e6b74065579d546dd0de0a86b7Kinan Hakim#include <TargetConditionals.h> 282dd7464aac6607e6b74065579d546dd0de0a86b7Kinan Hakim#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR 292dd7464aac6607e6b74065579d546dd0de0a86b7Kinan Hakim#include <MobileCoreServices/MobileCoreServices.h> 302dd7464aac6607e6b74065579d546dd0de0a86b7Kinan Hakim#else 316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include <CoreServices/CoreServices.h> 322dd7464aac6607e6b74065579d546dd0de0a86b7Kinan Hakim#endif // TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR 332dd7464aac6607e6b74065579d546dd0de0a86b7Kinan Hakim#endif // qMacOS 346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#if qWinOS 366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include <windows.h> 376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#endif 386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/******************************************************************************/ 406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// MWG says don't use fake time zones in XMP, but there is some 426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// old software that requires them to work correctly. 436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimbool gDNGUseFakeTimeZonesInXMP = false; 456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/******************************************************************************/ 476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_date_time::dng_date_time () 496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim : fYear (0) 516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fMonth (0) 526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fDay (0) 536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fHour (0) 546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fMinute (0) 556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fSecond (0) 566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/******************************************************************************/ 626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_date_time::dng_date_time (uint32 year, 646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 month, 656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 day, 666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 hour, 676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 minute, 686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 second) 696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim : fYear (year) 716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fMonth (month) 726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fDay (day) 736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fHour (hour) 746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fMinute (minute) 756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fSecond (second) 766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/******************************************************************************/ 826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimbool dng_date_time::IsValid () const 846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return fYear >= 1 && fYear <= 9999 && 876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fMonth >= 1 && fMonth <= 12 && 886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fDay >= 1 && fDay <= 31 && 896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fHour <= 23 && 906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fMinute <= 59 && 916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fSecond <= 59; 926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_date_time::Clear () 986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim *this = dng_date_time (); 1016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 1056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimstatic uint32 DateTimeParseU32 (const char *&s) 1076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 x = 0; 1106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim while (*s == ' ' || *s == ':') 1126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim s++; 1136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim while (*s >= '0' && *s <= '9') 1156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 116c89552e7ed1e0ea69c69addf2bb5de011188d297Florian Kriener x = SafeUint32Mult(x, 10); 117c89552e7ed1e0ea69c69addf2bb5de011188d297Florian Kriener x = SafeUint32Add(x, (uint32) (*(s++) - '0')); 1186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return x; 1216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 1256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimbool dng_date_time::Parse (const char *s) 1276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fYear = DateTimeParseU32 (s); 1306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fMonth = DateTimeParseU32 (s); 1316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fDay = DateTimeParseU32 (s); 1326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fHour = DateTimeParseU32 (s); 1336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fMinute = DateTimeParseU32 (s); 1346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fSecond = DateTimeParseU32 (s); 1356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return IsValid (); 1376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 1416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_string dng_time_zone::Encode_ISO_8601 () const 1436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_string result; 1466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (IsValid ()) 1486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (OffsetMinutes () == 0) 1516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim result.Set ("Z"); 1546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 1586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim char s [64]; 1616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int offset = OffsetMinutes (); 1636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (offset > 0) 1656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim sprintf (s, "+%02d:%02d", offset / 60, offset % 60); 1686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 1726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim offset = -offset; 1756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim sprintf (s, "-%02d:%02d", offset / 60, offset % 60); 1776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim result.Set (s); 1816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return result; 1876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 1916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_date_time_info::dng_date_time_info () 1936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim : fDateOnly (true) 1956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fDateTime () 1966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fSubseconds () 1976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fTimeZone () 1986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 2046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimbool dng_date_time_info::IsValid () const 2066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return fDateTime.IsValid (); 2096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 2136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_date_time_info::SetDate (uint32 year, 2156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 month, 2166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 day) 2176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fDateTime.fYear = year; 2206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fDateTime.fMonth = month; 2216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fDateTime.fDay = day; 2226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 2266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_date_time_info::SetTime (uint32 hour, 2286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 minute, 2296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 second) 2306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fDateOnly = false; 2336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fDateTime.fHour = hour; 2356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fDateTime.fMinute = minute; 2366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fDateTime.fSecond = second; 2376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 2416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_date_time_info::Decode_ISO_8601 (const char *s) 2436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim Clear (); 2466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 len = (uint32) strlen (s); 2486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (!len) 2506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return; 2526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned year = 0; 2556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned month = 0; 2566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned day = 0; 2576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (sscanf (s, 2596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim "%u-%u-%u", 2606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &year, 2616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &month, 2626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &day) != 3) 2636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return; 2656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim SetDate ((uint32) year, 2686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (uint32) month, 2696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (uint32) day); 2706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fDateTime.NotValid ()) 2726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim Clear (); 2746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return; 2756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 j = 0; j < len; j++) 2786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (s [j] == 'T') 2816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned hour = 0; 2846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned minute = 0; 2856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned second = 0; 2866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int items = sscanf (s + j + 1, 2886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim "%u:%u:%u", 2896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &hour, 2906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &minute, 2916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &second); 2926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (items >= 2 && items <= 3) 2946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim SetTime ((uint32) hour, 2976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (uint32) minute, 2986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (uint32) second); 2996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fDateTime.NotValid ()) 3016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim Clear (); 3036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return; 3046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (items == 3) 3076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 k = j + 1; k < len; k++) 3106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (s [k] == '.') 3136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim while (++k < len && s [k] >= '0' && s [k] <= '9') 3166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim char ss [2]; 3196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim ss [0] = s [k]; 3216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim ss [1] = 0; 3226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fSubseconds.Append (ss); 3246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim break; 3286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 k = j + 1; k < len; k++) 3366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (s [k] == 'Z') 3396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fTimeZone.SetOffsetMinutes (0); 3426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim break; 3446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (s [k] == '+' || s [k] == '-') 3486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int32 sign = (s [k] == '-' ? -1 : 1); 3516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned tzhour = 0; 3536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned tzmin = 0; 3546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (sscanf (s + k + 1, 3566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim "%u:%u", 3576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &tzhour, 3586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &tzmin) > 0) 3596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fTimeZone.SetOffsetMinutes (sign * (tzhour * 60 + tzmin)); 3626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim break; 3666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim break; 3746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 3826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_string dng_date_time_info::Encode_ISO_8601 () const 3846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_string result; 3876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (IsValid ()) 3896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim char s [256]; 3926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim sprintf (s, 3946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim "%04u-%02u-%02u", 3956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fYear, 3966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fMonth, 3976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fDay); 3986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim result.Set (s); 4006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (!fDateOnly) 4026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim sprintf (s, 4056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim "T%02u:%02u:%02u", 4066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fHour, 4076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fMinute, 4086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fSecond); 4096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim result.Append (s); 4116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fSubseconds.NotEmpty ()) 4136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim bool subsecondsValid = true; 4166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 len = fSubseconds.Length (); 4186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 index = 0; index < len; index++) 4206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fSubseconds.Get () [index] < '0' || 4236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fSubseconds.Get () [index] > '9') 4246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim subsecondsValid = false; 4266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim break; 4276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (subsecondsValid) 4326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim result.Append ("."); 4346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim result.Append (fSubseconds.Get ()); 4356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (gDNGUseFakeTimeZonesInXMP) 4406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Kludge: Early versions of the XMP toolkit assume Zulu time 4436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // if the time zone is missing. It is safer for fill in the 4446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // local time zone. 4456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_time_zone tempZone = fTimeZone; 4476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (tempZone.NotValid ()) 4496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim tempZone = LocalTimeZone (fDateTime); 4516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim result.Append (tempZone.Encode_ISO_8601 ().Get ()); 4546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 4586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // MWG: Now we don't fill in the local time zone. So only 4616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // add the time zone if it is known and valid. 4626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fTimeZone.IsValid ()) 4646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim result.Append (fTimeZone.Encode_ISO_8601 ().Get ()); 4666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return result; 4756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 4796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_date_time_info::Decode_IPTC_Date (const char *s) 4816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (strlen (s) == 8) 4846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned year = 0; 4876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned month = 0; 4886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned day = 0; 4896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (sscanf (s, 4916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim "%4u%2u%2u", 4926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &year, 4936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &month, 4946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &day) == 3) 4956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim SetDate ((uint32) year, 4986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (uint32) month, 4996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (uint32) day); 5006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 5086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_string dng_date_time_info::Encode_IPTC_Date () const 5106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_string result; 5136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (IsValid ()) 5156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim char s [64]; 5186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim sprintf (s, 5206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim "%04u%02u%02u", 5216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fYear, 5226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fMonth, 5236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fDay); 5246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim result.Set (s); 5266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return result; 5306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 5346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_date_time_info::Decode_IPTC_Time (const char *s) 5366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (strlen (s) == 11) 5396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim char time [12]; 5426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim memcpy (time, s, sizeof (time)); 5446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (time [6] == '+' || 5466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim time [6] == '-') 5476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int tzsign = (time [6] == '-') ? -1 : 1; 5506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim time [6] = 0; 5526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned hour = 0; 5546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned minute = 0; 5556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned second = 0; 5566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned tzhour = 0; 5576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned tzmin = 0; 5586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (sscanf (time, 5606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim "%2u%2u%2u", 5616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &hour, 5626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &minute, 5636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &second) == 3 && 5646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim sscanf (time + 7, 5656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim "%2u%2u", 5666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &tzhour, 5676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &tzmin) == 2) 5686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_time_zone zone; 5716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim zone.SetOffsetMinutes (tzsign * (tzhour * 60 + tzmin)); 5736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (zone.IsValid ()) 5756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim SetTime ((uint32) hour, 5786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (uint32) minute, 5796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (uint32) second); 5806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim SetZone (zone); 5826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else if (strlen (s) == 6) 5926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned hour = 0; 5956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned minute = 0; 5966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned second = 0; 5976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (sscanf (s, 5996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim "%2u%2u%2u", 6006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &hour, 6016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &minute, 6026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &second) == 3) 6036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim SetTime ((uint32) hour, 6066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (uint32) minute, 6076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (uint32) second); 6086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else if (strlen (s) == 4) 6146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned hour = 0; 6176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim unsigned minute = 0; 6186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (sscanf (s, 6206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim "%2u%2u", 6216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &hour, 6226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim &minute) == 2) 6236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim SetTime ((uint32) hour, 6266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (uint32) minute, 6276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 0); 6286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 6366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_string dng_date_time_info::Encode_IPTC_Time () const 6386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_string result; 6416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (IsValid () && !fDateOnly) 6436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim char s [64]; 6466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fTimeZone.IsValid ()) 6486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim sprintf (s, 6516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim "%02u%02u%02u%c%02u%02u", 6526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fHour, 6536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fMinute, 6546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fSecond, 6556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (int) (fTimeZone.OffsetMinutes () >= 0 ? '+' : '-'), 6566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) (Abs_int32 (fTimeZone.OffsetMinutes ()) / 60), 6576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) (Abs_int32 (fTimeZone.OffsetMinutes ()) % 60)); 6586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 6626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim sprintf (s, 6656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim "%02u%02u%02u", 6666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fHour, 6676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fMinute, 6686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (unsigned) fDateTime.fSecond); 6696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim result.Set (s); 6736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return result; 6776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 6816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimstatic dng_mutex gDateTimeMutex ("gDateTimeMutex"); 6836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 6856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid CurrentDateTimeAndZone (dng_date_time_info &info) 6876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim time_t sec; 6906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim time (&sec); 6926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim tm t; 6946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim tm zt; 6956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_lock_mutex lock (&gDateTimeMutex); 6996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim t = *localtime (&sec); 7016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim zt = *gmtime (&sec); 7026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_date_time dt; 7066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dt.fYear = t.tm_year + 1900; 7086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dt.fMonth = t.tm_mon + 1; 7096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dt.fDay = t.tm_mday; 7106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dt.fHour = t.tm_hour; 7116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dt.fMinute = t.tm_min; 7126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dt.fSecond = t.tm_sec; 7136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim info.SetDateTime (dt); 7156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int tzHour = t.tm_hour - zt.tm_hour; 7176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int tzMin = t.tm_min - zt.tm_min; 7186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim bool zonePositive = (t.tm_year > zt.tm_year) || 7206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (t.tm_year == zt.tm_year && t.tm_yday > zt.tm_yday) || 7216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (t.tm_year == zt.tm_year && t.tm_yday == zt.tm_yday && tzHour > 0) || 7226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (t.tm_year == zt.tm_year && t.tm_yday == zt.tm_yday && tzHour == 0 && tzMin >= 0); 7236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim tzMin += tzHour * 60; 7256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (zonePositive) 7276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim while (tzMin < 0) 7306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim tzMin += 24 * 60; 7316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 7356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim while (tzMin > 0) 7386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim tzMin -= 24 * 60; 7396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_time_zone zone; 7436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim zone.SetOffsetMinutes (tzMin); 7456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim info.SetZone (zone); 7476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 7516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid DecodeUnixTime (uint32 unixTime, dng_date_time &dt) 7536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim time_t sec = (time_t) unixTime; 7566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim tm t; 7586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_lock_mutex lock (&gDateTimeMutex); 7626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim #if qMacOS && !defined(__MACH__) 7646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Macintosh CFM stores time in local time zone. 7666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim tm *tp = localtime (&sec); 7686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim #else 7706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Macintosh Mach-O and Windows stores time in Zulu time. 7726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim tm *tp = gmtime (&sec); 7746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim #endif 7766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (!tp) 7786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dt.Clear (); 7806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return; 7816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim t = *tp; 7846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dt.fYear = t.tm_year + 1900; 7886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dt.fMonth = t.tm_mon + 1; 7896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dt.fDay = t.tm_mday; 7906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dt.fHour = t.tm_hour; 7916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dt.fMinute = t.tm_min; 7926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dt.fSecond = t.tm_sec; 7936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 7976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_time_zone LocalTimeZone (const dng_date_time &dt) 7996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_time_zone result; 8026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (dt.IsValid ()) 8046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim #if qMacOS 8076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim CFTimeZoneRef zoneRef = CFTimeZoneCopyDefault (); 8096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (zoneRef) 8116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim CFGregorianDate gregDate; 8146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim gregDate.year = dt.fYear; 8166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim gregDate.month = (SInt8) dt.fMonth; 8176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim gregDate.day = (SInt8) dt.fDay; 8186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim gregDate.hour = (SInt8) dt.fHour; 8196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim gregDate.minute = (SInt8) dt.fMinute; 8206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim gregDate.second = (SInt8) dt.fSecond; 8216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim CFAbsoluteTime absTime = CFGregorianDateGetAbsoluteTime (gregDate, zoneRef); 8236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim CFTimeInterval secondsDelta = CFTimeZoneGetSecondsFromGMT (zoneRef, absTime); 8256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim CFRelease (zoneRef); 8276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim result.SetOffsetSeconds (Round_int32 (secondsDelta)); 8296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (result.IsValid ()) 8316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return result; 8336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim #endif 8386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim #if qWinOS 8406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (GetTimeZoneInformation != NULL && 8426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim SystemTimeToTzSpecificLocalTime != NULL && 8436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim SystemTimeToFileTime != NULL) 8446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim TIME_ZONE_INFORMATION tzInfo; 8476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim DWORD x = GetTimeZoneInformation (&tzInfo); 8496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim SYSTEMTIME localST; 8516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim memset (&localST, 0, sizeof (localST)); 8536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim localST.wYear = (WORD) dt.fYear; 8556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim localST.wMonth = (WORD) dt.fMonth; 8566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim localST.wDay = (WORD) dt.fDay; 8576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim localST.wHour = (WORD) dt.fHour; 8586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim localST.wMinute = (WORD) dt.fMinute; 8596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim localST.wSecond = (WORD) dt.fSecond; 8606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim SYSTEMTIME utcST; 8626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (TzSpecificLocalTimeToSystemTime (&tzInfo, &localST, &utcST)) 8646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim FILETIME localFT; 8676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim FILETIME utcFT; 8686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (void) SystemTimeToFileTime (&localST, &localFT); 8706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (void) SystemTimeToFileTime (&utcST , &utcFT ); 8716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint64 time1 = (((uint64) localFT.dwHighDateTime) << 32) + localFT.dwLowDateTime; 8736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint64 time2 = (((uint64) utcFT .dwHighDateTime) << 32) + utcFT .dwLowDateTime; 8746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // FILETIMEs are in units to 100 ns. Convert to seconds. 8766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int64 time1Sec = time1 / 10000000; 8786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int64 time2Sec = time2 / 10000000; 8796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int32 delta = (int32) (time1Sec - time2Sec); 8816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim result.SetOffsetSeconds (delta); 8836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (result.IsValid ()) 8856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return result; 8876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim #endif 8946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Figure out local time zone. 8986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_date_time_info current_info; 9006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim CurrentDateTimeAndZone (current_info); 9026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim result = current_info.TimeZone (); 9046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return result; 9066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 9106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_date_time_storage_info::dng_date_time_storage_info () 9126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim : fOffset (kDNGStreamInvalidOffset ) 9146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fFormat (dng_date_time_format_unknown) 9156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 9176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 9216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_date_time_storage_info::dng_date_time_storage_info (uint64 offset, 9236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_date_time_format format) 9246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim : fOffset (offset) 9266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fFormat (format) 9276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 9296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 9336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimbool dng_date_time_storage_info::IsValid () const 9356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 9366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return fOffset != kDNGStreamInvalidOffset; 9386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 9426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimuint64 dng_date_time_storage_info::Offset () const 9446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 9456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (!IsValid ()) 9476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim ThrowProgramError (); 9486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return fOffset; 9506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 9546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_date_time_format dng_date_time_storage_info::Format () const 9566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 9576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (!IsValid ()) 9596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim ThrowProgramError (); 9606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return fFormat; 9626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 966