DocumentationOverviewBuilding ASL Documentation Library Wiki Docs Indices Browse Perforce More InfoRelease NotesWiki Site Search License Success Stories Contributors MediaDownloadPerforce Depots SupportASL SourceForge HomeMailing Lists Discussion Forums Report Bugs Suggest Features Contribute to ASL RSSShort-text newsFull-text news File releases Other Adobe ProjectsAdobe AirAdobe GIL Adobe Labs Adobe Media Gallery Adobe XMP Tamarin project (Mozilla Foundation) Other ResourcesBoostRIAForge SGI STL |
dng_date_time.hGo to the documentation of this file.00001 /*****************************************************************************/ 00002 // Copyright 2006-2008 Adobe Systems Incorporated 00003 // All Rights Reserved. 00004 // 00005 // NOTICE: Adobe permits you to use, modify, and distribute this file in 00006 // accordance with the terms of the Adobe license agreement accompanying it. 00007 /*****************************************************************************/ 00008 00009 /* $Id: //mondo/workarea/stern/camera_raw/dng_sdk/source/dng_date_time.h#12 $ */ 00010 /* $DateTime: 2008/01/11 05:47:27 $ */ 00011 /* $Change: 410732 $ */ 00012 /* $Author: stern $ */ 00013 00018 /*****************************************************************************/ 00019 00020 #ifndef __dng_date_time__ 00021 #define __dng_date_time__ 00022 00023 /*****************************************************************************/ 00024 00025 #include "dng_classes.h" 00026 #include "dng_string.h" 00027 #include "dng_types.h" 00028 00029 /*****************************************************************************/ 00030 00033 00034 class dng_date_time 00035 { 00036 00037 public: 00038 00039 uint32 fYear; 00040 uint32 fMonth; 00041 uint32 fDay; 00042 uint32 fHour; 00043 uint32 fMinute; 00044 uint32 fSecond; 00045 00046 public: 00047 00049 00050 dng_date_time (); 00051 00059 00060 dng_date_time (uint32 year, 00061 uint32 month, 00062 uint32 day, 00063 uint32 hour, 00064 uint32 minute, 00065 uint32 second); 00066 00069 00070 bool IsValid () const; 00071 00074 00075 bool NotValid () const 00076 { 00077 return !IsValid (); 00078 } 00079 00081 00082 bool operator== (const dng_date_time &dt) const 00083 { 00084 return fYear == dt.fYear && 00085 fMonth == dt.fMonth && 00086 fDay == dt.fDay && 00087 fHour == dt.fHour && 00088 fMinute == dt.fMinute && 00089 fSecond == dt.fSecond; 00090 } 00091 00092 // Not-equal operator. 00093 00094 bool operator!= (const dng_date_time &dt) const 00095 { 00096 return !(*this == dt); 00097 } 00098 00100 00101 void Clear (); 00102 00106 00107 bool Parse (const char *s); 00108 00109 }; 00110 00111 /*****************************************************************************/ 00112 00114 00115 class dng_time_zone 00116 { 00117 00118 private: 00119 00120 enum 00121 { 00122 00123 kMaxOffsetHours = 15, 00124 kMinOffsetHours = -kMaxOffsetHours, 00125 00126 kMaxOffsetMinutes = kMaxOffsetHours * 60, 00127 kMinOffsetMinutes = kMinOffsetHours * 60, 00128 00129 kInvalidOffset = kMinOffsetMinutes - 1 00130 00131 }; 00132 00133 // Offset from GMT in minutes. Positive numbers are 00134 // ahead of GMT, negative number are behind GMT. 00135 00136 int32 fOffsetMinutes; 00137 00138 public: 00139 00140 dng_time_zone () 00141 : fOffsetMinutes (kInvalidOffset) 00142 { 00143 } 00144 00145 void Clear () 00146 { 00147 fOffsetMinutes = kInvalidOffset; 00148 } 00149 00150 void SetOffsetHours (int32 offset) 00151 { 00152 fOffsetMinutes = offset * 60; 00153 } 00154 00155 void SetOffsetMinutes (int32 offset) 00156 { 00157 fOffsetMinutes = offset; 00158 } 00159 00160 void SetOffsetSeconds (int32 offset) 00161 { 00162 fOffsetMinutes = (offset > 0) ? ((offset + 30) / 60) 00163 : ((offset - 30) / 60); 00164 } 00165 00166 bool IsValid () const 00167 { 00168 return fOffsetMinutes >= kMinOffsetMinutes && 00169 fOffsetMinutes <= kMaxOffsetMinutes; 00170 } 00171 00172 bool NotValid () const 00173 { 00174 return !IsValid (); 00175 } 00176 00177 int32 OffsetMinutes () const 00178 { 00179 return fOffsetMinutes; 00180 } 00181 00182 bool IsExactHourOffset () const 00183 { 00184 return IsValid () && ((fOffsetMinutes % 60) == 0); 00185 } 00186 00187 int32 ExactHourOffset () const 00188 { 00189 return fOffsetMinutes / 60; 00190 } 00191 00192 dng_string Encode_ISO_8601 () const; 00193 00194 }; 00195 00196 /*****************************************************************************/ 00197 00199 00200 class dng_date_time_info 00201 { 00202 00203 private: 00204 00205 // Is only the date valid and not the time? 00206 00207 bool fDateOnly; 00208 00209 // Date and time. 00210 00211 dng_date_time fDateTime; 00212 00213 // Subseconds string (stored in a separate tag in EXIF). 00214 00215 dng_string fSubseconds; 00216 00217 // Time zone, if known. 00218 00219 dng_time_zone fTimeZone; 00220 00221 public: 00222 00223 dng_date_time_info (); 00224 00225 bool IsValid () const; 00226 00227 bool NotValid () const 00228 { 00229 return !IsValid (); 00230 } 00231 00232 void Clear () 00233 { 00234 *this = dng_date_time_info (); 00235 } 00236 00237 const dng_date_time & DateTime () const 00238 { 00239 return fDateTime; 00240 } 00241 00242 void SetDateTime (const dng_date_time &dt) 00243 { 00244 fDateOnly = false; 00245 fDateTime = dt; 00246 } 00247 00248 const dng_string & Subseconds () const 00249 { 00250 return fSubseconds; 00251 } 00252 00253 void SetSubseconds (const dng_string &s) 00254 { 00255 fSubseconds = s; 00256 } 00257 00258 const dng_time_zone & TimeZone () const 00259 { 00260 return fTimeZone; 00261 } 00262 00263 void SetZone (const dng_time_zone &zone) 00264 { 00265 fTimeZone = zone; 00266 } 00267 00268 void Decode_ISO_8601 (const char *s); 00269 00270 dng_string Encode_ISO_8601 () const; 00271 00272 void Decode_IPTC_Date (const char *s); 00273 00274 dng_string Encode_IPTC_Date () const; 00275 00276 void Decode_IPTC_Time (const char *s); 00277 00278 dng_string Encode_IPTC_Time () const; 00279 00280 private: 00281 00282 void SetDate (uint32 year, 00283 uint32 month, 00284 uint32 day); 00285 00286 void SetTime (uint32 hour, 00287 uint32 minute, 00288 uint32 second); 00289 00290 }; 00291 00292 /*****************************************************************************/ 00293 00296 00297 void CurrentDateTimeAndZone (dng_date_time_info &info); 00298 00299 /*****************************************************************************/ 00300 00302 00303 void DecodeUnixTime (uint32 unixTime, dng_date_time &dt); 00304 00305 /*****************************************************************************/ 00306 00311 00312 dng_time_zone LocalTimeZone (const dng_date_time &dt); 00313 00314 /*****************************************************************************/ 00315 00317 00318 enum dng_date_time_format 00319 { 00320 dng_date_time_format_unknown = 0, 00321 dng_date_time_format_exif = 1, 00322 dng_date_time_format_unix_little_endian = 2, 00323 dng_date_time_format_unix_big_endian = 3 00324 }; 00325 00326 /*****************************************************************************/ 00327 00332 00333 class dng_date_time_storage_info 00334 { 00335 00336 private: 00337 00338 uint64 fOffset; 00339 00340 dng_date_time_format fFormat; 00341 00342 public: 00343 00345 00346 dng_date_time_storage_info (); 00347 00349 00350 dng_date_time_storage_info (uint64 offset, 00351 dng_date_time_format format); 00352 00355 00356 bool IsValid () const; 00357 00358 // The accessors throw if the data is not valid. 00359 00363 00364 uint64 Offset () const; 00365 00370 00371 dng_date_time_format Format () const; 00372 00373 }; 00374 00375 /*****************************************************************************/ 00376 00377 #endif 00378 00379 /*****************************************************************************/ |