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()
41{
42	MutableLocaleRoster::Default()->UnloadCatalog(fCatalogData);
43}
44
45
46const char*
47BCatalog::GetString(const char* string, const char* context,
48	const char* comment)
49{
50	BAutolock lock(&fLock);
51	if (!lock.IsLocked())
52		return string;
53
54	const char* translated;
55	for (BCatalogData* cat = fCatalogData; cat != NULL; cat = cat->fNext) {
56		translated = cat->GetString(string, context, comment);
57		if (translated != NULL)
58			return translated;
59	}
60
61	return string;
62}
63
64
65const char*
66BCatalog::GetString(uint32 id)
67{
68	BAutolock lock(&fLock);
69	if (!lock.IsLocked())
70		return "";
71
72	const char* translated;
73	for (BCatalogData* cat = fCatalogData; cat != NULL; cat = cat->fNext) {
74		translated = cat->GetString(id);
75		if (translated != NULL)
76			return translated;
77	}
78
79	return "";
80}
81
82
83status_t
84BCatalog::GetData(const char* name, BMessage* msg)
85{
86	BAutolock lock(&fLock);
87	if (!lock.IsLocked())
88		return B_ERROR;
89
90	if (fCatalogData == NULL)
91		return B_NO_INIT;
92
93	status_t res;
94	for (BCatalogData* cat = fCatalogData; cat != NULL; cat = cat->fNext) {
95		res = cat->GetData(name, msg);
96		if (res != B_NAME_NOT_FOUND && res != EOPNOTSUPP)
97			return res;	// return B_OK if found, or specific error-code
98	}
99
100	return B_NAME_NOT_FOUND;
101}
102
103
104status_t
105BCatalog::GetData(uint32 id, BMessage* msg)
106{
107	BAutolock lock(&fLock);
108	if (!lock.IsLocked())
109		return B_ERROR;
110
111	if (fCatalogData == NULL)
112		return B_NO_INIT;
113
114	status_t res;
115	for (BCatalogData* cat = fCatalogData; cat != NULL; cat = cat->fNext) {
116		res = cat->GetData(id, msg);
117		if (res != B_NAME_NOT_FOUND && res != EOPNOTSUPP)
118			return res;	// return B_OK if found, or specific error-code
119	}
120
121	return B_NAME_NOT_FOUND;
122}
123
124
125status_t
126BCatalog::GetSignature(BString* sig)
127{
128	BAutolock lock(&fLock);
129	if (!lock.IsLocked())
130		return B_ERROR;
131
132	if (sig == NULL)
133		return B_BAD_VALUE;
134
135	if (fCatalogData == NULL)
136		return B_NO_INIT;
137
138	*sig = fCatalogData->fSignature;
139
140	return B_OK;
141}
142
143
144status_t
145BCatalog::GetLanguage(BString* lang)
146{
147	BAutolock lock(&fLock);
148	if (!lock.IsLocked())
149		return B_ERROR;
150
151	if (lang == NULL)
152		return B_BAD_VALUE;
153
154	if (fCatalogData == NULL)
155		return B_NO_INIT;
156
157	*lang = fCatalogData->fLanguageName;
158
159	return B_OK;
160}
161
162
163status_t
164BCatalog::GetFingerprint(uint32* fp)
165{
166	BAutolock lock(&fLock);
167	if (!lock.IsLocked())
168		return B_ERROR;
169
170	if (fp == NULL)
171		return B_BAD_VALUE;
172
173	if (fCatalogData == NULL)
174		return B_NO_INIT;
175
176	*fp = fCatalogData->fFingerprint;
177
178	return B_OK;
179}
180
181
182status_t
183BCatalog::SetTo(const entry_ref& catalogOwner, const char* language,
184	uint32 fingerprint)
185{
186	BAutolock lock(&fLock);
187	if (!lock.IsLocked())
188		return B_ERROR;
189
190	MutableLocaleRoster::Default()->UnloadCatalog(fCatalogData);
191	fCatalogData = MutableLocaleRoster::Default()->LoadCatalog(catalogOwner,
192		language, fingerprint);
193
194	return B_OK;
195}
196
197
198status_t
199BCatalog::InitCheck() const
200{
201	BAutolock lock(&fLock);
202	if (!lock.IsLocked())
203		return B_ERROR;
204
205	return fCatalogData != NULL	? fCatalogData->InitCheck() : B_NO_INIT;
206}
207
208
209int32
210BCatalog::CountItems() const
211{
212	BAutolock lock(&fLock);
213	if (!lock.IsLocked())
214		return 0;
215
216	return fCatalogData != NULL ? fCatalogData->CountItems() : 0;
217}
218