1 /* 2 ** Distributed under the terms of the OpenBeOS License. 3 ** Copyright 2003-2004. All rights reserved. 4 ** 5 ** Authors: Axel Dörfler, axeld@pinc-software.de 6 ** Oliver Tappe, zooey@hirschkaefer.de 7 */ 8 9 #include <syslog.h> 10 11 #include <Application.h> 12 #include <Catalog.h> 13 #include <Locale.h> 14 #include <LocaleRoster.h> 15 #include <Node.h> 16 #include <Roster.h> 17 18 19 BCatalog* be_catalog = NULL; 20 // catalog used by translation macros 21 BCatalog* be_app_catalog = NULL; 22 // app-catalog (useful for accessing app's catalog from inside an add-on, 23 // since in an add-on, be_catalog will hold the add-on's catalog. 24 25 26 //#pragma mark - BCatalog 27 BCatalog::BCatalog() 28 : 29 fCatalog(NULL) 30 { 31 } 32 33 34 BCatalog::BCatalog(const char *signature, const char *language, 35 uint32 fingerprint) 36 { 37 //fCatalog = be_locale_roster->LoadCatalog(signature, language, fingerprint); 38 } 39 40 41 BCatalog::~BCatalog() 42 { 43 if (be_catalog == this) 44 be_app_catalog = be_catalog = NULL; 45 //be_locale_roster->UnloadCatalog(fCatalog); 46 } 47 48 49 const char * 50 BCatalog::GetString(const char *string, const char *context, const char *comment) 51 { 52 const char *translated; 53 for (BCatalogAddOn* cat = fCatalog; cat != NULL; cat = cat->fNext) { 54 translated = cat->GetString(string, context, comment); 55 if (translated) 56 return translated; 57 } 58 return string; 59 } 60 61 62 const char * 63 BCatalog::GetString(uint32 id) 64 { 65 const char *translated; 66 for (BCatalogAddOn* cat = fCatalog; cat != NULL; cat = cat->fNext) { 67 translated = cat->GetString(id); 68 if (translated) 69 return translated; 70 } 71 return ""; 72 } 73 74 75 status_t 76 BCatalog::GetData(const char *name, BMessage *msg) 77 { 78 if (!fCatalog) 79 return B_NO_INIT; 80 status_t res; 81 for (BCatalogAddOn* cat = fCatalog; cat != NULL; cat = cat->fNext) { 82 res = cat->GetData(name, msg); 83 if (res != B_NAME_NOT_FOUND && res != EOPNOTSUPP) 84 return res; 85 // return B_OK if found, or specific error-code 86 } 87 return B_NAME_NOT_FOUND; 88 } 89 90 91 status_t 92 BCatalog::GetData(uint32 id, BMessage *msg) 93 { 94 if (!fCatalog) 95 return B_NO_INIT; 96 status_t res; 97 for (BCatalogAddOn* cat = fCatalog; cat != NULL; cat = cat->fNext) { 98 res = cat->GetData(id, msg); 99 if (res != B_NAME_NOT_FOUND && res != EOPNOTSUPP) 100 return res; 101 // return B_OK if found, or specific error-code 102 } 103 return B_NAME_NOT_FOUND; 104 } 105 106 107 status_t 108 BCatalog::GetAppCatalog(BCatalog* catalog) 109 { 110 return B_NOT_SUPPORTED; 111 } 112 113 114 //#pragma mark - BCatalogAddOn 115 BCatalogAddOn::BCatalogAddOn(const char *signature, const char *language, 116 uint32 fingerprint) 117 : 118 fInitCheck(B_NO_INIT), 119 fSignature(signature), 120 fLanguageName(language), 121 fFingerprint(fingerprint), 122 fNext(NULL) 123 { 124 fLanguageName.ToLower(); 125 // canonicalize language-name to lowercase 126 } 127 128 129 BCatalogAddOn::~BCatalogAddOn() 130 { 131 } 132 133 134 void 135 BCatalogAddOn::UpdateFingerprint() 136 { 137 fFingerprint = 0; 138 // base implementation always yields the same fingerprint, 139 // which means that no version-mismatch detection is possible. 140 } 141 142 143 status_t 144 BCatalogAddOn::InitCheck() const 145 { 146 return fInitCheck; 147 } 148 149 150 bool 151 BCatalogAddOn::CanHaveData() const 152 { 153 return false; 154 } 155 156 157 status_t 158 BCatalogAddOn::GetData(const char *name, BMessage *msg) 159 { 160 return EOPNOTSUPP; 161 } 162 163 164 status_t 165 BCatalogAddOn::GetData(uint32 id, BMessage *msg) 166 { 167 return EOPNOTSUPP; 168 } 169 170 171 status_t 172 BCatalogAddOn::SetString(const char *string, const char *translated, 173 const char *context, const char *comment) 174 { 175 return EOPNOTSUPP; 176 } 177 178 179 status_t 180 BCatalogAddOn::SetString(int32 id, const char *translated) 181 { 182 return EOPNOTSUPP; 183 } 184 185 186 bool 187 BCatalogAddOn::CanWriteData() const 188 { 189 return false; 190 } 191 192 193 status_t 194 BCatalogAddOn::SetData(const char *name, BMessage *msg) 195 { 196 return EOPNOTSUPP; 197 } 198 199 200 status_t 201 BCatalogAddOn::SetData(uint32 id, BMessage *msg) 202 { 203 return EOPNOTSUPP; 204 } 205 206 207 status_t 208 BCatalogAddOn::ReadFromFile(const char *path) 209 { 210 return EOPNOTSUPP; 211 } 212 213 214 status_t 215 BCatalogAddOn::ReadFromAttribute(entry_ref *appOrAddOnRef) 216 { 217 return EOPNOTSUPP; 218 } 219 220 221 status_t 222 BCatalogAddOn::ReadFromResource(entry_ref *appOrAddOnRef) 223 { 224 return EOPNOTSUPP; 225 } 226 227 228 status_t 229 BCatalogAddOn::WriteToFile(const char *path) 230 { 231 return EOPNOTSUPP; 232 } 233 234 235 status_t 236 BCatalogAddOn::WriteToAttribute(entry_ref *appOrAddOnRef) 237 { 238 return EOPNOTSUPP; 239 } 240 241 242 status_t 243 BCatalogAddOn::WriteToResource(entry_ref *appOrAddOnRef) 244 { 245 return EOPNOTSUPP; 246 } 247 248 249 void BCatalogAddOn::MakeEmpty() 250 { 251 } 252 253 254 int32 255 BCatalogAddOn::CountItems() const 256 { 257 return 0; 258 } 259 260 261 //#pragma mark - EditableCatalog 262 namespace BPrivate { 263 EditableCatalog::EditableCatalog(const char *type, const char *signature, 264 const char *language) 265 { 266 //fCatalog = be_locale_roster->CreateCatalog(type, signature, language); 267 } 268 269 270 EditableCatalog::~EditableCatalog() 271 { 272 } 273 274 275 status_t 276 EditableCatalog::SetString(const char *string, const char *translated, 277 const char *context, const char *comment) 278 { 279 if (!fCatalog) 280 return B_NO_INIT; 281 return fCatalog->SetString(string, translated, context, comment); 282 } 283 284 285 status_t 286 EditableCatalog::SetString(int32 id, const char *translated) 287 { 288 if (!fCatalog) 289 return B_NO_INIT; 290 return fCatalog->SetString(id, translated); 291 } 292 293 294 bool 295 EditableCatalog::CanWriteData() const 296 { 297 if (!fCatalog) 298 return false; 299 return fCatalog->CanWriteData(); 300 } 301 302 303 status_t 304 EditableCatalog::SetData(const char *name, BMessage *msg) 305 { 306 if (!fCatalog) 307 return B_NO_INIT; 308 return fCatalog->SetData(name, msg); 309 } 310 311 312 status_t 313 EditableCatalog::SetData(uint32 id, BMessage *msg) 314 { 315 if (!fCatalog) 316 return B_NO_INIT; 317 return fCatalog->SetData(id, msg); 318 } 319 320 321 status_t 322 EditableCatalog::ReadFromFile(const char *path) 323 { 324 if (!fCatalog) 325 return B_NO_INIT; 326 return fCatalog->ReadFromFile(path); 327 } 328 329 330 status_t 331 EditableCatalog::ReadFromAttribute(entry_ref *appOrAddOnRef) 332 { 333 if (!fCatalog) 334 return B_NO_INIT; 335 return fCatalog->ReadFromAttribute(appOrAddOnRef); 336 } 337 338 339 status_t 340 EditableCatalog::ReadFromResource(entry_ref *appOrAddOnRef) 341 { 342 if (!fCatalog) 343 return B_NO_INIT; 344 return fCatalog->ReadFromResource(appOrAddOnRef); 345 } 346 347 348 status_t 349 EditableCatalog::WriteToFile(const char *path) 350 { 351 if (!fCatalog) 352 return B_NO_INIT; 353 return fCatalog->WriteToFile(path); 354 } 355 356 357 status_t 358 EditableCatalog::WriteToAttribute(entry_ref *appOrAddOnRef) 359 { 360 if (!fCatalog) 361 return B_NO_INIT; 362 return fCatalog->WriteToAttribute(appOrAddOnRef); 363 } 364 365 366 status_t 367 EditableCatalog::WriteToResource(entry_ref *appOrAddOnRef) 368 { 369 if (!fCatalog) 370 return B_NO_INIT; 371 return fCatalog->WriteToResource(appOrAddOnRef); 372 } 373 374 375 void EditableCatalog::MakeEmpty() 376 { 377 if (fCatalog) 378 fCatalog->MakeEmpty(); 379 } 380 381 382 } // namespace BPrivate 383