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