1 /* 2 * Copyright 2003-2004, Axel Dörfler, axeld@pinc-software.de 3 * Copyright 2003-2004,2012, Oliver Tappe, zooey@hirschkaefer.de 4 * Distributed under the terms of the MIT License. 5 */ 6 7 #include <Catalog.h> 8 9 #include <syslog.h> 10 11 #include <Application.h> 12 #include <Autolock.h> 13 #include <CatalogData.h> 14 #include <Locale.h> 15 #include <MutableLocaleRoster.h> 16 #include <Node.h> 17 #include <Roster.h> 18 19 20 using BPrivate::MutableLocaleRoster; 21 22 23 //#pragma mark - BCatalog 24 BCatalog::BCatalog() 25 : 26 fCatalogData(NULL), 27 fLock("Catalog") 28 { 29 } 30 31 32 BCatalog::BCatalog(const entry_ref& catalogOwner, const char* language, 33 uint32 fingerprint) 34 : 35 fCatalogData(NULL), 36 fLock("Catalog") 37 { 38 SetTo(catalogOwner, language, fingerprint); 39 } 40 41 42 BCatalog::~BCatalog() 43 { 44 MutableLocaleRoster::Default()->UnloadCatalog(fCatalogData); 45 } 46 47 48 const char* 49 BCatalog::GetString(const char* string, const char* context, 50 const char* comment) 51 { 52 BAutolock lock(&fLock); 53 if (!lock.IsLocked()) 54 return string; 55 56 const char* translated; 57 for (BCatalogData* cat = fCatalogData; cat != NULL; cat = cat->fNext) { 58 translated = cat->GetString(string, context, comment); 59 if (translated != NULL) 60 return translated; 61 } 62 63 return string; 64 } 65 66 67 const char* 68 BCatalog::GetString(uint32 id) 69 { 70 BAutolock lock(&fLock); 71 if (!lock.IsLocked()) 72 return ""; 73 74 const char* translated; 75 for (BCatalogData* cat = fCatalogData; cat != NULL; cat = cat->fNext) { 76 translated = cat->GetString(id); 77 if (translated != NULL) 78 return translated; 79 } 80 81 return ""; 82 } 83 84 85 status_t 86 BCatalog::GetData(const char* name, BMessage* msg) 87 { 88 BAutolock lock(&fLock); 89 if (!lock.IsLocked()) 90 return B_ERROR; 91 92 if (fCatalogData == NULL) 93 return B_NO_INIT; 94 95 status_t res; 96 for (BCatalogData* cat = fCatalogData; cat != NULL; cat = cat->fNext) { 97 res = cat->GetData(name, msg); 98 if (res != B_NAME_NOT_FOUND && res != EOPNOTSUPP) 99 return res; // return B_OK if found, or specific error-code 100 } 101 102 return B_NAME_NOT_FOUND; 103 } 104 105 106 status_t 107 BCatalog::GetData(uint32 id, BMessage* msg) 108 { 109 BAutolock lock(&fLock); 110 if (!lock.IsLocked()) 111 return B_ERROR; 112 113 if (fCatalogData == NULL) 114 return B_NO_INIT; 115 116 status_t res; 117 for (BCatalogData* cat = fCatalogData; cat != NULL; cat = cat->fNext) { 118 res = cat->GetData(id, msg); 119 if (res != B_NAME_NOT_FOUND && res != EOPNOTSUPP) 120 return res; // return B_OK if found, or specific error-code 121 } 122 123 return B_NAME_NOT_FOUND; 124 } 125 126 127 status_t 128 BCatalog::GetSignature(BString* sig) 129 { 130 BAutolock lock(&fLock); 131 if (!lock.IsLocked()) 132 return B_ERROR; 133 134 if (sig == NULL) 135 return B_BAD_VALUE; 136 137 if (fCatalogData == NULL) 138 return B_NO_INIT; 139 140 *sig = fCatalogData->fSignature; 141 142 return B_OK; 143 } 144 145 146 status_t 147 BCatalog::GetLanguage(BString* lang) 148 { 149 BAutolock lock(&fLock); 150 if (!lock.IsLocked()) 151 return B_ERROR; 152 153 if (lang == NULL) 154 return B_BAD_VALUE; 155 156 if (fCatalogData == NULL) 157 return B_NO_INIT; 158 159 *lang = fCatalogData->fLanguageName; 160 161 return B_OK; 162 } 163 164 165 status_t 166 BCatalog::GetFingerprint(uint32* fp) 167 { 168 BAutolock lock(&fLock); 169 if (!lock.IsLocked()) 170 return B_ERROR; 171 172 if (fp == NULL) 173 return B_BAD_VALUE; 174 175 if (fCatalogData == NULL) 176 return B_NO_INIT; 177 178 *fp = fCatalogData->fFingerprint; 179 180 return B_OK; 181 } 182 183 184 status_t 185 BCatalog::SetTo(const entry_ref& catalogOwner, const char* language, 186 uint32 fingerprint) 187 { 188 BAutolock lock(&fLock); 189 if (!lock.IsLocked()) 190 return B_ERROR; 191 192 MutableLocaleRoster::Default()->UnloadCatalog(fCatalogData); 193 fCatalogData = MutableLocaleRoster::Default()->LoadCatalog(catalogOwner, 194 language, fingerprint); 195 196 return B_OK; 197 } 198 199 200 status_t 201 BCatalog::InitCheck() const 202 { 203 BAutolock lock(&fLock); 204 if (!lock.IsLocked()) 205 return B_ERROR; 206 207 return fCatalogData != NULL ? fCatalogData->InitCheck() : B_NO_INIT; 208 } 209 210 211 int32 212 BCatalog::CountItems() const 213 { 214 BAutolock lock(&fLock); 215 if (!lock.IsLocked()) 216 return 0; 217 218 return fCatalogData != NULL ? fCatalogData->CountItems() : 0; 219 } 220