1/* 2 * Copyright 2003, Axel Dörfler, axeld@pinc-software.de. 3 * Copyright 2010-2011, Oliver Tappe, zooey@hirschkaefer.de. 4 * Copyright 2012, John Scipione, jscipione@gmail.com 5 * All rights reserved. Distributed under the terms of the MIT License. 6 */ 7 8 9#include <Autolock.h> 10#include <Catalog.h> 11#include <Locale.h> 12#include <LocaleRoster.h> 13 14 15BLocale::BLocale(const BLanguage* language, 16 const BFormattingConventions* conventions) 17{ 18 if (conventions != NULL) 19 fConventions = *conventions; 20 else 21 BLocale::Default()->GetFormattingConventions(&fConventions); 22 23 if (language != NULL) 24 fLanguage = *language; 25 else 26 BLocale::Default()->GetLanguage(&fLanguage); 27} 28 29 30BLocale::BLocale(const BLocale& other) 31 : 32 fConventions(other.fConventions), 33 fLanguage(other.fLanguage) 34{ 35} 36 37 38/*static*/ const BLocale* 39BLocale::Default() 40{ 41 return BLocaleRoster::Default()->GetDefaultLocale(); 42} 43 44 45BLocale& 46BLocale::operator=(const BLocale& other) 47{ 48 if (this == &other) 49 return *this; 50 51 BAutolock lock(fLock); 52 BAutolock otherLock(other.fLock); 53 if (!lock.IsLocked() || !otherLock.IsLocked()) 54 return *this; 55 56 fConventions = other.fConventions; 57 fLanguage = other.fLanguage; 58 59 return *this; 60} 61 62 63BLocale::~BLocale() 64{ 65} 66 67 68status_t 69BLocale::GetCollator(BCollator* collator) const 70{ 71 if (!collator) 72 return B_BAD_VALUE; 73 74 BAutolock lock(fLock); 75 if (!lock.IsLocked()) 76 return B_ERROR; 77 78 *collator = fCollator; 79 80 return B_OK; 81} 82 83 84status_t 85BLocale::GetLanguage(BLanguage* language) const 86{ 87 if (!language) 88 return B_BAD_VALUE; 89 90 BAutolock lock(fLock); 91 if (!lock.IsLocked()) 92 return B_ERROR; 93 94 *language = fLanguage; 95 96 return B_OK; 97} 98 99 100status_t 101BLocale::GetFormattingConventions(BFormattingConventions* conventions) const 102{ 103 if (!conventions) 104 return B_BAD_VALUE; 105 106 BAutolock lock(fLock); 107 if (!lock.IsLocked()) 108 return B_ERROR; 109 110 *conventions = fConventions; 111 112 return B_OK; 113} 114 115 116const char * 117BLocale::GetString(uint32 id) const 118{ 119 // Note: this code assumes a certain order of the string bases 120 121 BAutolock lock(fLock); 122 if (!lock.IsLocked()) 123 return ""; 124 125 if (id >= B_OTHER_STRINGS_BASE) { 126 if (id == B_CODESET) 127 return "UTF-8"; 128 129 return ""; 130 } 131 return fLanguage.GetString(id); 132} 133 134 135void 136BLocale::SetFormattingConventions(const BFormattingConventions& conventions) 137{ 138 BAutolock lock(fLock); 139 if (!lock.IsLocked()) 140 return; 141 142 fConventions = conventions; 143} 144 145 146void 147BLocale::SetCollator(const BCollator& newCollator) 148{ 149 BAutolock lock(fLock); 150 if (!lock.IsLocked()) 151 return; 152 153 fCollator = newCollator; 154} 155 156 157void 158BLocale::SetLanguage(const BLanguage& newLanguage) 159{ 160 BAutolock lock(fLock); 161 if (!lock.IsLocked()) 162 return; 163 164 fLanguage = newLanguage; 165} 166