• Home
  • History
  • Annotate
  • 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