]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/i18n/windtfmt.cpp
ICU-551.51.4.tar.gz
[apple/icu.git] / icuSources / i18n / windtfmt.cpp
index 5e37e4156bca8a243a53244cd9e75695e1fa5ca5..9c9b57baf13e3098912fc69ecc9af7b0697db1ca 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ********************************************************************************
-*   Copyright (C) 2005-2007, International Business Machines
+*   Copyright (C) 2005-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 ********************************************************************************
 *
@@ -11,7 +11,7 @@
 
 #include "unicode/utypes.h"
 
-#ifdef U_WINDOWS
+#if U_PLATFORM_HAS_WIN32_API
 
 #if !UCONFIG_NO_FORMATTING
 
@@ -31,7 +31,7 @@
 #include "cmemory.h"
 #include "uresimp.h"
 #include "windtfmt.h"
-#include "wintz.h"
+#include "wintzimpl.h"
 
 #   define WIN32_LEAN_AND_MEAN
 #   define VC_EXTRALEAN
@@ -52,7 +52,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Win32DateFormat)
 
 #define STACK_BUFFER_SIZE 64
 
-UnicodeString *getTimeDateFormat(const Calendar *cal, const Locale *locale, UErrorCode &status)
+UnicodeString* Win32DateFormat::getTimeDateFormat(const Calendar *cal, const Locale *locale, UErrorCode &status) const
 {
     UnicodeString *result = NULL;
     const char *type = cal->getType();
@@ -74,7 +74,13 @@ UnicodeString *getTimeDateFormat(const Calendar *cal, const Locale *locale, UErr
     }
 
     int32_t resStrLen = 0;
-    const UChar *resStr = ures_getStringByIndex(patBundle, (int32_t)DateFormat::kDateTime, &resStrLen, &status);
+    int32_t glueIndex = DateFormat::kDateTime;
+    int32_t patSize = ures_getSize(patBundle);
+    if (patSize >= (DateFormat::kDateTimeOffset + DateFormat::kShort + 1)) {
+        // Get proper date time format
+        glueIndex = (int32_t)(DateFormat::kDateTimeOffset + (fDateStyle - DateFormat::kDateOffset));
+    }
+    const UChar *resStr = ures_getStringByIndex(patBundle, glueIndex, &resStrLen, &status);
 
     result = new UnicodeString(TRUE, resStr, resStrLen);
 
@@ -88,7 +94,7 @@ UnicodeString *getTimeDateFormat(const Calendar *cal, const Locale *locale, UErr
 
 // TODO: Range-check timeStyle, dateStyle
 Win32DateFormat::Win32DateFormat(DateFormat::EStyle timeStyle, DateFormat::EStyle dateStyle, const Locale &locale, UErrorCode &status)
-  : DateFormat(), fDateTimeMsg(NULL), fTimeStyle(timeStyle), fDateStyle(dateStyle), fLocale(&locale), fZoneID()
+  : DateFormat(), fDateTimeMsg(NULL), fTimeStyle(timeStyle), fDateStyle(dateStyle), fLocale(locale), fZoneID()
 {
     if (U_SUCCESS(status)) {
         fLCID = locale.getLCID();
@@ -118,9 +124,10 @@ Win32DateFormat &Win32DateFormat::operator=(const Win32DateFormat &other)
 
 //    delete fCalendar;
 
-    this->fDateTimeMsg = other.fDateTimeMsg;
+    this->fDateTimeMsg = other.fDateTimeMsg == NULL ? NULL : new UnicodeString(*other.fDateTimeMsg);
     this->fTimeStyle   = other.fTimeStyle;
     this->fDateStyle   = other.fDateStyle;
+    this->fLocale      = other.fLocale;
     this->fLCID        = other.fLCID;
 //    this->fCalendar    = other.fCalendar->clone();
     this->fZoneID      = other.fZoneID;
@@ -172,7 +179,7 @@ UnicodeString &Win32DateFormat::format(Calendar &cal, UnicodeString &appendTo, F
         timeDateArray[1].adoptString(date);
 
         if (strcmp(fCalendar->getType(), cal.getType()) != 0) {
-            pattern = getTimeDateFormat(&cal, fLocale, status);
+            pattern = getTimeDateFormat(&cal, &fLocale, status);
         }
 
         MessageFormat::format(*pattern, timeDateArray, 2, appendTo, status);
@@ -197,7 +204,7 @@ void Win32DateFormat::adoptCalendar(Calendar *newCalendar)
 
         if (fDateStyle != DateFormat::kNone && fTimeStyle != DateFormat::kNone) {
             delete fDateTimeMsg;
-            fDateTimeMsg = getTimeDateFormat(newCalendar, fLocale, status);
+            fDateTimeMsg = getTimeDateFormat(newCalendar, &fLocale, status);
         }
     }
 
@@ -311,5 +318,5 @@ U_NAMESPACE_END
 
 #endif /* #if !UCONFIG_NO_FORMATTING */
 
-#endif // #ifdef U_WINDOWS
+#endif // U_PLATFORM_HAS_WIN32_API