]>
Commit | Line | Data |
---|---|---|
b75a7d8f A |
1 | /******************************************************************** |
2 | * COPYRIGHT: | |
374ca955 | 3 | * Copyright (c) 2002-2004, International Business Machines Corporation and |
b75a7d8f A |
4 | * others. All Rights Reserved. |
5 | ********************************************************************/ | |
6 | ||
7 | /* Created by weiv 05/09/2002 */ | |
8 | ||
374ca955 | 9 | #include "unicode/datamap.h" |
b75a7d8f | 10 | #include "unicode/resbund.h" |
374ca955 | 11 | #include "hash.h" |
b75a7d8f A |
12 | #include <stdlib.h> |
13 | ||
14 | int32_t | |
15 | DataMap::utoi(const UnicodeString &s) const | |
16 | { | |
17 | char ch[256]; | |
18 | const UChar *u = s.getBuffer(); | |
19 | int32_t len = s.length(); | |
20 | u_UCharsToChars(u, ch, len); | |
21 | ch[len] = 0; /* include terminating \0 */ | |
22 | return atoi(ch); | |
23 | } | |
24 | ||
25 | U_CDECL_BEGIN | |
26 | void U_CALLCONV | |
27 | deleteResBund(void *obj) { | |
28 | delete (ResourceBundle *)obj; | |
29 | } | |
30 | U_CDECL_END | |
31 | ||
32 | ||
33 | RBDataMap::~RBDataMap() | |
34 | { | |
35 | delete fData; | |
36 | } | |
37 | ||
38 | RBDataMap::RBDataMap() | |
39 | { | |
40 | UErrorCode status = U_ZERO_ERROR; | |
41 | fData = new Hashtable(TRUE, status); | |
42 | fData->setValueDeleter(deleteResBund); | |
43 | } | |
44 | ||
45 | // init from table resource | |
46 | // will put stuff in hashtable according to | |
47 | // keys. | |
48 | RBDataMap::RBDataMap(UResourceBundle *data, UErrorCode &status) | |
49 | { | |
50 | fData = new Hashtable(TRUE, status); | |
51 | fData->setValueDeleter(deleteResBund); | |
52 | init(data, status); | |
53 | } | |
54 | ||
55 | // init from headers and resource | |
56 | // with checking the whether the size of resource matches | |
57 | // header size | |
58 | RBDataMap::RBDataMap(UResourceBundle *headers, UResourceBundle *data, UErrorCode &status) | |
59 | { | |
60 | fData = new Hashtable(TRUE, status); | |
61 | fData->setValueDeleter(deleteResBund); | |
62 | init(headers, data, status); | |
63 | } | |
64 | ||
65 | ||
66 | void RBDataMap::init(UResourceBundle *data, UErrorCode &status) { | |
67 | int32_t i = 0; | |
68 | fData->removeAll(); | |
69 | UResourceBundle *t = NULL; | |
70 | for(i = 0; i < ures_getSize(data); i++) { | |
71 | t = ures_getByIndex(data, i, t, &status); | |
72 | fData->put(UnicodeString(ures_getKey(t), ""), new ResourceBundle(t, status), status); | |
73 | } | |
74 | ures_close(t); | |
75 | } | |
76 | ||
77 | void RBDataMap::init(UResourceBundle *headers, UResourceBundle *data, UErrorCode &status) | |
78 | { | |
79 | int32_t i = 0; | |
80 | fData->removeAll(); | |
81 | UResourceBundle *t = NULL; | |
82 | const UChar *key = NULL; | |
83 | int32_t keyLen = 0; | |
84 | if(ures_getSize(headers) == ures_getSize(data)) { | |
85 | for(i = 0; i < ures_getSize(data); i++) { | |
86 | t = ures_getByIndex(data, i, t, &status); | |
87 | key = ures_getStringByIndex(headers, i, &keyLen, &status); | |
88 | fData->put(UnicodeString(key, keyLen), new ResourceBundle(t, status), status); | |
89 | } | |
90 | } else { | |
91 | // error | |
92 | status = U_INVALID_FORMAT_ERROR; | |
93 | } | |
94 | ures_close(t); | |
95 | } | |
96 | ||
374ca955 | 97 | const ResourceBundle *RBDataMap::getItem(const char* key, UErrorCode &status) const |
b75a7d8f | 98 | { |
374ca955 A |
99 | if(U_FAILURE(status)) { |
100 | return NULL; | |
101 | } | |
102 | ||
b75a7d8f | 103 | UnicodeString hashKey(key, ""); |
374ca955 | 104 | const ResourceBundle *r = (ResourceBundle *)fData->get(hashKey); |
b75a7d8f | 105 | if(r != NULL) { |
374ca955 A |
106 | return r; |
107 | } else { | |
108 | status = U_MISSING_RESOURCE_ERROR; | |
109 | return NULL; | |
110 | } | |
111 | } | |
112 | ||
113 | const UnicodeString RBDataMap::getString(const char* key, UErrorCode &status) const | |
114 | { | |
115 | const ResourceBundle *r = getItem(key, status); | |
116 | if(U_SUCCESS(status)) { | |
b75a7d8f A |
117 | return r->getString(status); |
118 | } else { | |
119 | status = U_MISSING_RESOURCE_ERROR; | |
374ca955 A |
120 | return UnicodeString(); |
121 | } | |
122 | } | |
123 | ||
124 | int32_t | |
125 | RBDataMap::getInt28(const char* key, UErrorCode &status) const | |
126 | { | |
127 | const ResourceBundle *r = getItem(key, status); | |
128 | if(U_SUCCESS(status)) { | |
129 | return r->getInt(status); | |
130 | } else { | |
131 | return 0; | |
132 | } | |
133 | } | |
134 | ||
135 | uint32_t | |
136 | RBDataMap::getUInt28(const char* key, UErrorCode &status) const | |
137 | { | |
138 | const ResourceBundle *r = getItem(key, status); | |
139 | if(U_SUCCESS(status)) { | |
140 | return r->getUInt(status); | |
141 | } else { | |
142 | return 0; | |
b75a7d8f A |
143 | } |
144 | } | |
145 | ||
374ca955 A |
146 | const int32_t * |
147 | RBDataMap::getIntVector(int32_t &length, const char *key, UErrorCode &status) const { | |
148 | const ResourceBundle *r = getItem(key, status); | |
149 | if(U_SUCCESS(status)) { | |
150 | return r->getIntVector(length, status); | |
151 | } else { | |
152 | return NULL; | |
153 | } | |
154 | } | |
155 | ||
156 | const uint8_t * | |
157 | RBDataMap::getBinary(int32_t &length, const char *key, UErrorCode &status) const { | |
158 | const ResourceBundle *r = getItem(key, status); | |
159 | if(U_SUCCESS(status)) { | |
160 | return r->getBinary(length, status); | |
161 | } else { | |
162 | return NULL; | |
163 | } | |
164 | } | |
b75a7d8f A |
165 | |
166 | int32_t RBDataMap::getInt(const char* key, UErrorCode &status) const | |
167 | { | |
b75a7d8f A |
168 | UnicodeString r = this->getString(key, status); |
169 | if(U_SUCCESS(status)) { | |
374ca955 A |
170 | return utoi(r); |
171 | } else { | |
172 | return 0; | |
b75a7d8f | 173 | } |
b75a7d8f A |
174 | } |
175 | ||
176 | const UnicodeString* RBDataMap::getStringArray(int32_t& count, const char* key, UErrorCode &status) const | |
177 | { | |
374ca955 A |
178 | const ResourceBundle *r = getItem(key, status); |
179 | if(U_SUCCESS(status)) { | |
b75a7d8f A |
180 | int32_t i = 0; |
181 | ||
182 | count = r->getSize(); | |
374ca955 A |
183 | if(count <= 0) { |
184 | return NULL; | |
185 | } | |
186 | ||
b75a7d8f A |
187 | UnicodeString *result = new UnicodeString[count]; |
188 | for(i = 0; i<count; i++) { | |
189 | result[i] = r->getStringEx(i, status); | |
190 | } | |
191 | return result; | |
192 | } else { | |
193 | status = U_MISSING_RESOURCE_ERROR; | |
194 | return NULL; | |
195 | } | |
196 | } | |
197 | ||
198 | const int32_t* RBDataMap::getIntArray(int32_t& count, const char* key, UErrorCode &status) const | |
199 | { | |
374ca955 A |
200 | const ResourceBundle *r = getItem(key, status); |
201 | if(U_SUCCESS(status)) { | |
b75a7d8f A |
202 | int32_t i = 0; |
203 | ||
204 | count = r->getSize(); | |
374ca955 A |
205 | if(count <= 0) { |
206 | return NULL; | |
207 | } | |
208 | ||
b75a7d8f A |
209 | int32_t *result = new int32_t[count]; |
210 | UnicodeString stringRes; | |
211 | for(i = 0; i<count; i++) { | |
212 | stringRes = r->getStringEx(i, status); | |
213 | result[i] = utoi(stringRes); | |
214 | } | |
215 | return result; | |
216 | } else { | |
217 | status = U_MISSING_RESOURCE_ERROR; | |
218 | return NULL; | |
219 | } | |
220 | } |