xref: /haiku/src/kits/locale/Catalog.cpp (revision 72cee743c2dc402e9e91893e1b59c5b32a21a12d)
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