00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef Fennel_ResourceBundle_Included
00024 #define Fennel_ResourceBundle_Included
00025
00026 #include <functional>
00027 #include <map>
00028 #include <set>
00029 #include <string>
00030
00031 #include "fennel/common/Locale.h"
00032 #include "fennel/synch/SynchObj.h"
00033
00034 FENNEL_BEGIN_NAMESPACE
00035
00036 using namespace std;
00037
00038 class FENNEL_COMMON_EXPORT ResourceBundle
00039 {
00040 protected:
00041 explicit ResourceBundle(
00042 const string &baseName,
00043 const Locale &locale,
00044 const string &location);
00045 virtual ~ResourceBundle();
00046
00047 void setParent(ResourceBundle *bundle);
00048
00049 public:
00050 const set<string> getKeys() const;
00051 const string &getMessage(const string &key) const;
00052 bool hasMessage(const string &key) const;
00053
00054 const string &getBaseName() const;
00055 const Locale &getLocale() const;
00056
00057 static void setGlobalResourceFileLocation(const string &location);
00058
00059 static RecursiveMutex &getMutex();
00060
00061 private:
00062 void loadMessages();
00063
00064 const string _baseName;
00065 const Locale _locale;
00066 const string _location;
00067
00068 ResourceBundle *_parent;
00069
00070 map<string, string> _messages;
00071
00072 static RecursiveMutex mutex;
00073 };
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 template<class _GRB, class _BC, class _BC_ITER>
00088 _GRB *makeInstance(
00089 _BC &bundleCache,
00090 const Locale &locale)
00091 {
00092 RecursiveMutexGuard mutexGuard(ResourceBundle::getMutex());
00093
00094 _BC_ITER iter = bundleCache.find(locale);
00095 if (iter == bundleCache.end()) {
00096 _GRB *bundle = new _GRB(locale);
00097
00098 if (locale.hasParentLocale()) {
00099
00100 _GRB *parentBundle = makeInstance<_GRB, _BC, _BC_ITER>(
00101 bundleCache,
00102 locale.getParentLocale());
00103
00104 bundle->setParent(parentBundle);
00105 } else if (locale != Locale("")) {
00106
00107 _GRB *defaultBundle = makeInstance<_GRB, _BC, _BC_ITER>(
00108 bundleCache,
00109 Locale(""));
00110
00111 bundle->setParent(defaultBundle);
00112 }
00113
00114 bundleCache[locale] = bundle;
00115 return bundle;
00116 }
00117
00118 return (*iter).second;
00119 }
00120
00121 FENNEL_END_NAMESPACE
00122
00123 #endif // not Fennel_ResourceBundle_Included
00124
00125