• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4 *******************************************************************************
5 * Copyright (C) 2015-2016, International Business Machines
6 * Corporation and others.  All Rights Reserved.
7 *******************************************************************************
8 * resource.h
9 *
10 * created on: 2015nov04
11 * created by: Markus W. Scherer
12 */
13 
14 #ifndef __URESOURCE_H__
15 #define __URESOURCE_H__
16 
17 /**
18  * \file
19  * \brief ICU resource bundle key and value types.
20  */
21 
22 // Note: Ported from ICU4J class UResource and its nested classes,
23 // but the C++ classes are separate, not nested.
24 
25 // We use the Resource prefix for C++ classes, as usual.
26 // The UResource prefix would be used for C types.
27 
28 #include "unicode/utypes.h"
29 #include "unicode/unistr.h"
30 #include "unicode/ures.h"
31 
32 struct ResourceData;
33 
34 U_NAMESPACE_BEGIN
35 
36 class ResourceValue;
37 
38 // Note: In C++, we use const char * pointers for keys,
39 // rather than an abstraction like Java UResource.Key.
40 
41 /**
42  * Interface for iterating over a resource bundle array resource.
43  */
44 class U_COMMON_API ResourceArray {
45 public:
46     /** Constructs an empty array object. */
ResourceArray()47     ResourceArray() : items16(NULL), items32(NULL), length(0) {}
48 
49     /** Only for implementation use. @internal */
ResourceArray(const uint16_t * i16,const uint32_t * i32,int32_t len)50     ResourceArray(const uint16_t *i16, const uint32_t *i32, int32_t len) :
51             items16(i16), items32(i32), length(len) {}
52 
53     /**
54      * @return The number of items in the array resource.
55      */
getSize()56     int32_t getSize() const { return length; }
57     /**
58      * @param i Array item index.
59      * @param value Output-only, receives the value of the i'th item.
60      * @return TRUE if i is non-negative and less than getSize().
61      */
62     UBool getValue(int32_t i, ResourceValue &value) const;
63 
64     /** Only for implementation use. @internal */
65     uint32_t internalGetResource(const ResourceData *pResData, int32_t i) const;
66 
67 private:
68     const uint16_t *items16;
69     const uint32_t *items32;
70     int32_t length;
71 };
72 
73 /**
74  * Interface for iterating over a resource bundle table resource.
75  */
76 class U_COMMON_API ResourceTable {
77 public:
78     /** Constructs an empty table object. */
ResourceTable()79     ResourceTable() : keys16(NULL), keys32(NULL), items16(NULL), items32(NULL), length(0) {}
80 
81     /** Only for implementation use. @internal */
ResourceTable(const uint16_t * k16,const int32_t * k32,const uint16_t * i16,const uint32_t * i32,int32_t len)82     ResourceTable(const uint16_t *k16, const int32_t *k32,
83                   const uint16_t *i16, const uint32_t *i32, int32_t len) :
84             keys16(k16), keys32(k32), items16(i16), items32(i32), length(len) {}
85 
86     /**
87      * @return The number of items in the array resource.
88      */
getSize()89     int32_t getSize() const { return length; }
90     /**
91      * @param i Array item index.
92      * @param key Output-only, receives the key of the i'th item.
93      * @param value Output-only, receives the value of the i'th item.
94      * @return TRUE if i is non-negative and less than getSize().
95      */
96     UBool getKeyAndValue(int32_t i, const char *&key, ResourceValue &value) const;
97 
98 private:
99     const uint16_t *keys16;
100     const int32_t *keys32;
101     const uint16_t *items16;
102     const uint32_t *items32;
103     int32_t length;
104 };
105 
106 /**
107  * Represents a resource bundle item's value.
108  * Avoids object creations as much as possible.
109  * Mutable, not thread-safe.
110  */
111 class U_COMMON_API ResourceValue : public UObject {
112 public:
113     virtual ~ResourceValue();
114 
115     /**
116      * @return ICU resource type, for example, URES_STRING
117      */
118     virtual UResType getType() const = 0;
119 
120     /**
121      * Sets U_RESOURCE_TYPE_MISMATCH if this is not a string resource.
122      *
123      * @see ures_getString()
124      */
125     virtual const UChar *getString(int32_t &length, UErrorCode &errorCode) const = 0;
126 
getUnicodeString(UErrorCode & errorCode)127     inline UnicodeString getUnicodeString(UErrorCode &errorCode) const {
128         int32_t len = 0;
129         const UChar *r = getString(len, errorCode);
130         return UnicodeString(TRUE, r, len);
131     }
132 
133     /**
134      * Sets U_RESOURCE_TYPE_MISMATCH if this is not an alias resource.
135      */
136     virtual const UChar *getAliasString(int32_t &length, UErrorCode &errorCode) const = 0;
137 
getAliasUnicodeString(UErrorCode & errorCode)138     inline UnicodeString getAliasUnicodeString(UErrorCode &errorCode) const {
139         int32_t len = 0;
140         const UChar *r = getAliasString(len, errorCode);
141         return UnicodeString(TRUE, r, len);
142     }
143 
144     /**
145      * Sets U_RESOURCE_TYPE_MISMATCH if this is not an integer resource.
146      *
147      * @see ures_getInt()
148      */
149     virtual int32_t getInt(UErrorCode &errorCode) const = 0;
150 
151     /**
152      * Sets U_RESOURCE_TYPE_MISMATCH if this is not an integer resource.
153      *
154      * @see ures_getUInt()
155      */
156     virtual uint32_t getUInt(UErrorCode &errorCode) const = 0;
157 
158     /**
159      * Sets U_RESOURCE_TYPE_MISMATCH if this is not an intvector resource.
160      *
161      * @see ures_getIntVector()
162      */
163     virtual const int32_t *getIntVector(int32_t &length, UErrorCode &errorCode) const = 0;
164 
165     /**
166      * Sets U_RESOURCE_TYPE_MISMATCH if this is not a binary-blob resource.
167      *
168      * @see ures_getBinary()
169      */
170     virtual const uint8_t *getBinary(int32_t &length, UErrorCode &errorCode) const = 0;
171 
172     /**
173      * Sets U_RESOURCE_TYPE_MISMATCH if this is not an array resource
174      */
175     virtual ResourceArray getArray(UErrorCode &errorCode) const = 0;
176 
177     /**
178      * Sets U_RESOURCE_TYPE_MISMATCH if this is not a table resource
179      */
180     virtual ResourceTable getTable(UErrorCode &errorCode) const = 0;
181 
182     /**
183      * Is this a no-fallback/no-inheritance marker string?
184      * Such a marker is used for
185      * CLDR no-fallback data values of (three empty-set symbols)=={2205, 2205, 2205}
186      * when enumerating tables with fallback from the specific resource bundle to root.
187      *
188      * @return TRUE if this is a no-inheritance marker string
189      */
190     virtual UBool isNoInheritanceMarker() const = 0;
191 
192     /**
193      * Sets the dest strings from the string values in this array resource.
194      *
195      * @return the number of strings in this array resource.
196      *     If greater than capacity, then an overflow error is set.
197      *
198      * Sets U_RESOURCE_TYPE_MISMATCH if this is not an array resource
199      *     or if any of the array items is not a string
200      */
201     virtual int32_t getStringArray(UnicodeString *dest, int32_t capacity,
202                                    UErrorCode &errorCode) const = 0;
203 
204     /**
205      * Same as
206      * <pre>
207      * if (getType() == URES_STRING) {
208      *     return new String[] { getString(); }
209      * } else {
210      *     return getStringArray();
211      * }
212      * </pre>
213      *
214      * Sets U_RESOURCE_TYPE_MISMATCH if this is
215      *     neither a string resource nor an array resource containing strings
216      * @see getString()
217      * @see getStringArray()
218      */
219     virtual int32_t getStringArrayOrStringAsArray(UnicodeString *dest, int32_t capacity,
220                                                   UErrorCode &errorCode) const = 0;
221 
222     /**
223      * Same as
224      * <pre>
225      * if (getType() == URES_STRING) {
226      *     return getString();
227      * } else {
228      *     return getStringArray()[0];
229      * }
230      * </pre>
231      *
232      * Sets U_RESOURCE_TYPE_MISMATCH if this is
233      *     neither a string resource nor an array resource containing strings
234      * @see getString()
235      * @see getStringArray()
236      */
237     virtual UnicodeString getStringOrFirstOfArray(UErrorCode &errorCode) const = 0;
238 
239 protected:
ResourceValue()240     ResourceValue() {}
241 
242 private:
243     ResourceValue(const ResourceValue &);  // no copy constructor
244     ResourceValue &operator=(const ResourceValue &);  // no assignment operator
245 };
246 
247 /**
248  * Sink for ICU resource bundle contents.
249  */
250 class U_COMMON_API ResourceSink : public UObject {
251 public:
ResourceSink()252     ResourceSink() {}
253     virtual ~ResourceSink();
254 
255     /**
256      * Called once for each bundle (child-parent-...-root).
257      * The value is normally an array or table resource,
258      * and implementations of this method normally iterate over the
259      * tree of resource items stored there.
260      *
261      * @param key The key string of the enumeration-start resource.
262      *     Empty if the enumeration starts at the top level of the bundle.
263      * @param value Call getArray() or getTable() as appropriate.
264      *     Then reuse for output values from Array and Table getters.
265      * @param noFallback true if the bundle has no parent;
266      *     that is, its top-level table has the nofallback attribute,
267      *     or it is the root bundle of a locale tree.
268      */
269     virtual void put(const char *key, ResourceValue &value, UBool noFallback,
270                      UErrorCode &errorCode) = 0;
271 
272 private:
273     ResourceSink(const ResourceSink &);  // no copy constructor
274     ResourceSink &operator=(const ResourceSink &);  // no assignment operator
275 };
276 
277 U_NAMESPACE_END
278 
279 #endif
280