* Bcountry : private methods start with underscore. The timezone list isnow actually a list of BTimeZone objects, that holdsall the needed info, not only the code. Also tweak the listing code to

remove duplicatesfromthe list generated by ICU.
 * BTimeZone : remove Code, rename Name to GetName. The class is likely to change again for further optimization.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37719 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Adrien Destugues 2010-07-23 16:25:43 +00:00
parent 2774e142e1
commit 282582c005
4 changed files with 75 additions and 75 deletions

View File

@ -2,10 +2,11 @@
#define _COUNTRY_H_
#include <SupportDefs.h>
#include <List.h>
#include <LocaleStrings.h>
#include <Locker.h>
#include <String.h>
#include <SupportDefs.h>
class BBitmap;
@ -112,13 +113,13 @@ class BCountry {
virtual int32 MonFracDigits() const;
// timezones
status_t GetTimeZones(BMessage* timezones);
int GetTimeZones(BList& timezones);
private:
icu_44::DateFormat* LockDateFormatter(bool longFormat);
icu_44::DateFormat* LockTimeFormatter(bool longFormat);
void UnlockDateFormatter(bool longFormat);
void UnlockTimeFormatter(bool longFormat);
icu_44::DateFormat* _LockDateFormatter(bool longFormat);
icu_44::DateFormat* _LockTimeFormatter(bool longFormat);
void _UnlockDateFormatter(bool longFormat);
void _UnlockTimeFormatter(bool longFormat);
icu_44::DateFormat* fICULongDateFormatter;
icu_44::DateFormat* fICUShortDateFormatter;

View File

@ -19,8 +19,7 @@ class BTimeZone {
BTimeZone(const char* zoneCode);
~BTimeZone();
void Name(BString& name);
void Code(BString& code);
void GetName(BString& name);
int OffsetFromGMT();
private:

View File

@ -7,15 +7,12 @@
#include <Country.h>
#include <assert.h>
#include <iostream>
#include <stdlib.h>
#include <vector>
#include <CalendarView.h>
#include <IconUtils.h>
#include <List.h>
#include <Resources.h>
#include <String.h>
#include <TimeZone.h>
#include <unicode/datefmt.h>
#include <unicode/dcfmtsym.h>
@ -24,8 +21,13 @@
#include <unicode/smpdtfmt.h>
#include <ICUWrapper.h>
#include <assert.h>
#include <iostream>
#include <map>
#include <monetary.h>
#include <stdarg.h>
#include <stdlib.h>
#include <vector>
#define ICU_VERSION icu_44
@ -195,7 +197,7 @@ BCountry::GetIcon(BBitmap* result)
DateFormat*
BCountry::LockDateFormatter(bool longFormat)
BCountry::_LockDateFormatter(bool longFormat)
{
// TODO: ICU allows for 4 different levels of expansion :
// short, medium, long, and full. Our bool parameter is not enough...
@ -218,7 +220,7 @@ BCountry::LockDateFormatter(bool longFormat)
void
BCountry::UnlockDateFormatter(bool longFormat)
BCountry::_UnlockDateFormatter(bool longFormat)
{
if (longFormat) {
fLongDateLock.Unlock();
@ -229,7 +231,7 @@ BCountry::UnlockDateFormatter(bool longFormat)
DateFormat*
BCountry::LockTimeFormatter(bool longFormat)
BCountry::_LockTimeFormatter(bool longFormat)
{
// TODO: ICU allows for 4 different levels of expansion :
// short, medium, long, and full. Our bool parameter is not enough...
@ -252,7 +254,7 @@ BCountry::LockTimeFormatter(bool longFormat)
void
BCountry::UnlockTimeFormatter(bool longFormat)
BCountry::_UnlockTimeFormatter(bool longFormat)
{
if (longFormat) {
fLongTimeLock.Unlock();
@ -265,16 +267,16 @@ BCountry::UnlockTimeFormatter(bool longFormat)
status_t
BCountry::FormatDate(char* string, size_t maxSize, time_t time, bool longFormat)
{
ICU_VERSION::DateFormat* dateFormatter = LockDateFormatter(longFormat);
ICU_VERSION::DateFormat* dateFormatter = _LockDateFormatter(longFormat);
if (dateFormatter == NULL) {
UnlockDateFormatter(longFormat);
_UnlockDateFormatter(longFormat);
return B_NO_MEMORY;
}
UnicodeString ICUString;
ICUString = dateFormatter->format((UDate)time * 1000, ICUString);
UnlockDateFormatter(longFormat);
_UnlockDateFormatter(longFormat);
CheckedArrayByteSink stringConverter(string, maxSize);
@ -293,15 +295,15 @@ BCountry::FormatDate(BString *string, time_t time, bool longFormat)
string->Truncate(0);
// We make the string empty, this way even in cases where ICU fail we at
// least return something sane
ICU_VERSION::DateFormat* dateFormatter = LockDateFormatter(longFormat);
ICU_VERSION::DateFormat* dateFormatter = _LockDateFormatter(longFormat);
if (dateFormatter == NULL) {
UnlockDateFormatter(longFormat);
_UnlockDateFormatter(longFormat);
return B_NO_MEMORY;
}
UnicodeString ICUString;
ICUString = dateFormatter->format((UDate)time * 1000, ICUString);
UnlockDateFormatter(longFormat);
_UnlockDateFormatter(longFormat);
BStringByteSink stringConverter(string);
@ -317,9 +319,9 @@ BCountry::FormatDate(BString* string, int*& fieldPositions, int& fieldCount,
{
string->Truncate(0);
ICU_VERSION::DateFormat* dateFormatter = LockDateFormatter(longFormat);
ICU_VERSION::DateFormat* dateFormatter = _LockDateFormatter(longFormat);
if (dateFormatter == NULL) {
UnlockDateFormatter(longFormat);
_UnlockDateFormatter(longFormat);
return B_NO_MEMORY;
}
@ -329,7 +331,7 @@ BCountry::FormatDate(BString* string, int*& fieldPositions, int& fieldCount,
UnicodeString ICUString;
ICUString = dateFormatter->format((UDate)time * 1000, ICUString,
&positionIterator, error);
UnlockDateFormatter(longFormat);
_UnlockDateFormatter(longFormat);
if (error != U_ZERO_ERROR)
return B_ERROR;
@ -361,9 +363,9 @@ BCountry::DateFormat(BString& format, bool longFormat)
{
format.Truncate(0);
ICU_VERSION::DateFormat* dateFormatter = LockDateFormatter(longFormat);
ICU_VERSION::DateFormat* dateFormatter = _LockDateFormatter(longFormat);
if (dateFormatter == NULL) {
UnlockDateFormatter(longFormat);
_UnlockDateFormatter(longFormat);
return B_NO_MEMORY;
}
@ -372,7 +374,7 @@ BCountry::DateFormat(BString& format, bool longFormat)
UnicodeString ICUString;
ICUString = dateFormatterImpl->toPattern(ICUString);
UnlockDateFormatter(longFormat);
_UnlockDateFormatter(longFormat);
BStringByteSink stringConverter(&format);
@ -385,9 +387,9 @@ BCountry::DateFormat(BString& format, bool longFormat)
status_t
BCountry::SetDateFormat(const char* formatString, bool longFormat)
{
ICU_VERSION::DateFormat* dateFormatter = LockDateFormatter(longFormat);
ICU_VERSION::DateFormat* dateFormatter = _LockDateFormatter(longFormat);
if (dateFormatter == NULL) {
UnlockDateFormatter(longFormat);
_UnlockDateFormatter(longFormat);
return B_NO_MEMORY;
}
@ -396,7 +398,7 @@ BCountry::SetDateFormat(const char* formatString, bool longFormat)
UnicodeString pattern(formatString);
dateFormatterImpl->applyPattern(pattern);
UnlockDateFormatter(longFormat);
_UnlockDateFormatter(longFormat);
return B_OK;
}
@ -405,9 +407,9 @@ BCountry::SetDateFormat(const char* formatString, bool longFormat)
status_t
BCountry::DateFields(BDateElement*& fields, int& fieldCount, bool longFormat)
{
ICU_VERSION::DateFormat* dateFormatter = LockDateFormatter(longFormat);
ICU_VERSION::DateFormat* dateFormatter = _LockDateFormatter(longFormat);
if (dateFormatter == NULL) {
UnlockDateFormatter(longFormat);
_UnlockDateFormatter(longFormat);
return B_NO_MEMORY;
}
@ -418,7 +420,7 @@ BCountry::DateFields(BDateElement*& fields, int& fieldCount, bool longFormat)
time_t now;
ICUString = dateFormatter->format((UDate)time(&now) * 1000, ICUString,
&positionIterator, error);
UnlockDateFormatter(longFormat);
_UnlockDateFormatter(longFormat);
if (error != U_ZERO_ERROR)
return B_ERROR;
@ -477,15 +479,15 @@ BCountry::StartOfWeek()
status_t
BCountry::FormatTime(char* string, size_t maxSize, time_t time, bool longFormat)
{
ICU_VERSION::DateFormat* timeFormatter = LockTimeFormatter(longFormat);
ICU_VERSION::DateFormat* timeFormatter = _LockTimeFormatter(longFormat);
if (timeFormatter == NULL) {
UnlockTimeFormatter(longFormat);
_UnlockTimeFormatter(longFormat);
return B_NO_MEMORY;
}
UnicodeString ICUString;
ICUString = timeFormatter->format((UDate)time * 1000, ICUString);
UnlockTimeFormatter(longFormat);
_UnlockTimeFormatter(longFormat);
CheckedArrayByteSink stringConverter(string, maxSize);
@ -503,15 +505,15 @@ BCountry::FormatTime(BString* string, time_t time, bool longFormat)
{
string->Truncate(0);
ICU_VERSION::DateFormat* timeFormatter = LockTimeFormatter(longFormat);
ICU_VERSION::DateFormat* timeFormatter = _LockTimeFormatter(longFormat);
if (timeFormatter == NULL) {
UnlockTimeFormatter(longFormat);
_UnlockTimeFormatter(longFormat);
return B_NO_MEMORY;
}
UnicodeString ICUString;
ICUString = timeFormatter->format((UDate)time * 1000, ICUString);
UnlockTimeFormatter(longFormat);
_UnlockTimeFormatter(longFormat);
BStringByteSink stringConverter(string);
@ -527,9 +529,9 @@ BCountry::FormatTime(BString* string, int*& fieldPositions, int& fieldCount,
{
string->Truncate(0);
ICU_VERSION::DateFormat* timeFormatter = LockTimeFormatter(longFormat);
ICU_VERSION::DateFormat* timeFormatter = _LockTimeFormatter(longFormat);
if (timeFormatter == NULL) {
UnlockTimeFormatter(longFormat);
_UnlockTimeFormatter(longFormat);
return B_NO_MEMORY;
}
@ -539,7 +541,7 @@ BCountry::FormatTime(BString* string, int*& fieldPositions, int& fieldCount,
UnicodeString ICUString;
ICUString = timeFormatter->format((UDate)time * 1000, ICUString,
&positionIterator, error);
UnlockTimeFormatter(longFormat);
_UnlockTimeFormatter(longFormat);
if (error != U_ZERO_ERROR)
return B_ERROR;
@ -569,9 +571,9 @@ BCountry::FormatTime(BString* string, int*& fieldPositions, int& fieldCount,
status_t
BCountry::TimeFields(BDateElement*& fields, int& fieldCount, bool longFormat)
{
ICU_VERSION::DateFormat* timeFormatter = LockTimeFormatter(longFormat);
ICU_VERSION::DateFormat* timeFormatter = _LockTimeFormatter(longFormat);
if (timeFormatter == NULL) {
UnlockTimeFormatter(longFormat);
_UnlockTimeFormatter(longFormat);
return B_NO_MEMORY;
}
@ -582,7 +584,7 @@ BCountry::TimeFields(BDateElement*& fields, int& fieldCount, bool longFormat)
time_t now;
ICUString = timeFormatter->format((UDate)time(&now) * 1000, ICUString,
&positionIterator, error);
UnlockTimeFormatter(longFormat);
_UnlockTimeFormatter(longFormat);
if (error != U_ZERO_ERROR)
return B_ERROR;
@ -627,9 +629,9 @@ BCountry::TimeFields(BDateElement*& fields, int& fieldCount, bool longFormat)
status_t
BCountry::SetTimeFormat(const char* formatString, bool longFormat)
{
ICU_VERSION::DateFormat* timeFormatter = LockTimeFormatter(longFormat);
ICU_VERSION::DateFormat* timeFormatter = _LockTimeFormatter(longFormat);
if (timeFormatter == NULL) {
UnlockTimeFormatter(longFormat);
_UnlockTimeFormatter(longFormat);
return B_NO_MEMORY;
}
@ -638,7 +640,7 @@ BCountry::SetTimeFormat(const char* formatString, bool longFormat)
UnicodeString pattern(formatString);
dateFormatterImpl->applyPattern(pattern);
UnlockTimeFormatter(longFormat);
_UnlockTimeFormatter(longFormat);
return B_OK;
}
@ -647,9 +649,9 @@ BCountry::SetTimeFormat(const char* formatString, bool longFormat)
status_t
BCountry::TimeFormat(BString& format, bool longFormat)
{
ICU_VERSION::DateFormat* timeFormatter = LockTimeFormatter(longFormat);
ICU_VERSION::DateFormat* timeFormatter = _LockTimeFormatter(longFormat);
if (timeFormatter == NULL) {
UnlockTimeFormatter(longFormat);
_UnlockTimeFormatter(longFormat);
return B_NO_MEMORY;
}
@ -658,7 +660,7 @@ BCountry::TimeFormat(BString& format, bool longFormat)
UnicodeString ICUString;
ICUString = dateFormatterImpl->toPattern(ICUString);
UnlockTimeFormatter(longFormat);
_UnlockTimeFormatter(longFormat);
BStringByteSink stringConverter(&format);
@ -1050,26 +1052,35 @@ BCountry::MonFracDigits() const
// #pragma mark - Timezones
status_t
BCountry::GetTimeZones(BMessage* timezones)
int
BCountry::GetTimeZones(BList& timezones)
{
if (timezones == NULL)
return B_BAD_DATA;
StringEnumeration* icuTimeZoneList = TimeZone::createEnumeration(
fICULocale->getCountry());
UErrorCode error = U_ZERO_ERROR;
const char* tzName;
std::map<BString, BTimeZone*> timeZoneMap;
// The map allows us to remove duplicates and get a count of the
// remaining zones after that
while (tzName = icuTimeZoneList->next(NULL, error)) {
if (error == U_ZERO_ERROR)
timezones->AddString("zones", tzName);
else
if (error == U_ZERO_ERROR) {
BString readableName;
BTimeZone* timeZone = new BTimeZone(tzName);
timeZone->GetName(readableName);
timeZoneMap.insert(std::pair<BString, BTimeZone*>(readableName,
timeZone));
} else
error = U_ZERO_ERROR;
}
delete icuTimeZoneList;
return B_OK;
for (std::map<BString, BTimeZone*>::const_iterator timeZoneIterator
= timeZoneMap.begin(); timeZoneIterator != timeZoneMap.end();
timeZoneIterator++)
timezones.AddItem((*timeZoneIterator).second);
return timeZoneMap.size();
}

View File

@ -25,7 +25,7 @@ BTimeZone::~BTimeZone()
void
BTimeZone::Name(BString& name)
BTimeZone::GetName(BString& name)
{
UnicodeString unicodeName;
fICUTimeZone->getDisplayName(unicodeName);
@ -35,17 +35,6 @@ BTimeZone::Name(BString& name)
}
void
BTimeZone::Code(BString& code)
{
UnicodeString unicodeName;
fICUTimeZone->getID(unicodeName);
BStringByteSink converter(&code);
unicodeName.toUTF8(converter);
}
int
BTimeZone::OffsetFromGMT()
{