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