00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _OSBMSGCAT_H_
00031 #define _OSBMSGCAT_H_
00032
00033
00034
00035
00036 #include <map>
00037
00038
00039
00040
00041 #include "osberror.h"
00042 #include "mutex.h"
00043
00044
00045
00046
00047
00048 namespace OSB_LIB {
00049
00050
00051
00052 class ErrList;
00053
00054
00055
00056
00057
00058
00059
00063 class MsgCat {
00064 public:
00069 struct Init {
00079 Init(bool useLocks);
00080 };
00082 friend struct Init;
00083
00084 public:
00086 static void useLocks();
00087
00091 static void msg(
00092 const BaseError& e,
00093 std::string& dest
00094 );
00095
00097 static MsgCat& instance();
00098
00099 public:
00103 void mkMsg(
00104 const BaseError& e,
00105 std::string& dest
00106 );
00107
00108 private:
00116 MsgCat();
00118 ~MsgCat();
00120 MsgCat(const MsgCat&);
00121
00122 private:
00124 Guard lock();
00126 ErrList& errList(const BaseError& e);
00127
00128 private:
00130 typedef std::map<std::string, ErrList*> ErrLists;
00131
00139 bool useLocks_;
00141 Mutex mutex_;
00143 MutexUnlock unlock_;
00145 ErrLists errLists_;
00146
00147 private:
00152 struct Destroy {
00154 ~Destroy();
00155 };
00157 friend struct Destroy;
00158
00159 private:
00161 static Destroy destroy_;
00163 static MsgCat* instance_;
00164 };
00165
00173 class ErrList {
00175 friend class MsgCat;
00176 public:
00178 const std::string& errMsg() const
00179 {
00180 return errMsg_;
00181 }
00182
00197 bool mkErrorMsg(
00198 std::string& dest,
00199 BaseError::ErrorNo errNo,
00200 const BaseError::Args& errArgs
00201 ) const;
00202
00203 private:
00205 typedef std::vector<std::string> BaseText;
00207 typedef std::map<BaseError::ErrorNo, BaseText> TextMap;
00208
00210 ErrList(const std::string& filename);
00212 ErrList(const ErrList&);
00214 ErrList& operator=(const ErrList&);
00215
00223 void separate(
00224 BaseText& dest,
00225 const std::string& errStr
00226 );
00227
00235 const BaseText* getText(OsbBaseError::ErrorNo errNo) const;
00236
00245 void compose(
00246 std::string& dest,
00247 const BaseText& text,
00248 const BaseError::Args& errArgs
00249 ) const;
00250
00259 void compose(
00260 std::string& dest,
00261 const std::string& errMsg,
00262 const BaseError::Args& errArgs
00263 ) const;
00264
00266 TextMap textMap_;
00268 std::string errMsg_;
00269 };
00270 }
00271
00272
00273
00274 namespace OSB_LIB {
00275 }
00276 #endif // #ifndef _OSBMSGCAT_H_