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