xref: /haiku/src/tools/locale/Catalog.cpp (revision 3be9edf8da228afd9fec0390f408c964766122aa)
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