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