• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /********************************************************************
2  * COPYRIGHT:
3  * Copyright (c) 1997-2010, International Business Machines Corporation and
4  * others. All Rights Reserved.
5  ********************************************************************/
6 /*
7 * File CALTZTST.H
8 *
9 * Modification History:
10 *
11 *   Date        Name        Description
12 *   08/06/97    aliu        Creation.
13 ********************************************************************************
14 */
15 
16 #include "unicode/utypes.h"
17 
18 #if !UCONFIG_NO_FORMATTING
19 
20 #include "caltztst.h"
21 #include "unicode/smpdtfmt.h"
22 #include "mutex.h"
23 
24 DateFormat*         CalendarTimeZoneTest::fgDateFormat = 0;
25 Calendar*           CalendarTimeZoneTest::fgCalendar   = 0;
26 
failure(UErrorCode status,const char * msg,UBool possibleDataError)27 UBool CalendarTimeZoneTest::failure(UErrorCode status, const char* msg, UBool possibleDataError)
28 {
29     if (U_FAILURE(status))
30     {
31         if (possibleDataError) {
32             dataerrln(UnicodeString("FAIL: ") + msg + " failed, error " + u_errorName(status));
33         } else {
34             errcheckln(status, UnicodeString("FAIL: ") + msg + " failed, error " + u_errorName(status));
35         }
36         return TRUE;
37     }
38     return FALSE;
39 }
40 
getDateFormat()41 DateFormat*   CalendarTimeZoneTest::getDateFormat()
42 {
43     DateFormat *theFormat = 0;
44 
45     if (fgDateFormat != 0) // if there's something in the cache
46     {
47         Mutex lock;
48 
49         if (fgDateFormat != 0) // Someone might have grabbed it.
50         {
51             theFormat = fgDateFormat;
52             fgDateFormat = 0; // We have exclusive right to this formatter.
53         }
54     }
55 
56     if(theFormat == 0) // If we weren't able to pull it out of the cache, then we have to create it.
57     {
58         UErrorCode status = U_ZERO_ERROR;
59         theFormat = new SimpleDateFormat(UnicodeString("EEE MMM dd HH:mm:ss zzz yyyy"), status);
60         if (U_FAILURE(status))
61         {
62             delete theFormat;
63             theFormat = 0;
64             dataerrln("FAIL: Could not create SimpleDateFormat - %s", u_errorName(status));
65         }
66     }
67 
68     return theFormat;
69 }
70 
releaseDateFormat(DateFormat * adopt)71 void CalendarTimeZoneTest::releaseDateFormat(DateFormat *adopt)
72 {
73     if(fgDateFormat == 0) // If the cache is empty we must add it back.
74     {
75         Mutex lock;
76 
77         if(fgDateFormat == 0)
78         {
79             fgDateFormat = adopt;
80             adopt = 0;
81         }
82     }
83     else {
84         delete adopt;
85     }
86 }
87 
getCalendar()88 Calendar*  CalendarTimeZoneTest::getCalendar()
89 {
90     Calendar *theCalendar = 0;
91 
92     if (fgCalendar != 0) // if there's something in the cache
93     {
94         Mutex lock;
95 
96         if (fgCalendar != 0) // Someone might have grabbed it.
97         {
98             theCalendar = fgCalendar;
99             fgCalendar = 0; // We have exclusive right to this calendar.
100         }
101     }
102 
103     if(theCalendar == 0) // If we weren't able to pull it out of the cache, then we have to create it.
104     {
105         UErrorCode status = U_ZERO_ERROR;
106         theCalendar = Calendar::createInstance(status);
107         if (U_FAILURE(status))
108         {
109             delete theCalendar;
110             theCalendar = 0;
111             dataerrln("FAIL: Calendar::createInstance failed: %s", u_errorName(status));
112         }
113     }
114     return theCalendar;
115 }
116 
releaseCalendar(Calendar * adopt)117 void CalendarTimeZoneTest::releaseCalendar(Calendar* adopt)
118 {
119     if(fgCalendar == 0) // If the cache is empty we must add it back.
120     {
121         Mutex lock;
122 
123         if(fgCalendar == 0)
124         {
125             fgCalendar = adopt;
126             adopt = 0;
127         }
128     }
129     else
130     {
131         delete adopt;
132     }
133 }
134 
135 // Utility method for formatting dates for printing; useful for Java->C++ conversion.
136 // Tries to mimic the Java Date.toString() format.
137 UnicodeString
dateToString(UDate d)138 CalendarTimeZoneTest::dateToString(UDate d)
139 {
140     UnicodeString str;
141     return dateToString(d, str);
142 }
143 
144 UnicodeString&
dateToString(UDate d,UnicodeString & str)145 CalendarTimeZoneTest::dateToString(UDate d, UnicodeString& str)
146 {
147     str.remove();
148     DateFormat* format = getDateFormat();
149     if (format == 0)
150     {
151         str += "DATE_FORMAT_FAILURE";
152         return str;
153     }
154     format->format(d, str);
155     releaseDateFormat(format);
156     return str;
157 }
158 
159 UnicodeString&
dateToString(UDate d,UnicodeString & str,const TimeZone & tz)160 CalendarTimeZoneTest::dateToString(UDate d, UnicodeString& str,
161                                    const TimeZone& tz)
162 {
163     str.remove();
164     DateFormat* format = getDateFormat();
165     if (format == 0)
166     {
167         str += "DATE_FORMAT_FAILURE";
168         return str;
169     }
170     TimeZone* save = format->getTimeZone().clone();
171     format->setTimeZone(tz);
172     format->format(d, str);
173     format->adoptTimeZone(save);
174     releaseDateFormat(format);
175     return str;
176 }
177 
178 // Utility methods to create a date.  This is useful for converting Java constructs
179 // which create a Date object.
180 UDate
date(int32_t y,int32_t m,int32_t d,int32_t hr,int32_t min,int32_t sec)181 CalendarTimeZoneTest::date(int32_t y, int32_t m, int32_t d, int32_t hr, int32_t min, int32_t sec)
182 {
183     Calendar* cal = getCalendar();
184     if (cal == 0) return 0.0;
185     cal->clear();
186     cal->set(1900 + y, m, d, hr, min, sec); // Add 1900 to follow java.util.Date protocol
187     UErrorCode status = U_ZERO_ERROR;
188     UDate dt = cal->getTime(status);
189     releaseCalendar(cal);
190     if (U_FAILURE(status))
191     {
192         errln("FAIL: Calendar::getTime failed: %s", u_errorName(status));
193         return 0.0;
194     }
195     return dt;
196 }
197 
198 // Utility methods to create a date.  The returned Date is UTC rather than local.
199 /*Date
200 CalendarTimeZoneTest::utcDate(int32_t y, int32_t m, int32_t d, int32_t hr, int32_t min, int32_t sec)
201 {
202     Calendar* cal = getCalendar();
203     if (cal == 0) return 0.0;
204     UErrorCode status = U_ZERO_ERROR;
205     Date dt = date(y, m, d, hr, min, sec) +
206         cal->get(Calendar::ZONE_OFFSET, status) -
207         cal->get(Calendar::DST_OFFSET, status);
208     releaseCalendar(cal);
209     if (U_FAILURE(status))
210     {
211         errln("FAIL: Calendar::get failed");
212         return 0.0;
213     }
214     return dt;
215 }*/
216 
217 // Mimics Date.getYear() etc.
218 void
dateToFields(UDate date,int32_t & y,int32_t & m,int32_t & d,int32_t & hr,int32_t & min,int32_t & sec)219 CalendarTimeZoneTest::dateToFields(UDate date, int32_t& y, int32_t& m, int32_t& d, int32_t& hr, int32_t& min, int32_t& sec)
220 {
221     Calendar* cal = getCalendar();
222     if (cal == 0) return;
223     UErrorCode status = U_ZERO_ERROR;
224     cal->setTime(date, status);
225     y = cal->get(UCAL_YEAR, status) - 1900;
226     m = cal->get(UCAL_MONTH, status);
227     d = cal->get(UCAL_DATE, status);
228     hr = cal->get(UCAL_HOUR_OF_DAY, status);
229     min = cal->get(UCAL_MINUTE, status);
230     sec = cal->get(UCAL_SECOND, status);
231     releaseCalendar(cal);
232 }
233 
cleanup()234 void CalendarTimeZoneTest::cleanup()
235 {
236     delete fgDateFormat;
237     fgDateFormat = 0;
238     delete fgCalendar;
239     fgCalendar   = 0;
240 }
241 
242 #endif /* #if !UCONFIG_NO_FORMATTING */
243 
244 //eof
245