1 /*
2 *******************************************************************************
3 * Copyright (C) 2015, International Business Machines
4 * Corporation and others.  All Rights Reserved.
5 *******************************************************************************
6 * resource.h
7 *
8 * created on: 2015nov04
9 * created by: Markus W. Scherer
10 */
11 
12 #ifndef __URESOURCE_H__
13 #define __URESOURCE_H__
14 
15 /**
16  * \file
17  * \brief ICU resource bundle key and value types.
18  */
19 
20 // Note: Ported from ICU4J class UResource and its nested classes,
21 // but the C++ classes are separate, not nested.
22 
23 // We use the Resource prefix for C++ classes, as usual.
24 // The UResource prefix would be used for C types.
25 
26 #include "unicode/utypes.h"
27 #include "unicode/unistr.h"
28 #include "unicode/ures.h"
29 
30 U_NAMESPACE_BEGIN
31 
32 class ResourceTableSink;
33 
34 // Note: In C++, we use const char * pointers for keys,
35 // rather than an abstraction like Java UResource.Key.
36 
37 /**
38  * Represents a resource bundle item's value.
39  * Avoids object creations as much as possible.
40  * Mutable, not thread-safe.
41  */
42 class U_COMMON_API ResourceValue : public UObject {
43 public:
44     virtual ~ResourceValue();
45 
46     /**
47      * @return ICU resource type, for example, URES_STRING
48      */
49     virtual UResType getType() const = 0;
50 
51     /**
52      * Sets U_RESOURCE_TYPE_MISMATCH if this is not a string resource.
53      *
54      * @see ures_getString()
55      */
56     virtual const UChar *getString(int32_t &length, UErrorCode &errorCode) const = 0;
57 
getUnicodeString(UErrorCode & errorCode)58     inline UnicodeString getUnicodeString(UErrorCode &errorCode) const {
59         int32_t len = 0;
60         const UChar *r = getString(len, errorCode);
61         return UnicodeString(TRUE, r, len);
62     }
63 
64     /**
65      * Sets U_RESOURCE_TYPE_MISMATCH if this is not an alias resource.
66      */
67     virtual const UChar *getAliasString(int32_t &length, UErrorCode &errorCode) const = 0;
68 
getAliasUnicodeString(UErrorCode & errorCode)69     inline UnicodeString getAliasUnicodeString(UErrorCode &errorCode) const {
70         int32_t len = 0;
71         const UChar *r = getAliasString(len, errorCode);
72         return UnicodeString(TRUE, r, len);
73     }
74 
75     /**
76      * Sets U_RESOURCE_TYPE_MISMATCH if this is not an integer resource.
77      *
78      * @see ures_getInt()
79      */
80     virtual int32_t getInt(UErrorCode &errorCode) const = 0;
81 
82     /**
83      * Sets U_RESOURCE_TYPE_MISMATCH if this is not an integer resource.
84      *
85      * @see ures_getUInt()
86      */
87     virtual uint32_t getUInt(UErrorCode &errorCode) const = 0;
88 
89     /**
90      * Sets U_RESOURCE_TYPE_MISMATCH if this is not an intvector resource.
91      *
92      * @see ures_getIntVector()
93      */
94     virtual const int32_t *getIntVector(int32_t &length, UErrorCode &errorCode) const = 0;
95 
96     /**
97      * Sets U_RESOURCE_TYPE_MISMATCH if this is not a binary-blob resource.
98      *
99      * @see ures_getBinary()
100      */
101     virtual const uint8_t *getBinary(int32_t &length, UErrorCode &errorCode) const = 0;
102 
103 protected:
ResourceValue()104     ResourceValue() {}
105 
106 private:
107     ResourceValue(const ResourceValue &);  // no copy constructor
108     ResourceValue &operator=(const ResourceValue &);  // no assignment operator
109 };
110 
111 /**
112  * Sink for ICU resource array contents.
113  * The base class does nothing.
114  *
115  * Nested arrays and tables are stored as nested sinks,
116  * never put() as ResourceValue items.
117  */
118 class U_COMMON_API ResourceArraySink : public UObject {
119 public:
ResourceArraySink()120     ResourceArraySink() {}
121     virtual ~ResourceArraySink();
122 
123     /**
124      * Adds a value from a resource array.
125      *
126      * @param index of the resource array item
127      * @param value resource value
128      */
129     virtual void put(int32_t index, const ResourceValue &value, UErrorCode &errorCode);
130 
131     /**
132      * Returns a nested resource array at the array index as another sink.
133      * Creates the sink if none exists for the key.
134      * Returns NULL if nested arrays are not supported.
135      * The default implementation always returns NULL.
136      *
137      * This sink (not the caller) owns the nested sink.
138      *
139      * @param index of the resource array item
140      * @param size number of array items
141      * @return nested-array sink, or NULL
142      */
143     virtual ResourceArraySink *getOrCreateArraySink(
144             int32_t index, int32_t size, UErrorCode &errorCode);
145 
146     /**
147      * Returns a nested resource table at the array index as another sink.
148      * Creates the sink if none exists for the key.
149      * Returns NULL if nested tables are not supported.
150      * The default implementation always returns NULL.
151      *
152      * This sink (not the caller) owns the nested sink.
153      *
154      * @param index of the resource array item
155      * @param initialSize size hint for creating the sink if necessary
156      * @return nested-table sink, or NULL
157      */
158     virtual ResourceTableSink *getOrCreateTableSink(
159             int32_t index, int32_t initialSize, UErrorCode &errorCode);
160 
161     /**
162      * "Leaves" the array.
163      * Indicates that all of the resources and sub-resources of the current array
164      * have been enumerated.
165      */
166     virtual void leave(UErrorCode &errorCode);
167 
168 private:
169     ResourceArraySink(const ResourceArraySink &);  // no copy constructor
170     ResourceArraySink &operator=(const ResourceArraySink &);  // no assignment operator
171 };
172 
173 /**
174  * Sink for ICU resource table contents.
175  * The base class does nothing.
176  *
177  * Nested arrays and tables are stored as nested sinks,
178  * never put() as ResourceValue items.
179  */
180 class U_COMMON_API ResourceTableSink : public UObject {
181 public:
ResourceTableSink()182     ResourceTableSink() {}
183     virtual ~ResourceTableSink();
184 
185     /**
186      * Adds a key-value pair from a resource table.
187      *
188      * @param key resource key string
189      * @param value resource value
190      */
191     virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode);
192 
193     /**
194      * Adds a no-fallback/no-inheritance marker for this key.
195      * Used for CLDR no-fallback data values of (three empty-set symbols)=={2205, 2205, 2205}
196      * when enumerating tables with fallback from the specific resource bundle to root.
197      *
198      * The default implementation does nothing.
199      *
200      * @param key to be removed
201      */
202     virtual void putNoFallback(const char *key, UErrorCode &errorCode);
203 
204     /**
205      * Returns a nested resource array for the key as another sink.
206      * Creates the sink if none exists for the key.
207      * Returns NULL if nested arrays are not supported.
208      * The default implementation always returns NULL.
209      *
210      * This sink (not the caller) owns the nested sink.
211      *
212      * @param key resource key string
213      * @param size number of array items
214      * @return nested-array sink, or NULL
215      */
216     virtual ResourceArraySink *getOrCreateArraySink(
217             const char *key, int32_t size, UErrorCode &errorCode);
218 
219     /**
220      * Returns a nested resource table for the key as another sink.
221      * Creates the sink if none exists for the key.
222      * Returns NULL if nested tables are not supported.
223      * The default implementation always returns NULL.
224      *
225      * This sink (not the caller) owns the nested sink.
226      *
227      * @param key resource key string
228      * @param initialSize size hint for creating the sink if necessary
229      * @return nested-table sink, or NULL
230      */
231     virtual ResourceTableSink *getOrCreateTableSink(
232             const char *key, int32_t initialSize, UErrorCode &errorCode);
233 
234     /**
235      * "Leaves" the table.
236      * Indicates that all of the resources and sub-resources of the current table
237      * have been enumerated.
238      */
239     virtual void leave(UErrorCode &errorCode);
240 
241 private:
242     ResourceTableSink(const ResourceTableSink &);  // no copy constructor
243     ResourceTableSink &operator=(const ResourceTableSink &);  // no assignment operator
244 };
245 
246 U_NAMESPACE_END
247 
248 #endif
249