MboIniData.h

Go to the documentation of this file.
00001 /*****************************************************************************
00002 * Copyright (c) 2001 - 2008 Marcus Boerger.  All rights reserved.
00003 *
00004 * This library is free software; you can redistribute it and/or
00005 * modify it under the terms of the GNU Lesser General Public
00006 * License as published by the Free Software Foundation; either
00007 * version 2.1 of the License, or (at your option) any later version.
00008 *
00009 * This library is distributed in the hope that it will be useful,
00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 * Lesser General Public License for more details.
00013 *
00014 * You should have received a copy of the GNU Lesser General Public
00015 * License along with this library; if not, write to the Free Software
00016 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00017 * ========================================================================= */
00018 
00019 /* ------------------------------------------------------------------------ */
00020 /* Name:      MboStrMap.h / MboStrMapStr.cpp
00021  *
00022  * Requires:  
00023  * - Mbo.h
00024  * - MboSynch.h
00025  * - MboStrHelper.h
00026  * - MboTString.h
00027  * - MboStrList.h
00028  * - MboStrMap.h
00029  * - list2.h
00030  * - vector2.h
00031  * - map2.h
00032  */
00196 /* ------------------------------------------------------------------------ */
00197 
00198 #ifndef _MBOINIDATA_H_
00199 #define _MBOINIDATA_H_
00200 
00201 #include "Mbo.h"
00202 #include "MboSynch.h"
00203 #include "MboStrList.h"
00204 #include "MboStrMap.h"
00205 #include "MboStrHelper.h"
00206 #include "triplet.h"
00207 #include "quaternion.h"
00208 #include <vector>
00209 #include <float.h>
00210 #pragma push_macro("new")
00211 #undef new
00212 #include <fstream>
00213 #pragma pop_macro("new")
00214 #include <sstream>
00215 #include <sys/types.h>
00216 #include <sys/stat.h>
00217 
00218 #if defined(_MSC_VER)
00219 # pragma warning(push)
00220 # pragma warning(disable: 4251) // disable warning C4251: '...' : class '...' needs to have dll-interface to be used by clients of class '...'
00221 # pragma warning(disable: 4275) // non dll-interface class '...' used as base for dll-interface class '...'
00222 # pragma warning(disable: 4290) // C++-exception-specification ignored
00223 # ifndef _CPPRTTI
00224 #  error You must compile using RTTI
00225 # endif // _CPPRTTI
00226 #endif // _MSC_VER
00227 
00228 namespace mbo
00229 {
00230 
00231 template<class _E, class _Tr, class _A>
00232 COLORREF StrToColor(
00233         const std::basic_string<_E, _Tr, _A >& str,
00234         _IN COLORREF                           colDefault
00235     )
00236 {
00237     CStrMapStr msstrColor(str);
00238     return RGB( (msstrColor.contains_key("R") ? StrToInt<_E, _Tr, _A>(msstrColor.find("R")->second) : GetRValue(colDefault))
00239               , (msstrColor.contains_key("G") ? StrToInt<_E, _Tr, _A>(msstrColor.find("G")->second) : GetGValue(colDefault))
00240               , (msstrColor.contains_key("B") ? StrToInt<_E, _Tr, _A>(msstrColor.find("B")->second) : GetBValue(colDefault))
00241               );
00242 }
00243 
00244 template<class _E, class _Tr, class _A>
00245 std::basic_string<_E, _Tr, _A > & StrFromColor(
00246         std::basic_string<_E, _Tr, _A > & str,
00247         _IN COLORREF                      col
00248     )
00249 {
00250     str = "R="  + StrFrom<_E>(max(0, min(GetRValue(col), 255)))
00251         + ",G=" + StrFrom<_E>(max(0, min(GetGValue(col), 255)))
00252         + ",B=" + StrFrom<_E>(max(0, min(GetBValue(col), 255)));
00253     return str;
00254 }
00255 
00256 static std::string StrFromColor(_IN COLORREF col)
00257 {
00258     std::string str;
00259     return StrFromColor(str, col);
00260 }
00261 
00262 typedef std::list<std::pair<MboString, MboString> > CIniSectionList;
00263 
00274 class MBO_API CIniData // cini
00275 {
00276 public:
00296     explicit CIniData(
00297             _IN const MboString & strFilename,
00298             _IN const MboString & strSectionPrefix = ""
00299         );
00300 
00304     virtual ~CIniData();
00305 
00310     virtual const MboString & GetFilename() const;
00311 
00314     virtual MboString  GetIniDirectory() const;
00315 
00320     virtual const MboString & GetSectionPrefix() const;
00321 
00331     bool GetSectionNames(
00332             _IN  const MboString &  strSectionPrefix,
00333             _OUT CStrList &         vstrSectionNames
00334         ) const;
00335 
00343     bool GetSectionNames(
00344             _OUT CStrList &         vstrSectionNames
00345         ) const;
00346 
00352     bool SectionExists(
00353             _IN const MboString &   strSection
00354         ) const;
00355 
00362     virtual bool GetKeyNames(
00363             _IN  const MboString &  strSection,
00364             _OUT CStrList &         vstrKeyNames
00365         ) const;
00366 
00373     virtual bool KeyNameExists(
00374             _IN  const MboString &  strSection,
00375             _IN  const MboString &  strKeyname
00376         ) const;
00377 
00398     virtual bool ReadString(
00399             _IN  const MboString &  strSection,
00400             _IN  const MboString &  strKeyname,
00401             _OUT MboString &        strValue,
00402             _IN  const MboString &  strDefault    = "",
00403             _IN  bool               bWriteDefault = false,
00404             _IN  bool               bParseEnvVars = false 
00405         ) const;
00406 
00419     virtual MboString GetString(
00420             _IN  const MboString &  strSection,
00421             _IN  const MboString &  strKeyname,
00422             _IN  const MboString &  strDefault    = "",
00423             _IN  bool               bWriteDefault = false,
00424             _IN  bool               bParseEnvVars = false
00425         ) const;
00426 
00442     static MboString GetIniString(
00443             _IN  const MboString &  strFilename,
00444             _IN  const MboString &  strSection,
00445             _IN  const MboString &  strKeyname,
00446             _IN  const MboString &  strDefault    = "",
00447             _IN  bool               bWriteDefault = false,
00448             _IN  bool               bParseEnvVars = false
00449         );
00450 
00470     virtual bool ReadInt(
00471             _IN  const MboString &  strSection,
00472             _IN  const MboString &  strKeyname,
00473             _OUT int &              nValue,
00474             _IN  int                nDefault      = 0,
00475             _IN  bool               bWriteDefault = false,
00476             _IN  int                nMinimum      = INT_MIN,
00477             _IN  int                nMaximum      = INT_MAX
00478         ) const;
00479 
00491     virtual int GetInt(
00492             _IN  const MboString &  strSection,
00493             _IN  const MboString &  strKeyname,
00494             _IN  int                nDefault      = 0,
00495             _IN  bool               bWriteDefault = false,
00496             _IN  int                nMinimum      = INT_MIN,
00497             _IN  int                nMaximum      = INT_MAX
00498         ) const;
00499 
00514     static int GetIniInt(
00515             _IN  const MboString &  strFilename,
00516             _IN  const MboString &  strSection,
00517             _IN  const MboString &  strKeyname,
00518             _IN  int                nDefault      = 0,
00519             _IN  bool               bWriteDefault = false,
00520             _IN  int                nMinimum      = INT_MIN,
00521             _IN  int                nMaximum      = INT_MAX
00522         );
00523 
00543     virtual bool ReadLong(
00544             _IN  const MboString &  strSection,
00545             _IN  const MboString &  strKeyname,
00546             _OUT long &             lValue,
00547             _IN  long               lDefault      = 0,
00548             _IN  bool               bWriteDefault = false,
00549             _IN  long               lMinimum      = LONG_MIN,
00550             _IN  long               lMaximum      = LONG_MAX
00551         ) const;
00552 
00564     virtual long GetLong(
00565             _IN  const MboString &  strSection,
00566             _IN  const MboString &  strKeyname,
00567             _IN  long               lDefault      = 0L,
00568             _IN  bool               bWriteDefault = false,
00569             _IN  long               lMinimum      = LONG_MIN,
00570             _IN  long               lMaximum      = LONG_MAX
00571         ) const;
00572 
00587     static long GetIniLong(
00588             _IN  const MboString &  strFilename,
00589             _IN  const MboString &  strSection,
00590             _IN  const MboString &  strKeyname,
00591             _IN  long               lDefault      = 0L,
00592             _IN  bool               bWriteDefault = false,
00593             _IN  long               lMinimum      = LONG_MIN,
00594             _IN  long               lMaximum      = LONG_MAX
00595         );
00596 
00616     virtual bool ReadFloat(
00617             _IN  const MboString &  strSection,
00618             _IN  const MboString &  strKeyname,
00619             _OUT float &            fValue,
00620             _IN  float              fDefault      = 0.0f,
00621             _IN  bool               bWriteDefault = false,
00622             _IN  float              fMinimum      = -FLT_MAX,
00623             _IN  float              fMaximum      = FLT_MAX
00624         ) const;
00625 
00637     virtual float GetFloat(
00638             _IN  const MboString &  strSection,
00639             _IN  const MboString &  strKeyname,
00640             _IN  float              fDefault      = 0.0f,
00641             _IN  bool               bWriteDefault = false,
00642             _IN  float              fMinimum      = -FLT_MAX,
00643             _IN  float              fMaximum      = FLT_MAX
00644         ) const;
00645 
00660     static float GetIniFloat(
00661             _IN  const MboString &  strFilename,
00662             _IN  const MboString &  strSection,
00663             _IN  const MboString &  strKeyname,
00664             _IN  float              fDefault      = 0.0f,
00665             _IN  bool               bWriteDefault = false,
00666             _IN  float              fMinimum      = -FLT_MAX,
00667             _IN  float              fMaximum      = FLT_MAX
00668         );
00669 
00689     virtual bool ReadDouble(
00690             _IN  const MboString &  strSection,
00691             _IN  const MboString &  strKeyname,
00692             _OUT double &           fValue,
00693             _IN  double             fDefault      = 0.0,
00694             _IN  bool               bWriteDefault = false,
00695             _IN  double             fMinimum      = -DBL_MAX,
00696             _IN  double             fMaximum      = DBL_MAX
00697         ) const;
00698 
00710     virtual double GetDouble(
00711             _IN  const MboString &  strSection,
00712             _IN  const MboString &  strKeyname,
00713             _IN  double             fDefault      = 0.0,
00714             _IN  bool               bWriteDefault = false,
00715             _IN  double             fMinimum      = -DBL_MAX,
00716             _IN  double             fMaximum      = DBL_MAX
00717         ) const;
00718 
00733     static double GetIniDouble(
00734             _IN  const MboString &  strFilename,
00735             _IN  const MboString &  strSection,
00736             _IN  const MboString &  strKeyname,
00737             _IN  double             fDefault      = 0.0,
00738             _IN  bool               bWriteDefault = false,
00739             _IN  double             fMinimum      = -DBL_MAX,
00740             _IN  double             fMaximum      = DBL_MAX
00741         );
00742 
00760     virtual bool ReadBool(
00761             _IN  const MboString &  strSection,
00762             _IN  const MboString &  strKeyname,
00763             _OUT bool &             bValue,
00764             _IN  bool               bDefault      = false,
00765             _IN  bool               bWriteDefault = false
00766         ) const;
00767 
00777     virtual bool GetBool(
00778             _IN  const MboString &  strSection,
00779             _IN  const MboString &  strKeyname,
00780             _IN  bool               bDefault      = false,
00781             _IN  bool               bWriteDefault = false
00782         ) const;
00783 
00796     static bool GetIniBool(
00797             _IN  const MboString &  strFilename,
00798             _IN  const MboString &  strSection,
00799             _IN  const MboString &  strKeyname,
00800             _IN  bool               bDefault      = false,
00801             _IN  bool               bWriteDefault = false
00802         );
00803 
00821     virtual bool ReadColor(
00822             _IN  const MboString &  strSection,
00823             _IN  const MboString &  strKeyname,
00824             _OUT COLORREF &         colValue,
00825             _IN  COLORREF           colDefault    = RGB(0, 0, 0),
00826             _IN  bool               bWriteDefault = false
00827         ) const;
00828 
00838     virtual COLORREF GetColor(
00839             _IN  const MboString &  strSection,
00840             _IN  const MboString &  strKeyname,
00841             _IN  COLORREF           colDefault    = RGB(0, 0, 0),
00842             _IN  bool               bWriteDefault = false
00843         ) const;
00844 
00857     static COLORREF GetIniColor(
00858             _IN  const MboString &  strFilename,
00859             _IN  const MboString &  strSection,
00860             _IN  const MboString &  strKeyname,
00861             _IN  COLORREF           colDefault    = RGB(0, 0, 0),
00862             _IN  bool               bWriteDefault = false
00863         );
00864 
00890     virtual bool ReadMap(
00891             _IN  const MboString &  strSection,
00892             _OUT CStrMapStr &       msstrValue,
00893             _IN  const CStrMapStr & msstrDefault  = CStrMapStr(),
00894             _IN  bool               bWriteDefault = false,
00895             _IN  bool               bWriteEmpty   = false,
00896             _IN  bool               bRetrieveAll  = false
00897         ) const;
00898 
00916     virtual DEPRECATED CStrMapStr GetMap(
00917             _IN  const MboString &  strSection,
00918             _IN  const CStrMapStr & msstrDefault  = CStrMapStr(),
00919             _IN  bool               bWriteDefault = false,
00920             _IN  bool               bWriteEmpty   = false,
00921             _IN  bool               bRetrieveAll  = false
00922         ) const;
00923 
00943     static DEPRECATED CStrMapStr GetIniMap(
00944             _IN  const MboString &  strFilename,
00945             _IN  const MboString &  strSection,
00946             _IN  const CStrMapStr & msstrDefault  = CStrMapStr(),
00947             _IN  bool               bWriteDefault = false,
00948             _IN  bool               bWriteEmpty   = false
00949         );
00950 
00976     virtual bool ReadSectionList(
00977             _IN  const MboString&       strSection,
00978             _OUT CIniSectionList&       vsstrValue,
00979             _IN  const CIniSectionList& vsstrDefault  = CIniSectionList(),
00980             _IN  bool                   bWriteDefault = false,
00981             _IN  bool                   bWriteEmpty   = false,
00982             _IN  bool                   bRetrieveAll  = false
00983         ) const;
00984 
00995     virtual bool EmptySection(
00996             _IN  const MboString &  strSection,
00997             _IN  bool               bKeepComments = true
00998         );
00999 
01008     virtual bool ClearSection(
01009             _IN  const MboString& strSection
01010         );
01011 
01021     virtual bool DeleteKey(
01022             _IN  const MboString &  strSection,
01023             _IN  const MboString &  strKeyname
01024         );
01025 
01026 
01036     virtual bool RenameKey(
01037             _IN  const MboString&  strSection,
01038             _IN  const MboString&  strKeynameOld,
01039             _IN  const MboString&  strKeynameNew
01040         );
01041 
01049     virtual bool WriteString(
01050             _IN  const MboString &  strSection,
01051             _IN  const MboString &  strKeyname,
01052             _IN  const MboString &  strValue
01053         );
01054 
01062     virtual bool WriteInt(
01063             _IN  const MboString &  strSection,
01064             _IN  const MboString &  strKeyname,
01065             _IN  int                nValue
01066         );
01067 
01075     virtual bool WriteLong(
01076             _IN  const MboString &  strSection,
01077             _IN  const MboString &  strKeyname,
01078             _IN  long               lValue
01079         );
01080 
01088     virtual bool WriteFloat(
01089             _IN  const MboString &  strSection,
01090             _IN  const MboString &  strKeyname,
01091             _IN  float              fValue
01092         );
01093 
01101     virtual bool WriteDouble(
01102             _IN  const MboString &  strSection,
01103             _IN  const MboString &  strKeyname,
01104             _IN  double             fValue
01105         );
01106 
01114     virtual bool WriteBool(
01115             _IN  const MboString &  strSection,
01116             _IN  const MboString &  strKeyname,
01117             _IN  bool               bValue
01118         );
01119 
01127     virtual bool WriteColor(
01128             _IN  const MboString &  strSection,
01129             _IN  const MboString &  strKeyname,
01130             _IN  COLORREF           colValue
01131         );
01132 
01144     virtual bool WriteMap(
01145             _IN  const MboString &  strSection,
01146             _IN  CStrMapStr         msstrValue,
01147             _IN  bool               bWriteEmpty   = false,
01148             _IN  bool               bKeepComments = true
01149         );
01150 
01164     virtual bool WriteSectionList(
01165             _IN  const MboString&  strSection,
01166             _IN  CIniSectionList   vsstrValue,
01167             _IN  bool              bWriteEmpty     = false,
01168             _IN  bool              bKeepComments   = true
01169         );
01170 
01185     virtual bool ReplaceSectionList(
01186             _IN  const MboString&        strSection,
01187             _IN  const CIniSectionList&  vsstrValue,
01188             _IN  bool                    bWriteEmpty = false
01189         );
01190 
01198     bool IsValidKey(
01199             _IN const MboString&  strKeyName, 
01200             _IN bool              bAcceptComment = false
01201         ) const;
01202 
01205     mbo::CLock IniDataGetLock() const;
01206 
01207 protected:
01208 
01211     virtual bool ReadFile();
01212 
01217     virtual bool IniDataFlush(_IN bool bModified = false) const;
01218 
01219     // modified, key, val, line
01220     typedef mbo::quaternion<bool, MboString, MboString, MboString>   TIniValue;
01221     typedef std::list<TIniValue>                       TIniData;
01222     typedef std::pair<MboString, TIniData>             TIniSection;
01223     typedef std::list<TIniSection>                     TIniCache;
01224 
01227     bool IsEmptyIniValue(const TIniValue& val) const;
01228 
01232     TIniCache::iterator GetSection(
01233             _IN const MboString&  strSection
01234         );
01235 
01239     TIniCache::const_iterator GetSection(
01240             _IN const MboString&  strSection
01241         ) const;
01242 
01247     TIniCache::iterator GetSectionOrCreate(
01248             _IN const MboString&  strSection
01249         );
01250 
01255     TIniValue*  GetValuePtr(
01256             _IN const TIniCache::iterator& itSection,
01257             _IN const MboString&  strKeyName
01258         );
01259 
01264     const TIniValue* GetValuePtr(
01265             _IN const TIniCache::const_iterator&  itSection,
01266             _IN const MboString&                  strKeyName
01267         ) const;
01268 
01273     TIniValue* GetValuePtr(
01274             _IN const MboString&  strSection,
01275             _IN const MboString&  strKeyName
01276         );
01277 
01282     const TIniValue* GetValuePtr(
01283             _IN const MboString&  strSection,
01284             _IN const MboString&  strKeyName
01285         ) const;
01286 
01290     TIniData::iterator FindFirstEmpty(
01291             _IN _OUT TIniCache::iterator&  itSection
01292         );
01293 
01300     TIniData::iterator AddValue(
01301             _IN _OUT TIniCache::iterator&  itSection,
01302             _IN TIniData::iterator         itValue,
01303             _IN const MboString&           strKeyName,
01304             _IN const MboString&           strValue
01305         );
01306 
01312     TIniData::iterator AddValue(
01313             _IN _OUT TIniCache::iterator&  itSection,
01314             _IN const MboString&           strKeyName,
01315             _IN const MboString&           strValue
01316         );
01317 
01323     TIniData::iterator AddValue(
01324             _IN const MboString&  strSection,
01325             _IN const MboString&  strKeyName,
01326             _IN const MboString&  strValue
01327         );
01328 
01329 private:
01330 
01334     bool GetMTime() const;
01335 
01338     class CIniMutex: public mbo::MutexModel
01339     {
01340     public:
01341 
01344         CIniMutex(CIniData& cIniData)
01345             : m_cIniData(cIniData)
01346         {
01347         }
01348 
01349         void Enter() const
01350         {
01351             mbo::MutexModel::Enter();
01352 
01353             if (GetLevel() <= 1 && m_cIniData.GetMTime())
01354             {
01355                 m_cIniData.ReadFile();
01356             }
01357         }
01358 
01361         void Leave() const
01362         {
01363             if (GetLevel() <= 1)
01364             {
01365                 m_cIniData.IniDataFlush();
01366             }
01367             mbo::MutexModel::Leave();
01368         }
01369 
01370     protected:
01371 
01372         CIniData& m_cIniData; 
01373     };
01374 
01375     const MboString         m_strFilename;      
01376     const MboString         m_strSectionPrefix; 
01377     CIniMutex               m_mxIniData;        
01378     mutable std::fstream    m_stmIniFile;       
01379     mutable TIniCache       m_tCache;           
01380     mutable bool            m_bModified;        
01381     mutable time_t          m_tMtime;           
01383 private:
01384 
01387     CIniData& operator = (_IN const CIniData&)
01388     {
01389         abort();
01390         return *this;
01391     }
01392 };
01393 
01394 }; // namespace mbo
01395 
01396 #ifdef _MSC_VER
01397 # pragma warning(pop)
01398 #endif
01399 
01400 #endif // _CINIDATA_H_

  Hosted on code.google.com  
© Marcus Börger
Generated on Fri Jan 18 21:21:08 2008 for MBO-lib by doxygen 1.5.4