• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 ******************************************************************************
3 *
4 *   Copyright (C) 1996-2007, International Business Machines Corporation
5 *   and others.  All Rights Reserved.
6 *
7 ******************************************************************************
8 *
9 * File resbund.h
10 *
11 *   CREATED BY
12 *       Richard Gillam
13 *
14 * Modification History:
15 *
16 *   Date        Name        Description
17 *   2/5/97      aliu        Added scanForLocaleInFile.  Added
18 *                           constructor which attempts to read resource bundle
19 *                           from a specific file, without searching other files.
20 *   2/11/97     aliu        Added UErrorCode return values to constructors.  Fixed
21 *                           infinite loops in scanForFile and scanForLocale.
22 *                           Modified getRawResourceData to not delete storage
23 *                           in localeData and resourceData which it doesn't own.
24 *                           Added Mac compatibility #ifdefs for tellp() and
25 *                           ios::nocreate.
26 *   2/18/97     helena      Updated with 100% documentation coverage.
27 *   3/13/97     aliu        Rewrote to load in entire resource bundle and store
28 *                           it as a Hashtable of ResourceBundleData objects.
29 *                           Added state table to govern parsing of files.
30 *                           Modified to load locale index out of new file
31 *                           distinct from default.txt.
32 *   3/25/97     aliu        Modified to support 2-d arrays, needed for timezone
33 *                           data. Added support for custom file suffixes.  Again,
34 *                           needed to support timezone data.
35 *   4/7/97      aliu        Cleaned up.
36 * 03/02/99      stephen     Removed dependency on FILE*.
37 * 03/29/99      helena      Merged Bertrand and Stephen's changes.
38 * 06/11/99      stephen     Removed parsing of .txt files.
39 *                           Reworked to use new binary format.
40 *                           Cleaned up.
41 * 06/14/99      stephen     Removed methods taking a filename suffix.
42 * 11/09/99      weiv        Added getLocale(), fRealLocale, removed fRealLocaleID
43 ******************************************************************************
44 */
45 
46 #ifndef RESBUND_H
47 #define RESBUND_H
48 
49 #include "unicode/utypes.h"
50 #include "unicode/uobject.h"
51 #include "unicode/ures.h"
52 #include "unicode/unistr.h"
53 #include "unicode/locid.h"
54 
55 /**
56  * \file
57  * \brief C++ API: Resource Bundle
58  */
59 
60 U_NAMESPACE_BEGIN
61 
62 /**
63  * A class representing a collection of resource information pertaining to a given
64  * locale. A resource bundle provides a way of accessing locale- specfic information in
65  * a data file. You create a resource bundle that manages the resources for a given
66  * locale and then ask it for individual resources.
67  * <P>
68  * Resource bundles in ICU4C are currently defined using text files which conform to the following
69  * <a href="http://source.icu-project.org/repos/icu/icuhtml/trunk/design/bnf_rb.txt">BNF definition</a>.
70  * More on resource bundle concepts and syntax can be found in the
71  * <a href="http://icu-project.org/userguide/ResourceManagement.html">Users Guide</a>.
72  * <P>
73  *
74  * The ResourceBundle class is not suitable for subclassing.
75  *
76  * @stable ICU 2.0
77  */
78 class U_COMMON_API ResourceBundle : public UObject {
79 public:
80     /**
81      * Constructor
82      *
83      * @param packageName   The packageName and locale together point to an ICU udata object,
84      *                      as defined by <code> udata_open( packageName, "res", locale, err) </code>
85      *                      or equivalent.  Typically, packageName will refer to a (.dat) file, or to
86      *                      a package registered with udata_setAppData(). Using a full file or directory
87      *                      pathname for packageName is deprecated.
88      * @param locale  This is the locale this resource bundle is for. To get resources
89      *                for the French locale, for example, you would create a
90      *                ResourceBundle passing Locale::FRENCH for the "locale" parameter,
91      *                and all subsequent calls to that resource bundle will return
92      *                resources that pertain to the French locale. If the caller doesn't
93      *                pass a locale parameter, the default locale for the system (as
94      *                returned by Locale::getDefault()) will be used.
95      * @param err     The Error Code.
96      * The UErrorCode& err parameter is used to return status information to the user. To
97      * check whether the construction succeeded or not, you should check the value of
98      * U_SUCCESS(err). If you wish more detailed information, you can check for
99      * informational error results which still indicate success. U_USING_FALLBACK_WARNING
100      * indicates that a fall back locale was used. For example, 'de_CH' was requested,
101      * but nothing was found there, so 'de' was used. U_USING_DEFAULT_WARNING indicates that
102      * the default locale data was used; neither the requested locale nor any of its
103      * fall back locales could be found.
104      * @stable ICU 2.0
105      */
106     ResourceBundle(const UnicodeString&    packageName,
107                    const Locale&           locale,
108                    UErrorCode&              err);
109 
110     /**
111      * Construct a resource bundle for the default bundle in the specified package.
112      *
113      * @param packageName   The packageName and locale together point to an ICU udata object,
114      *                      as defined by <code> udata_open( packageName, "res", locale, err) </code>
115      *                      or equivalent.  Typically, packageName will refer to a (.dat) file, or to
116      *                      a package registered with udata_setAppData(). Using a full file or directory
117      *                      pathname for packageName is deprecated.
118      * @param err A UErrorCode value
119      * @stable ICU 2.0
120      */
121     ResourceBundle(const UnicodeString&    packageName,
122                    UErrorCode&              err);
123 
124     /**
125      * Construct a resource bundle for the ICU default bundle.
126      *
127      * @param err A UErrorCode value
128      * @stable ICU 2.0
129      */
130     ResourceBundle(UErrorCode &err);
131 
132     /**
133      * Standard constructor, onstructs a resource bundle for the locale-specific
134      * bundle in the specified package.
135      *
136      * @param packageName   The packageName and locale together point to an ICU udata object,
137      *                      as defined by <code> udata_open( packageName, "res", locale, err) </code>
138      *                      or equivalent.  Typically, packageName will refer to a (.dat) file, or to
139      *                      a package registered with udata_setAppData(). Using a full file or directory
140      *                      pathname for packageName is deprecated.
141      *                      NULL is used to refer to ICU data.
142      * @param locale The locale for which to open a resource bundle.
143      * @param err A UErrorCode value
144      * @stable ICU 2.0
145      */
146     ResourceBundle(const char* packageName,
147                    const Locale& locale,
148                    UErrorCode& err);
149 
150     /**
151      * Copy constructor.
152      *
153      * @param original The resource bundle to copy.
154      * @stable ICU 2.0
155      */
156     ResourceBundle(const ResourceBundle &original);
157 
158     /**
159      * Constructor from a C UResourceBundle. The resource bundle is
160      * copied and not adopted. ures_close will still need to be used on the
161      * original resource bundle.
162      *
163      * @param res A pointer to the C resource bundle.
164      * @param status A UErrorCode value.
165      * @stable ICU 2.0
166      */
167     ResourceBundle(UResourceBundle *res,
168                    UErrorCode &status);
169 
170     /**
171      * Assignment operator.
172      *
173      * @param other The resource bundle to copy.
174      * @stable ICU 2.0
175      */
176     ResourceBundle&
177       operator=(const ResourceBundle& other);
178 
179     /** Destructor.
180      * @stable ICU 2.0
181      */
182     virtual ~ResourceBundle();
183 
184     /**
185      * Clone this object.
186      * Clones can be used concurrently in multiple threads.
187      * If an error occurs, then NULL is returned.
188      * The caller must delete the clone.
189      *
190      * @return a clone of this object
191      *
192      * @see getDynamicClassID
193      * @stable ICU 2.8
194      */
195     ResourceBundle *clone() const;
196 
197     /**
198      * Returns the size of a resource. Size for scalar types is always 1, and for vector/table types is
199      * the number of child resources.
200      * @warning Integer array is treated as a scalar type. There are no
201      *          APIs to access individual members of an integer array. It
202      *          is always returned as a whole.
203      *
204      * @return number of resources in a given resource.
205      * @stable ICU 2.0
206      */
207     int32_t
208       getSize(void) const;
209 
210     /**
211      * returns a string from a string resource type
212      *
213      * @param status  fills in the outgoing error code
214      *                could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found
215      *                could be a warning
216      *                e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT>
217      * @return a pointer to a zero-terminated UChar array which lives in a memory mapped/DLL file.
218      * @stable ICU 2.0
219      */
220     UnicodeString
221       getString(UErrorCode& status) const;
222 
223     /**
224      * returns a binary data from a resource. Can be used at most primitive resource types (binaries,
225      * strings, ints)
226      *
227      * @param len     fills in the length of resulting byte chunk
228      * @param status  fills in the outgoing error code
229      *                could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found
230      *                could be a warning
231      *                e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT>
232      * @return a pointer to a chunk of unsigned bytes which live in a memory mapped/DLL file.
233      * @stable ICU 2.0
234      */
235     const uint8_t*
236       getBinary(int32_t& len, UErrorCode& status) const;
237 
238 
239     /**
240      * returns an integer vector from a resource.
241      *
242      * @param len     fills in the length of resulting integer vector
243      * @param status  fills in the outgoing error code
244      *                could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found
245      *                could be a warning
246      *                e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT>
247      * @return a pointer to a vector of integers that lives in a memory mapped/DLL file.
248      * @stable ICU 2.0
249      */
250     const int32_t*
251       getIntVector(int32_t& len, UErrorCode& status) const;
252 
253     /**
254      * returns an unsigned integer from a resource.
255      * This integer is originally 28 bits.
256      *
257      * @param status  fills in the outgoing error code
258      *                could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found
259      *                could be a warning
260      *                e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT>
261      * @return an unsigned integer value
262      * @stable ICU 2.0
263      */
264     uint32_t
265       getUInt(UErrorCode& status) const;
266 
267     /**
268      * returns a signed integer from a resource.
269      * This integer is originally 28 bit and the sign gets propagated.
270      *
271      * @param status  fills in the outgoing error code
272      *                could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found
273      *                could be a warning
274      *                e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT>
275      * @return a signed integer value
276      * @stable ICU 2.0
277      */
278     int32_t
279       getInt(UErrorCode& status) const;
280 
281     /**
282      * Checks whether the resource has another element to iterate over.
283      *
284      * @return TRUE if there are more elements, FALSE if there is no more elements
285      * @stable ICU 2.0
286      */
287     UBool
288       hasNext(void) const;
289 
290     /**
291      * Resets the internal context of a resource so that iteration starts from the first element.
292      *
293      * @stable ICU 2.0
294      */
295     void
296       resetIterator(void);
297 
298     /**
299      * Returns the key associated with this resource. Not all the resources have a key - only
300      * those that are members of a table.
301      *
302      * @return a key associated to this resource, or NULL if it doesn't have a key
303      * @stable ICU 2.0
304      */
305     const char*
306       getKey(void) const;
307 
308     /**
309      * Gets the locale ID of the resource bundle as a string.
310      * Same as getLocale().getName() .
311      *
312      * @return the locale ID of the resource bundle as a string
313      * @stable ICU 2.0
314      */
315     const char*
316       getName(void) const;
317 
318 
319     /**
320      * Returns the type of a resource. Available types are defined in enum UResType
321      *
322      * @return type of the given resource.
323      * @stable ICU 2.0
324      */
325     UResType
326       getType(void) const;
327 
328     /**
329      * Returns the next resource in a given resource or NULL if there are no more resources
330      *
331      * @param status            fills in the outgoing error code
332      * @return                  ResourceBundle object.
333      * @stable ICU 2.0
334      */
335     ResourceBundle
336       getNext(UErrorCode& status);
337 
338     /**
339      * Returns the next string in a resource or NULL if there are no more resources
340      * to iterate over.
341      *
342      * @param status            fills in the outgoing error code
343      * @return an UnicodeString object.
344      * @stable ICU 2.0
345      */
346     UnicodeString
347       getNextString(UErrorCode& status);
348 
349     /**
350      * Returns the next string in a resource or NULL if there are no more resources
351      * to iterate over.
352      *
353      * @param key               fill in for key associated with this string
354      * @param status            fills in the outgoing error code
355      * @return an UnicodeString object.
356      * @stable ICU 2.0
357      */
358     UnicodeString
359       getNextString(const char ** key,
360                     UErrorCode& status);
361 
362     /**
363      * Returns the resource in a resource at the specified index.
364      *
365      * @param index             an index to the wanted resource.
366      * @param status            fills in the outgoing error code
367      * @return                  ResourceBundle object. If there is an error, resource is invalid.
368      * @stable ICU 2.0
369      */
370     ResourceBundle
371       get(int32_t index,
372           UErrorCode& status) const;
373 
374     /**
375      * Returns the string in a given resource at the specified index.
376      *
377      * @param index             an index to the wanted string.
378      * @param status            fills in the outgoing error code
379      * @return                  an UnicodeString object. If there is an error, string is bogus
380      * @stable ICU 2.0
381      */
382     UnicodeString
383       getStringEx(int32_t index,
384                   UErrorCode& status) const;
385 
386     /**
387      * Returns a resource in a resource that has a given key. This procedure works only with table
388      * resources.
389      *
390      * @param key               a key associated with the wanted resource
391      * @param status            fills in the outgoing error code.
392      * @return                  ResourceBundle object. If there is an error, resource is invalid.
393      * @stable ICU 2.0
394      */
395     ResourceBundle
396       get(const char* key,
397           UErrorCode& status) const;
398 
399     /**
400      * Returns a string in a resource that has a given key. This procedure works only with table
401      * resources.
402      *
403      * @param key               a key associated with the wanted string
404      * @param status            fills in the outgoing error code
405      * @return                  an UnicodeString object. If there is an error, string is bogus
406      * @stable ICU 2.0
407      */
408     UnicodeString
409       getStringEx(const char* key,
410                   UErrorCode& status) const;
411 
412     /**
413      * Return the version number associated with this ResourceBundle as a string. Please
414      * use getVersion, as this method is going to be deprecated.
415      *
416      * @return  A version number string as specified in the resource bundle or its parent.
417      *          The caller does not own this string.
418      * @see getVersion
419      * @deprecated ICU 2.8 Use getVersion instead.
420      */
421     const char*
422       getVersionNumber(void) const;
423 
424     /**
425      * Return the version number associated with this ResourceBundle as a UVersionInfo array.
426      *
427      * @param versionInfo A UVersionInfo array that is filled with the version number
428      *                    as specified in the resource bundle or its parent.
429      * @stable ICU 2.0
430      */
431     void
432       getVersion(UVersionInfo versionInfo) const;
433 
434     /**
435      * Return the Locale associated with this ResourceBundle.
436      *
437      * @return a Locale object
438      * @deprecated ICU 2.8 Use getLocale(ULocDataLocaleType type, UErrorCode &status) overload instead.
439      */
440     const Locale&
441       getLocale(void) const;
442 
443     /**
444      * Return the Locale associated with this ResourceBundle.
445      * @param type You can choose between requested, valid and actual
446      *             locale. For description see the definition of
447      *             ULocDataLocaleType in uloc.h
448      * @param status just for catching illegal arguments
449      *
450      * @return a Locale object
451      * @stable ICU 2.8
452      */
453     const Locale
454       getLocale(ULocDataLocaleType type, UErrorCode &status) const;
455     /**
456      * This API implements multilevel fallback
457      * @internal
458      */
459     ResourceBundle
460         getWithFallback(const char* key, UErrorCode& status);
461     /**
462      * ICU "poor man's RTTI", returns a UClassID for the actual class.
463      *
464      * @stable ICU 2.2
465      */
466     virtual UClassID getDynamicClassID() const;
467 
468     /**
469      * ICU "poor man's RTTI", returns a UClassID for this class.
470      *
471      * @stable ICU 2.2
472      */
473     static UClassID U_EXPORT2 getStaticClassID();
474 
475 private:
476     ResourceBundle(); // default constructor not implemented
477 
478     UResourceBundle *fResource;
479     void constructForLocale(const UnicodeString& path, const Locale& locale, UErrorCode& error);
480     Locale *fLocale;
481 
482 };
483 
484 U_NAMESPACE_END
485 #endif
486