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