xref: /aosp_15_r20/external/dng_sdk/source/dng_date_time.h (revision fd1fabb72dbdf09ea7034f531e6f8e9f57334c8d)
1*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
2*fd1fabb7SAndroid Build Coastguard Worker // Copyright 2006-2008 Adobe Systems Incorporated
3*fd1fabb7SAndroid Build Coastguard Worker // All Rights Reserved.
4*fd1fabb7SAndroid Build Coastguard Worker //
5*fd1fabb7SAndroid Build Coastguard Worker // NOTICE:  Adobe permits you to use, modify, and distribute this file in
6*fd1fabb7SAndroid Build Coastguard Worker // accordance with the terms of the Adobe license agreement accompanying it.
7*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
8*fd1fabb7SAndroid Build Coastguard Worker 
9*fd1fabb7SAndroid Build Coastguard Worker /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_date_time.h#1 $ */
10*fd1fabb7SAndroid Build Coastguard Worker /* $DateTime: 2012/05/30 13:28:51 $ */
11*fd1fabb7SAndroid Build Coastguard Worker /* $Change: 832332 $ */
12*fd1fabb7SAndroid Build Coastguard Worker /* $Author: tknoll $ */
13*fd1fabb7SAndroid Build Coastguard Worker 
14*fd1fabb7SAndroid Build Coastguard Worker /** \file
15*fd1fabb7SAndroid Build Coastguard Worker  * Functions and classes for working with dates and times in DNG files.
16*fd1fabb7SAndroid Build Coastguard Worker  */
17*fd1fabb7SAndroid Build Coastguard Worker 
18*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
19*fd1fabb7SAndroid Build Coastguard Worker 
20*fd1fabb7SAndroid Build Coastguard Worker #ifndef __dng_date_time__
21*fd1fabb7SAndroid Build Coastguard Worker #define __dng_date_time__
22*fd1fabb7SAndroid Build Coastguard Worker 
23*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
24*fd1fabb7SAndroid Build Coastguard Worker 
25*fd1fabb7SAndroid Build Coastguard Worker #include "dng_classes.h"
26*fd1fabb7SAndroid Build Coastguard Worker #include "dng_string.h"
27*fd1fabb7SAndroid Build Coastguard Worker #include "dng_types.h"
28*fd1fabb7SAndroid Build Coastguard Worker 
29*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
30*fd1fabb7SAndroid Build Coastguard Worker 
31*fd1fabb7SAndroid Build Coastguard Worker /// \brief Class for holding a date/time and converting to and from relevant
32*fd1fabb7SAndroid Build Coastguard Worker /// date/time formats
33*fd1fabb7SAndroid Build Coastguard Worker 
34*fd1fabb7SAndroid Build Coastguard Worker class dng_date_time
35*fd1fabb7SAndroid Build Coastguard Worker 	{
36*fd1fabb7SAndroid Build Coastguard Worker 
37*fd1fabb7SAndroid Build Coastguard Worker 	public:
38*fd1fabb7SAndroid Build Coastguard Worker 
39*fd1fabb7SAndroid Build Coastguard Worker 		uint32 fYear;
40*fd1fabb7SAndroid Build Coastguard Worker 		uint32 fMonth;
41*fd1fabb7SAndroid Build Coastguard Worker 		uint32 fDay;
42*fd1fabb7SAndroid Build Coastguard Worker 		uint32 fHour;
43*fd1fabb7SAndroid Build Coastguard Worker 		uint32 fMinute;
44*fd1fabb7SAndroid Build Coastguard Worker 		uint32 fSecond;
45*fd1fabb7SAndroid Build Coastguard Worker 
46*fd1fabb7SAndroid Build Coastguard Worker 	public:
47*fd1fabb7SAndroid Build Coastguard Worker 
48*fd1fabb7SAndroid Build Coastguard Worker 		/// Construct an invalid date/time
49*fd1fabb7SAndroid Build Coastguard Worker 
50*fd1fabb7SAndroid Build Coastguard Worker 		dng_date_time ();
51*fd1fabb7SAndroid Build Coastguard Worker 
52*fd1fabb7SAndroid Build Coastguard Worker 		/// Construct a date/time with specific values.
53*fd1fabb7SAndroid Build Coastguard Worker 		/// \param year Year to use as actual integer value, such as 2006.
54*fd1fabb7SAndroid Build Coastguard Worker 		/// \param month Month to use from 1 - 12, where 1 is January.
55*fd1fabb7SAndroid Build Coastguard Worker 		/// \param day Day of month to use from 1 -31, where 1 is the first.
56*fd1fabb7SAndroid Build Coastguard Worker 		/// \param hour Hour of day to use from 0 - 23, where 0 is midnight.
57*fd1fabb7SAndroid Build Coastguard Worker 		/// \param minute Minute of hour to use from 0 - 59.
58*fd1fabb7SAndroid Build Coastguard Worker 		/// \param second Second of minute to use from 0 - 59.
59*fd1fabb7SAndroid Build Coastguard Worker 
60*fd1fabb7SAndroid Build Coastguard Worker 		dng_date_time (uint32 year,
61*fd1fabb7SAndroid Build Coastguard Worker 					   uint32 month,
62*fd1fabb7SAndroid Build Coastguard Worker 					   uint32 day,
63*fd1fabb7SAndroid Build Coastguard Worker 					   uint32 hour,
64*fd1fabb7SAndroid Build Coastguard Worker 					   uint32 minute,
65*fd1fabb7SAndroid Build Coastguard Worker 					   uint32 second);
66*fd1fabb7SAndroid Build Coastguard Worker 
67*fd1fabb7SAndroid Build Coastguard Worker 		/// Predicate to determine if a date is valid.
68*fd1fabb7SAndroid Build Coastguard Worker 		/// \retval true if all fields are within range.
69*fd1fabb7SAndroid Build Coastguard Worker 
70*fd1fabb7SAndroid Build Coastguard Worker 		bool IsValid () const;
71*fd1fabb7SAndroid Build Coastguard Worker 
72*fd1fabb7SAndroid Build Coastguard Worker 		/// Predicate to determine if a date is invalid.
73*fd1fabb7SAndroid Build Coastguard Worker 		/// \retval true if any field is out of range.
74*fd1fabb7SAndroid Build Coastguard Worker 
NotValid()75*fd1fabb7SAndroid Build Coastguard Worker 		bool NotValid () const
76*fd1fabb7SAndroid Build Coastguard Worker 			{
77*fd1fabb7SAndroid Build Coastguard Worker 			return !IsValid ();
78*fd1fabb7SAndroid Build Coastguard Worker 			}
79*fd1fabb7SAndroid Build Coastguard Worker 
80*fd1fabb7SAndroid Build Coastguard Worker 		/// Equal operator.
81*fd1fabb7SAndroid Build Coastguard Worker 
82*fd1fabb7SAndroid Build Coastguard Worker 		bool operator== (const dng_date_time &dt) const
83*fd1fabb7SAndroid Build Coastguard Worker 			{
84*fd1fabb7SAndroid Build Coastguard Worker 			return fYear   == dt.fYear   &&
85*fd1fabb7SAndroid Build Coastguard Worker 				   fMonth  == dt.fMonth  &&
86*fd1fabb7SAndroid Build Coastguard Worker 				   fDay    == dt.fDay    &&
87*fd1fabb7SAndroid Build Coastguard Worker 				   fHour   == dt.fHour   &&
88*fd1fabb7SAndroid Build Coastguard Worker 				   fMinute == dt.fMinute &&
89*fd1fabb7SAndroid Build Coastguard Worker 				   fSecond == dt.fSecond;
90*fd1fabb7SAndroid Build Coastguard Worker 			}
91*fd1fabb7SAndroid Build Coastguard Worker 
92*fd1fabb7SAndroid Build Coastguard Worker 		// Not-equal operator.
93*fd1fabb7SAndroid Build Coastguard Worker 
94*fd1fabb7SAndroid Build Coastguard Worker 		bool operator!= (const dng_date_time &dt) const
95*fd1fabb7SAndroid Build Coastguard Worker 			{
96*fd1fabb7SAndroid Build Coastguard Worker 			return !(*this == dt);
97*fd1fabb7SAndroid Build Coastguard Worker 			}
98*fd1fabb7SAndroid Build Coastguard Worker 
99*fd1fabb7SAndroid Build Coastguard Worker 		/// Set date to an invalid value.
100*fd1fabb7SAndroid Build Coastguard Worker 
101*fd1fabb7SAndroid Build Coastguard Worker 		void Clear ();
102*fd1fabb7SAndroid Build Coastguard Worker 
103*fd1fabb7SAndroid Build Coastguard Worker 		/// Parse an EXIF format date string.
104*fd1fabb7SAndroid Build Coastguard Worker 		/// \param s Input date string to parse.
105*fd1fabb7SAndroid Build Coastguard Worker 		/// \retval true if date was parsed successfully and date is valid.
106*fd1fabb7SAndroid Build Coastguard Worker 
107*fd1fabb7SAndroid Build Coastguard Worker 		bool Parse (const char *s);
108*fd1fabb7SAndroid Build Coastguard Worker 
109*fd1fabb7SAndroid Build Coastguard Worker 	};
110*fd1fabb7SAndroid Build Coastguard Worker 
111*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
112*fd1fabb7SAndroid Build Coastguard Worker 
113*fd1fabb7SAndroid Build Coastguard Worker /// \brief Class for holding a time zone.
114*fd1fabb7SAndroid Build Coastguard Worker 
115*fd1fabb7SAndroid Build Coastguard Worker class dng_time_zone
116*fd1fabb7SAndroid Build Coastguard Worker 	{
117*fd1fabb7SAndroid Build Coastguard Worker 
118*fd1fabb7SAndroid Build Coastguard Worker 	private:
119*fd1fabb7SAndroid Build Coastguard Worker 
120*fd1fabb7SAndroid Build Coastguard Worker 		enum
121*fd1fabb7SAndroid Build Coastguard Worker 			{
122*fd1fabb7SAndroid Build Coastguard Worker 
123*fd1fabb7SAndroid Build Coastguard Worker 			kMaxOffsetHours = 15,
124*fd1fabb7SAndroid Build Coastguard Worker 			kMinOffsetHours = -kMaxOffsetHours,
125*fd1fabb7SAndroid Build Coastguard Worker 
126*fd1fabb7SAndroid Build Coastguard Worker 			kMaxOffsetMinutes = kMaxOffsetHours * 60,
127*fd1fabb7SAndroid Build Coastguard Worker 			kMinOffsetMinutes = kMinOffsetHours * 60,
128*fd1fabb7SAndroid Build Coastguard Worker 
129*fd1fabb7SAndroid Build Coastguard Worker 			kInvalidOffset = kMinOffsetMinutes - 1
130*fd1fabb7SAndroid Build Coastguard Worker 
131*fd1fabb7SAndroid Build Coastguard Worker 			};
132*fd1fabb7SAndroid Build Coastguard Worker 
133*fd1fabb7SAndroid Build Coastguard Worker 		// Offset from GMT in minutes.  Positive numbers are
134*fd1fabb7SAndroid Build Coastguard Worker 		// ahead of GMT, negative number are behind GMT.
135*fd1fabb7SAndroid Build Coastguard Worker 
136*fd1fabb7SAndroid Build Coastguard Worker 		int32 fOffsetMinutes;
137*fd1fabb7SAndroid Build Coastguard Worker 
138*fd1fabb7SAndroid Build Coastguard Worker 	public:
139*fd1fabb7SAndroid Build Coastguard Worker 
dng_time_zone()140*fd1fabb7SAndroid Build Coastguard Worker 		dng_time_zone ()
141*fd1fabb7SAndroid Build Coastguard Worker 			:	fOffsetMinutes (kInvalidOffset)
142*fd1fabb7SAndroid Build Coastguard Worker 			{
143*fd1fabb7SAndroid Build Coastguard Worker 			}
144*fd1fabb7SAndroid Build Coastguard Worker 
Clear()145*fd1fabb7SAndroid Build Coastguard Worker 		void Clear ()
146*fd1fabb7SAndroid Build Coastguard Worker 			{
147*fd1fabb7SAndroid Build Coastguard Worker 			fOffsetMinutes = kInvalidOffset;
148*fd1fabb7SAndroid Build Coastguard Worker 			}
149*fd1fabb7SAndroid Build Coastguard Worker 
SetOffsetHours(int32 offset)150*fd1fabb7SAndroid Build Coastguard Worker 		void SetOffsetHours (int32 offset)
151*fd1fabb7SAndroid Build Coastguard Worker 			{
152*fd1fabb7SAndroid Build Coastguard Worker 			fOffsetMinutes = SafeInt32Mult(offset, 60);
153*fd1fabb7SAndroid Build Coastguard Worker 			}
154*fd1fabb7SAndroid Build Coastguard Worker 
SetOffsetMinutes(int32 offset)155*fd1fabb7SAndroid Build Coastguard Worker 		void SetOffsetMinutes (int32 offset)
156*fd1fabb7SAndroid Build Coastguard Worker 			{
157*fd1fabb7SAndroid Build Coastguard Worker 			fOffsetMinutes = offset;
158*fd1fabb7SAndroid Build Coastguard Worker 			}
159*fd1fabb7SAndroid Build Coastguard Worker 
SetOffsetSeconds(int32 offset)160*fd1fabb7SAndroid Build Coastguard Worker 		void SetOffsetSeconds (int32 offset)
161*fd1fabb7SAndroid Build Coastguard Worker 			{
162*fd1fabb7SAndroid Build Coastguard Worker 			fOffsetMinutes = (offset > 0) ? ((offset + 30) / 60)
163*fd1fabb7SAndroid Build Coastguard Worker 										  : ((offset - 30) / 60);
164*fd1fabb7SAndroid Build Coastguard Worker 			}
165*fd1fabb7SAndroid Build Coastguard Worker 
IsValid()166*fd1fabb7SAndroid Build Coastguard Worker 		bool IsValid () const
167*fd1fabb7SAndroid Build Coastguard Worker 			{
168*fd1fabb7SAndroid Build Coastguard Worker 			return fOffsetMinutes >= kMinOffsetMinutes &&
169*fd1fabb7SAndroid Build Coastguard Worker 				   fOffsetMinutes <= kMaxOffsetMinutes;
170*fd1fabb7SAndroid Build Coastguard Worker 			}
171*fd1fabb7SAndroid Build Coastguard Worker 
NotValid()172*fd1fabb7SAndroid Build Coastguard Worker 		bool NotValid () const
173*fd1fabb7SAndroid Build Coastguard Worker 			{
174*fd1fabb7SAndroid Build Coastguard Worker 			return !IsValid ();
175*fd1fabb7SAndroid Build Coastguard Worker 			}
176*fd1fabb7SAndroid Build Coastguard Worker 
OffsetMinutes()177*fd1fabb7SAndroid Build Coastguard Worker 		int32 OffsetMinutes () const
178*fd1fabb7SAndroid Build Coastguard Worker 			{
179*fd1fabb7SAndroid Build Coastguard Worker 			return fOffsetMinutes;
180*fd1fabb7SAndroid Build Coastguard Worker 			}
181*fd1fabb7SAndroid Build Coastguard Worker 
IsExactHourOffset()182*fd1fabb7SAndroid Build Coastguard Worker 		bool IsExactHourOffset () const
183*fd1fabb7SAndroid Build Coastguard Worker 			{
184*fd1fabb7SAndroid Build Coastguard Worker 			return IsValid () && ((fOffsetMinutes % 60) == 0);
185*fd1fabb7SAndroid Build Coastguard Worker 			}
186*fd1fabb7SAndroid Build Coastguard Worker 
ExactHourOffset()187*fd1fabb7SAndroid Build Coastguard Worker 		int32 ExactHourOffset () const
188*fd1fabb7SAndroid Build Coastguard Worker 			{
189*fd1fabb7SAndroid Build Coastguard Worker 			return fOffsetMinutes / 60;
190*fd1fabb7SAndroid Build Coastguard Worker 			}
191*fd1fabb7SAndroid Build Coastguard Worker 
192*fd1fabb7SAndroid Build Coastguard Worker 		dng_string Encode_ISO_8601 () const;
193*fd1fabb7SAndroid Build Coastguard Worker 
194*fd1fabb7SAndroid Build Coastguard Worker 	};
195*fd1fabb7SAndroid Build Coastguard Worker 
196*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
197*fd1fabb7SAndroid Build Coastguard Worker 
198*fd1fabb7SAndroid Build Coastguard Worker /// \brief Class for holding complete data/time/zone information.
199*fd1fabb7SAndroid Build Coastguard Worker 
200*fd1fabb7SAndroid Build Coastguard Worker class dng_date_time_info
201*fd1fabb7SAndroid Build Coastguard Worker 	{
202*fd1fabb7SAndroid Build Coastguard Worker 
203*fd1fabb7SAndroid Build Coastguard Worker 	private:
204*fd1fabb7SAndroid Build Coastguard Worker 
205*fd1fabb7SAndroid Build Coastguard Worker 		// Is only the date valid and not the time?
206*fd1fabb7SAndroid Build Coastguard Worker 
207*fd1fabb7SAndroid Build Coastguard Worker 		bool fDateOnly;
208*fd1fabb7SAndroid Build Coastguard Worker 
209*fd1fabb7SAndroid Build Coastguard Worker 		// Date and time.
210*fd1fabb7SAndroid Build Coastguard Worker 
211*fd1fabb7SAndroid Build Coastguard Worker 		dng_date_time fDateTime;
212*fd1fabb7SAndroid Build Coastguard Worker 
213*fd1fabb7SAndroid Build Coastguard Worker 		// Subseconds string (stored in a separate tag in EXIF).
214*fd1fabb7SAndroid Build Coastguard Worker 
215*fd1fabb7SAndroid Build Coastguard Worker 		dng_string fSubseconds;
216*fd1fabb7SAndroid Build Coastguard Worker 
217*fd1fabb7SAndroid Build Coastguard Worker 		// Time zone, if known.
218*fd1fabb7SAndroid Build Coastguard Worker 
219*fd1fabb7SAndroid Build Coastguard Worker 		dng_time_zone fTimeZone;
220*fd1fabb7SAndroid Build Coastguard Worker 
221*fd1fabb7SAndroid Build Coastguard Worker 	public:
222*fd1fabb7SAndroid Build Coastguard Worker 
223*fd1fabb7SAndroid Build Coastguard Worker 		dng_date_time_info ();
224*fd1fabb7SAndroid Build Coastguard Worker 
225*fd1fabb7SAndroid Build Coastguard Worker 		bool IsValid () const;
226*fd1fabb7SAndroid Build Coastguard Worker 
NotValid()227*fd1fabb7SAndroid Build Coastguard Worker 		bool NotValid () const
228*fd1fabb7SAndroid Build Coastguard Worker 			{
229*fd1fabb7SAndroid Build Coastguard Worker 			return !IsValid ();
230*fd1fabb7SAndroid Build Coastguard Worker 			}
231*fd1fabb7SAndroid Build Coastguard Worker 
Clear()232*fd1fabb7SAndroid Build Coastguard Worker 		void Clear ()
233*fd1fabb7SAndroid Build Coastguard Worker 			{
234*fd1fabb7SAndroid Build Coastguard Worker 			*this = dng_date_time_info ();
235*fd1fabb7SAndroid Build Coastguard Worker 			}
236*fd1fabb7SAndroid Build Coastguard Worker 
DateTime()237*fd1fabb7SAndroid Build Coastguard Worker 		const dng_date_time & DateTime () const
238*fd1fabb7SAndroid Build Coastguard Worker 			{
239*fd1fabb7SAndroid Build Coastguard Worker 			return fDateTime;
240*fd1fabb7SAndroid Build Coastguard Worker 			}
241*fd1fabb7SAndroid Build Coastguard Worker 
SetDateTime(const dng_date_time & dt)242*fd1fabb7SAndroid Build Coastguard Worker 		void SetDateTime (const dng_date_time &dt)
243*fd1fabb7SAndroid Build Coastguard Worker 			{
244*fd1fabb7SAndroid Build Coastguard Worker 			fDateOnly = false;
245*fd1fabb7SAndroid Build Coastguard Worker 			fDateTime = dt;
246*fd1fabb7SAndroid Build Coastguard Worker 			}
247*fd1fabb7SAndroid Build Coastguard Worker 
Subseconds()248*fd1fabb7SAndroid Build Coastguard Worker 		const dng_string & Subseconds () const
249*fd1fabb7SAndroid Build Coastguard Worker 			{
250*fd1fabb7SAndroid Build Coastguard Worker 			return fSubseconds;
251*fd1fabb7SAndroid Build Coastguard Worker 			}
252*fd1fabb7SAndroid Build Coastguard Worker 
SetSubseconds(const dng_string & s)253*fd1fabb7SAndroid Build Coastguard Worker 		void SetSubseconds (const dng_string &s)
254*fd1fabb7SAndroid Build Coastguard Worker 			{
255*fd1fabb7SAndroid Build Coastguard Worker 			fSubseconds = s;
256*fd1fabb7SAndroid Build Coastguard Worker 			}
257*fd1fabb7SAndroid Build Coastguard Worker 
TimeZone()258*fd1fabb7SAndroid Build Coastguard Worker 		const dng_time_zone & TimeZone () const
259*fd1fabb7SAndroid Build Coastguard Worker 			{
260*fd1fabb7SAndroid Build Coastguard Worker 			return fTimeZone;
261*fd1fabb7SAndroid Build Coastguard Worker 			}
262*fd1fabb7SAndroid Build Coastguard Worker 
SetZone(const dng_time_zone & zone)263*fd1fabb7SAndroid Build Coastguard Worker 		void SetZone (const dng_time_zone &zone)
264*fd1fabb7SAndroid Build Coastguard Worker 			{
265*fd1fabb7SAndroid Build Coastguard Worker 			fTimeZone = zone;
266*fd1fabb7SAndroid Build Coastguard Worker 			}
267*fd1fabb7SAndroid Build Coastguard Worker 
268*fd1fabb7SAndroid Build Coastguard Worker 		void Decode_ISO_8601 (const char *s);
269*fd1fabb7SAndroid Build Coastguard Worker 
270*fd1fabb7SAndroid Build Coastguard Worker 		dng_string Encode_ISO_8601 () const;
271*fd1fabb7SAndroid Build Coastguard Worker 
272*fd1fabb7SAndroid Build Coastguard Worker 		void Decode_IPTC_Date (const char *s);
273*fd1fabb7SAndroid Build Coastguard Worker 
274*fd1fabb7SAndroid Build Coastguard Worker 		dng_string Encode_IPTC_Date () const;
275*fd1fabb7SAndroid Build Coastguard Worker 
276*fd1fabb7SAndroid Build Coastguard Worker 		void Decode_IPTC_Time (const char *s);
277*fd1fabb7SAndroid Build Coastguard Worker 
278*fd1fabb7SAndroid Build Coastguard Worker 		dng_string Encode_IPTC_Time () const;
279*fd1fabb7SAndroid Build Coastguard Worker 
280*fd1fabb7SAndroid Build Coastguard Worker 	private:
281*fd1fabb7SAndroid Build Coastguard Worker 
282*fd1fabb7SAndroid Build Coastguard Worker 		void SetDate (uint32 year,
283*fd1fabb7SAndroid Build Coastguard Worker 					  uint32 month,
284*fd1fabb7SAndroid Build Coastguard Worker 					  uint32 day);
285*fd1fabb7SAndroid Build Coastguard Worker 
286*fd1fabb7SAndroid Build Coastguard Worker 		void SetTime (uint32 hour,
287*fd1fabb7SAndroid Build Coastguard Worker 					  uint32 minute,
288*fd1fabb7SAndroid Build Coastguard Worker 					  uint32 second);
289*fd1fabb7SAndroid Build Coastguard Worker 
290*fd1fabb7SAndroid Build Coastguard Worker 	};
291*fd1fabb7SAndroid Build Coastguard Worker 
292*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
293*fd1fabb7SAndroid Build Coastguard Worker 
294*fd1fabb7SAndroid Build Coastguard Worker /// Get the current date/time and timezone.
295*fd1fabb7SAndroid Build Coastguard Worker /// \param info Receives current data/time/zone.
296*fd1fabb7SAndroid Build Coastguard Worker 
297*fd1fabb7SAndroid Build Coastguard Worker void CurrentDateTimeAndZone (dng_date_time_info &info);
298*fd1fabb7SAndroid Build Coastguard Worker 
299*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
300*fd1fabb7SAndroid Build Coastguard Worker 
301*fd1fabb7SAndroid Build Coastguard Worker /// Convert UNIX "seconds since Jan 1, 1970" time to a dng_date_time
302*fd1fabb7SAndroid Build Coastguard Worker 
303*fd1fabb7SAndroid Build Coastguard Worker void DecodeUnixTime (uint32 unixTime, dng_date_time &dt);
304*fd1fabb7SAndroid Build Coastguard Worker 
305*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
306*fd1fabb7SAndroid Build Coastguard Worker 
307*fd1fabb7SAndroid Build Coastguard Worker /// Return timezone of current location at a given date.
308*fd1fabb7SAndroid Build Coastguard Worker /// \param dt Date at which to compute timezone difference. (For example, used
309*fd1fabb7SAndroid Build Coastguard Worker /// to determine Daylight Savings, etc.)
310*fd1fabb7SAndroid Build Coastguard Worker /// \retval Time zone for date/time dt.
311*fd1fabb7SAndroid Build Coastguard Worker 
312*fd1fabb7SAndroid Build Coastguard Worker dng_time_zone LocalTimeZone (const dng_date_time &dt);
313*fd1fabb7SAndroid Build Coastguard Worker 
314*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
315*fd1fabb7SAndroid Build Coastguard Worker 
316*fd1fabb7SAndroid Build Coastguard Worker /// Tag to encode date represenation format
317*fd1fabb7SAndroid Build Coastguard Worker 
318*fd1fabb7SAndroid Build Coastguard Worker enum dng_date_time_format
319*fd1fabb7SAndroid Build Coastguard Worker 	{
320*fd1fabb7SAndroid Build Coastguard Worker 	dng_date_time_format_unknown            = 0, /// Date format not known
321*fd1fabb7SAndroid Build Coastguard Worker 	dng_date_time_format_exif               = 1, /// EXIF date string
322*fd1fabb7SAndroid Build Coastguard Worker 	dng_date_time_format_unix_little_endian = 2, /// 32-bit UNIX time as 4-byte little endian
323*fd1fabb7SAndroid Build Coastguard Worker 	dng_date_time_format_unix_big_endian    = 3  /// 32-bit UNIX time as 4-byte big endian
324*fd1fabb7SAndroid Build Coastguard Worker 	};
325*fd1fabb7SAndroid Build Coastguard Worker 
326*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
327*fd1fabb7SAndroid Build Coastguard Worker 
328*fd1fabb7SAndroid Build Coastguard Worker /// \brief Store file offset from which date was read.
329*fd1fabb7SAndroid Build Coastguard Worker ///
330*fd1fabb7SAndroid Build Coastguard Worker /// Used internally by Adobe to update date in original file.
331*fd1fabb7SAndroid Build Coastguard Worker /// \warning Use at your own risk.
332*fd1fabb7SAndroid Build Coastguard Worker 
333*fd1fabb7SAndroid Build Coastguard Worker class dng_date_time_storage_info
334*fd1fabb7SAndroid Build Coastguard Worker 	{
335*fd1fabb7SAndroid Build Coastguard Worker 
336*fd1fabb7SAndroid Build Coastguard Worker 	private:
337*fd1fabb7SAndroid Build Coastguard Worker 
338*fd1fabb7SAndroid Build Coastguard Worker 		uint64 fOffset;
339*fd1fabb7SAndroid Build Coastguard Worker 
340*fd1fabb7SAndroid Build Coastguard Worker 		dng_date_time_format fFormat;
341*fd1fabb7SAndroid Build Coastguard Worker 
342*fd1fabb7SAndroid Build Coastguard Worker 	public:
343*fd1fabb7SAndroid Build Coastguard Worker 
344*fd1fabb7SAndroid Build Coastguard Worker 		/// The default constructor initializes to an invalid state.
345*fd1fabb7SAndroid Build Coastguard Worker 
346*fd1fabb7SAndroid Build Coastguard Worker 		dng_date_time_storage_info ();
347*fd1fabb7SAndroid Build Coastguard Worker 
348*fd1fabb7SAndroid Build Coastguard Worker 		/// Construct with file offset and date format.
349*fd1fabb7SAndroid Build Coastguard Worker 
350*fd1fabb7SAndroid Build Coastguard Worker 		dng_date_time_storage_info (uint64 offset,
351*fd1fabb7SAndroid Build Coastguard Worker 									dng_date_time_format format);
352*fd1fabb7SAndroid Build Coastguard Worker 
353*fd1fabb7SAndroid Build Coastguard Worker 		/// Predicate to determine if an offset is valid.
354*fd1fabb7SAndroid Build Coastguard Worker 		/// \retval true if offset is valid.
355*fd1fabb7SAndroid Build Coastguard Worker 
356*fd1fabb7SAndroid Build Coastguard Worker 		bool IsValid () const;
357*fd1fabb7SAndroid Build Coastguard Worker 
358*fd1fabb7SAndroid Build Coastguard Worker 		// The accessors throw if the data is not valid.
359*fd1fabb7SAndroid Build Coastguard Worker 
360*fd1fabb7SAndroid Build Coastguard Worker 		/// Getter for offset in file.
361*fd1fabb7SAndroid Build Coastguard Worker 		/// \exception dng_exception with fErrorCode equal to dng_error_unknown
362*fd1fabb7SAndroid Build Coastguard Worker 		/// if offset is not valid.
363*fd1fabb7SAndroid Build Coastguard Worker 
364*fd1fabb7SAndroid Build Coastguard Worker 		uint64 Offset () const;
365*fd1fabb7SAndroid Build Coastguard Worker 
366*fd1fabb7SAndroid Build Coastguard Worker 		/// Get for format date was originally stored in file. Throws a
367*fd1fabb7SAndroid Build Coastguard Worker 		/// dng_error_unknown exception if offset is invalid.
368*fd1fabb7SAndroid Build Coastguard Worker 		/// \exception dng_exception with fErrorCode equal to dng_error_unknown
369*fd1fabb7SAndroid Build Coastguard Worker 		/// if offset is not valid.
370*fd1fabb7SAndroid Build Coastguard Worker 
371*fd1fabb7SAndroid Build Coastguard Worker 		dng_date_time_format Format () const;
372*fd1fabb7SAndroid Build Coastguard Worker 
373*fd1fabb7SAndroid Build Coastguard Worker 	};
374*fd1fabb7SAndroid Build Coastguard Worker 
375*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
376*fd1fabb7SAndroid Build Coastguard Worker 
377*fd1fabb7SAndroid Build Coastguard Worker // Kludge: Global boolean to turn on fake time zones in XMP for old software.
378*fd1fabb7SAndroid Build Coastguard Worker 
379*fd1fabb7SAndroid Build Coastguard Worker extern bool gDNGUseFakeTimeZonesInXMP;
380*fd1fabb7SAndroid Build Coastguard Worker 
381*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
382*fd1fabb7SAndroid Build Coastguard Worker 
383*fd1fabb7SAndroid Build Coastguard Worker #endif
384*fd1fabb7SAndroid Build Coastguard Worker 
385*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
386