ncbireg.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:18k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbireg.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 15:05:14  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.32
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CORELIB___NCBIREG__HPP
  10. #define CORELIB___NCBIREG__HPP
  11. /*  $Id: ncbireg.hpp,v 1000.0 2003/10/29 15:05:14 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Denis Vakatov
  37.  *
  38.  */
  39. /// @file ncbireg.hpp
  40. /// Process information in the NCBI Registry, including working with
  41. /// configuration files.
  42. ///
  43. /// Classes to perform NCBI Registry operations including:
  44. /// - Read and parse configuration file
  45. /// - Search, edit, etc. the retrieved configuration information
  46. /// - Write information back to configuration file
  47. ///
  48. /// The Registry is defined as a text file with sections and entries in the 
  49. /// form of "name=value" strings in each section. 
  50. ///
  51. /// For an explanation of the syntax of the Registry file, see the
  52. /// C++ Toolkit documentation.
  53. #include <corelib/ncbistd.hpp>
  54. #include <list>
  55. #include <map>
  56. /** @addtogroup Registry
  57.  *
  58.  * @{
  59.  */
  60. BEGIN_NCBI_SCOPE
  61. /////////////////////////////////////////////////////////////////////////////
  62. ///
  63. /// CRegistryException --
  64. ///
  65. /// Define exceptions generated by CNcbiRegistry.
  66. ///
  67. /// CRegistryException inherits its basic functionality from
  68. /// CCParseTemplException<CCoreException> and defines additional error codes
  69. /// for the Registry.
  70. class NCBI_XNCBI_EXPORT CRegistryException :
  71.     public CParseTemplException<CCoreException>
  72. {
  73. public:
  74.     /// Error types that the Registry can generate.
  75.     enum EErrCode {
  76.         eSection,   ///< Section error
  77.         eEntry,     ///< Entry error
  78.         eValue,     ///< Value error
  79.         eErr        ///< Other error
  80.     };
  81.     /// Translate from the error code value to its string representation.
  82.     virtual const char* GetErrCodeString(void) const
  83.     {
  84.         switch (GetErrCode()) {
  85.         case eSection: return "eSection";
  86.         case eEntry:   return "eEntry";
  87.         case eValue:   return "eValue";
  88.         case eErr:     return "eErr";
  89.         default:       return CException::GetErrCodeString();
  90.         }
  91.     }
  92.     // Standard exception boilerplate code
  93.     NCBI_EXCEPTION_DEFAULT2(CRegistryException,
  94.                             CParseTemplException<CCoreException>,
  95.                             std::string::size_type);
  96. };
  97. /////////////////////////////////////////////////////////////////////////////
  98. ///
  99. /// CNcbiRegistry --
  100. ///
  101. /// Define the Registry.
  102. ///
  103. /// Load, access, modify and store runtime information (usually used to
  104. /// work with configuration files).
  105. class NCBI_XNCBI_EXPORT CNcbiRegistry
  106. {
  107. public:
  108.     /// Registry parameter settings.
  109.     ///
  110.     /// A Registry parameter can be either transient or persistent,
  111.     /// overridable or not overridable, truncatable or not truncatable.
  112.     enum EFlags {
  113.         eTransient   = 0x1,     ///< Transient -- Wont be saved (by Write())
  114.         ePersistent  = 0x100,   ///< Persistent -- Saved when file is written
  115.         eOverride    = 0x2,     ///< Existing value can be overriden
  116.         eNoOverride  = 0x200,   ///< Cannot change existing value
  117.         eTruncate    = 0x4,     ///< Leading, trailing blanks can be truncated
  118.         eNoTruncate  = 0x400    ///< Cannot truncate parameter value
  119.     };
  120.     typedef int TFlags;  ///< Binary OR of "EFlags"
  121.     /// Constructor.
  122.     CNcbiRegistry(void);
  123.     /// Destructor.
  124.     ~CNcbiRegistry(void);
  125.     /// Constructor.
  126.     ///
  127.     /// @param is
  128.     ///   Input stream to load the Registry from.
  129.     ///   NOTE:  if the stream is a file, it must be opened in binary mode!
  130.     /// @param flags
  131.     ///   How parameters are stored. The default is to store all parameters as
  132.     ///   persistent unless the  "eTransient" flag is set in which case the
  133.     ///   newly retrieved parameters is stored as transient.
  134.     /// @sa
  135.     ///   Read()
  136.     CNcbiRegistry(CNcbiIstream& is, TFlags flags = 0); 
  137.     /// Verify if Registry is empty.
  138.     ///
  139.     /// @return
  140.     ///   TRUE if the registry contains no entries.
  141.     bool Empty(void) const;
  142.     /// Verify if persistent values have been modified.
  143.     ///
  144.     /// @return
  145.     ///   TRUE if the persistent part of the registry (i.e. persistent
  146.     ///   value(s) and the all-registry comment) was modified since:
  147.     ///   - the last successful Write(), or
  148.     ///   - the registry creation and maybe immediate read after the creation.
  149.     bool Modified(void) const;
  150.     /// Read and parse the stream "is", and merge its content with current
  151.     /// Registry entries.
  152.     ///
  153.     /// Once the Registry has been initialized by the constructor, it is 
  154.     /// possible to load other parameters from other files using this method.
  155.     /// @param is
  156.     ///   Input stream to read and parse.
  157.     ///   NOTE:  if the stream is a file, it must be opened in binary mode!
  158.     /// @param flags
  159.     ///   How parameters are stored. The default is for all values to be read
  160.     ///   as persistent with the capability of overriding any previously
  161.     ///   loaded value associated with the same name. The default can be
  162.     ///   modified by specifying "eTransient", "eNoOverride" or 
  163.     ///   "eTransient | eNoOverride". If there is a conflict between the old
  164.     ///   and the new(loaded) entry value and if "eNoOverride" flag is set,
  165.     ///   then just ignore the new value; otherwise, replace the old value by
  166.     ///   the new one. If "eTransient" flag is set, then store the newly
  167.     ///   retrieved parameters as transient;  otherwise, store them as
  168.     ///   persistent.
  169.     /// @sa
  170.     ///   Write()
  171.     void Read(CNcbiIstream& is, TFlags flags = 0);
  172.     /// Write the registry content to output stream.
  173.     /// @param os
  174.     ///   Output stream to write the registry to.
  175.     ///   NOTE:  if the stream is a file, it must be opened in binary mode!
  176.     /// @return
  177.     ///   TRUE if operation is successful.
  178.     /// @sa
  179.     ///   Read()
  180.     bool Write(CNcbiOstream& os) const;
  181.     /// Reset the registry content.
  182.     void Clear(void);
  183.     /// Get the parameter value.
  184.     ///
  185.     /// Get the parameter with the specified "name" from the specified 
  186.     /// "section".  First, search for the transient parameter value, and if
  187.     /// cannot find in there, then continue the search in the non-transient
  188.     /// paramters. If "ePersistent" flag is set in "flags", then don't search
  189.     /// in the transient transient parameters at all.
  190.     /// @param section
  191.     ///   Section name to search under.
  192.     /// @param name
  193.     ///   Parameter name to search for.
  194.     /// @param flags
  195.     ///   To control search.
  196.     /// @return
  197.     ///   The parameter value, or empty string if the parameter is not found.
  198.     /// @sa
  199.     ///   GetString()
  200.     const string& Get(const string& section, const string& name,
  201.                       TFlags flags = 0) const;
  202.     /// Get the parameter string value.
  203.     ///
  204.     /// Similar to the "Get()", but if the configuration parameter is not
  205.     /// found, then return 'default_value' rather than empty string.
  206.     /// @sa
  207.     ///   Get()
  208.     const string GetString(const string& section, const string& name,
  209.                            const string& default_value, TFlags flags = 0)
  210.         const;
  211.     /// What to do if parameter value is present but cannot be converted into
  212.     /// the requested type.
  213.     enum EErrAction {
  214.         eThrow,   ///< Throw an exception if an error occurs
  215.         eErrPost, ///< Log the error message and return default value
  216.         eReturn   ///< Return default value
  217.     };
  218.     /// Get integer value of specified parameter name.
  219.     ///
  220.     /// Like "GetString()", plus convert the value into integer.
  221.     /// @param err_action
  222.     ///   What to do if error encountered in converting parameter value.
  223.     /// @sa
  224.     ///   GetString()
  225.     int GetInt(const string& section, const string& name,
  226.                int default_value, TFlags flags = 0,
  227.                EErrAction err_action = eThrow) const;
  228.     /// Get boolean value of specified parameter name.
  229.     ///
  230.     /// Like "GetString()", plus convert the value into boolean.
  231.     /// @param err_action
  232.     ///   What to do if error encountered in converting parameter value.
  233.     /// @sa
  234.     ///   GetString()
  235.     bool GetBool(const string& section, const string& name,
  236.                  bool default_value,  TFlags flags = 0,
  237.                  EErrAction err_action = eThrow) const;
  238.     /// Get double value of specified parameter name.
  239.     ///
  240.     /// Like "GetString()", plus convert the value into double.
  241.     /// @param err_action
  242.     ///   What to do if error encountered in converting parameter value.
  243.     /// @sa
  244.     ///   GetString()
  245.     double GetDouble(const string& section, const string& name,
  246.                      double default_value, TFlags flags = 0,
  247.                      EErrAction err_action = eThrow) const;
  248.     /// Set the configuration parameter value.
  249.     ///
  250.     /// Unset the parameter if specified "value" is empty.
  251.     ///
  252.     /// @param value
  253.     ///   Value that the parameter is set to.
  254.     /// @param flags
  255.     ///   To control search.
  256.     ///   Valid flags := { ePersistent, eNoOverride, eTruncate }
  257.     ///   If there was already an entry with the same <section,name> key:
  258.     ///     if "eNoOverride" flag is set then do not override old value
  259.     ///     and return FALSE;  else override the old value and return TRUE.
  260.     ///   If "ePersistent" flag is set then store the entry as persistent;
  261.     ///     else store it as transient.
  262.     ///   If "eTruncate" flag is set then truncate the leading and trailing
  263.     ///     spaces -- " rtv" (NOTE:  'n' is not considered a space!).
  264.     /// @param comment
  265.     ///   Optional comment string describing parameter.
  266.     /// @return
  267.     ///   TRUE if specified parameter is set; FALSE otherwise.
  268.     bool Set(const string& section, const string& name, const string& value,
  269.              TFlags flags = 0, const string& comment = kEmptyStr);
  270.     /// Set comment "comment" for the registry entry "section:name".
  271.     ///
  272.     /// @param comment
  273.     ///   Comment string value.
  274.     ///   Set to kEmptyStr to delete the comment.
  275.     /// @param section
  276.     ///   Section name.
  277.     ///   If "section" is empty string, then set as the registry comment.
  278.     /// @param name
  279.     ///   Parameter name.
  280.     ///   If "name" is empty string, then set as the "section" comment.
  281.     /// @return
  282.     ///   FALSE if "section" and/or "name" do not exist in registry.
  283.     bool SetComment(const string& comment,
  284.                     const string& section = kEmptyStr,
  285.                     const string& name    = kEmptyStr);
  286.     /// Get comment of the registry entry "section:name".
  287.     ///
  288.     /// @param section
  289.     ///   Section name.
  290.     ///   If passed empty string, then get the registry comment.
  291.     /// @param name
  292.     ///   Parameter name.
  293.     ///   If empty string, then get the "section" comment.
  294.     /// @return
  295.     ///   Comment string. If not found, return an empty string.
  296.     const string& GetComment(const string& section = kEmptyStr,
  297.                              const string& name    = kEmptyStr) const;
  298.     /// Enumerate section names.
  299.     ///
  300.     /// Write all section names to the "sections" list.
  301.     /// Previous contents of the list are erased.
  302.     void EnumerateSections(list<string>* sections) const;
  303.     /// Enumerate parameter names for a specfiied section.
  304.     ///
  305.     /// Write all parameter names for specified "section" to the "entries"
  306.     /// list. Previous contents of the list are erased.
  307.     void EnumerateEntries(const string& section, list<string>* entries) const;
  308. private:
  309.     /// Hold values for Registry entry.
  310.     struct TRegEntry {
  311.         string persistent;  ///< Non-transient value
  312.         string transient;   ///< Transient value
  313.         string comment;     ///< Entry's comment string
  314.     };
  315.     /// Define Registry section as a map of entry parameter names
  316.     /// and the parameter values.
  317.     typedef map<string, TRegEntry,   PNocase>  TRegSection; 
  318.     /// Define Registry as a map of section names and section
  319.     /// values (TRegSection).
  320.     typedef map<string, TRegSection, PNocase>  TRegistry;
  321.     TRegistry    m_Registry;  ///< Internal representation of registry.
  322.     string       m_Comment;   ///< All-registry comment
  323.     mutable bool m_Modified;  ///< Persistent value(s) changed
  324.     mutable bool m_Written;   ///< Method Write() was called at least once
  325.     /// Helper method to set registry entry value and comment string.
  326.     void x_SetValue(TRegEntry& entry, const string& value,
  327.                     TFlags flags, const string& comment);
  328.     /// Helper method to check if the registry contains only transient entries
  329.     /// and comments.
  330.     bool x_IsAllTransient(void) const;
  331.     /// Private copy constructor to prohibit default intitialization.
  332.     CNcbiRegistry(const CNcbiRegistry&);
  333.     /// Private assignment operator to prohibit default assignment.
  334.     CNcbiRegistry& operator= (const CNcbiRegistry&);
  335. };
  336. END_NCBI_SCOPE
  337. /* @} */
  338. /*
  339.  * ===========================================================================
  340.  * $Log: ncbireg.hpp,v $
  341.  * Revision 1000.0  2003/10/29 15:05:14  gouriano
  342.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.32
  343.  *
  344.  * Revision 1.32  2003/10/20 21:55:05  vakatov
  345.  * CNcbiRegistry::GetComment() -- make it "const"
  346.  *
  347.  * Revision 1.31  2003/08/18 18:44:07  siyan
  348.  * Minor comment changes.
  349.  *
  350.  * Revision 1.30  2003/08/14 12:25:28  siyan
  351.  * Made previous documentation changes consistent.
  352.  * Best not to mix the ///< style with @param style for parameter documentation
  353.  * as Doxygen may not always render this correctly.
  354.  *
  355.  * Revision 1.29  2003/08/12 19:00:39  vakatov
  356.  * Fixed comments and code layout
  357.  *
  358.  * Revision 1.27  2003/07/21 18:42:38  siyan
  359.  * Documentation changes.
  360.  *
  361.  * Revision 1.26  2003/04/07 19:40:03  ivanov
  362.  * Rollback to R1.24
  363.  *
  364.  * Revision 1.25  2003/04/07 16:08:41  ivanov
  365.  * Added more thread-safety to CNcbiRegistry:: methods -- mutex protection.
  366.  * Get() and GetComment() returns "string", not "string&".
  367.  *
  368.  * Revision 1.24  2003/04/01 14:20:28  siyan
  369.  * Added doxygen support
  370.  *
  371.  * Revision 1.23  2003/02/28 19:24:42  vakatov
  372.  * Get rid of redundant "const" in the return type of GetInt/Bool/Double()
  373.  *
  374.  * Revision 1.22  2003/02/24 19:54:51  gouriano
  375.  * use template-based exceptions instead of errno and parse exceptions
  376.  *
  377.  * Revision 1.21  2003/01/17 20:46:28  vakatov
  378.  * Fixed/improved description of "EErrAction"
  379.  *
  380.  * Revision 1.20  2003/01/17 20:26:59  kuznets
  381.  * CNcbiRegistry added ErrPost error action
  382.  *
  383.  * Revision 1.19  2003/01/17 17:31:20  vakatov
  384.  * CNcbiRegistry::GetString() to return "string", not "string&" -- for safety
  385.  *
  386.  * Revision 1.18  2002/12/30 23:23:06  vakatov
  387.  * + GetString(), GetInt(), GetBool(), GetDouble() -- with defaults,
  388.  * conversions and error handling control (to extend Get()'s functionality).
  389.  *
  390.  * Revision 1.17  2002/12/18 22:53:21  dicuccio
  391.  * Added export specifier for building DLLs in windows.  Added global list of
  392.  * all such specifiers in mswin_exports.hpp, included through ncbistl.hpp
  393.  *
  394.  * Revision 1.16  2002/04/11 20:39:18  ivanov
  395.  * CVS log moved to end of the file
  396.  *
  397.  * Revision 1.15  2001/09/11 00:46:56  vakatov
  398.  * Fixes to R1.14:
  399.  *   Renamed HasChanged() to Modified(), refined and extended its functionality
  400.  *   Made Write() be "const" again
  401.  *
  402.  * Revision 1.14  2001/09/10 16:35:02  ivanov
  403.  * Added method HasChanged()
  404.  *
  405.  * Revision 1.13  2001/06/22 21:50:20  ivanov
  406.  * Added (with Denis Vakatov) ability for read/write the registry file
  407.  * with comments. Also added functions GetComment() and SetComment().
  408.  *
  409.  * Revision 1.12  2001/05/17 14:54:01  lavr
  410.  * Typos corrected
  411.  *
  412.  * Revision 1.11  2001/04/09 17:39:20  grichenk
  413.  * CNcbiRegistry::Get() return type reverted to "const string&"
  414.  *
  415.  * Revision 1.10  2001/04/06 15:46:29  grichenk
  416.  * Added thread-safety to CNcbiRegistry:: methods
  417.  *
  418.  * Revision 1.9  1999/09/02 21:53:23  vakatov
  419.  * Allow '-' and '.' in the section/entry name
  420.  *
  421.  * Revision 1.8  1999/07/07 14:17:05  vakatov
  422.  * CNcbiRegistry::  made the section and entry names be case-insensitive
  423.  *
  424.  * Revision 1.7  1999/07/06 15:26:31  vakatov
  425.  * CNcbiRegistry::
  426.  *   - allow multi-line values
  427.  *   - allow values starting and ending with space symbols
  428.  *   - introduced EFlags/TFlags for optional parameters in the class
  429.  *     member functions -- rather than former numerous boolean parameters
  430.  *
  431.  * Revision 1.6  1998/12/28 17:56:28  vakatov
  432.  * New CVS and development tree structure for the NCBI C++ projects
  433.  *
  434.  * Revision 1.5  1998/12/10 22:59:46  vakatov
  435.  * CNcbiRegistry:: API is ready(and by-and-large tested)
  436.  * ===========================================================================
  437.  */
  438. #endif  /* CORELIB___NCBIREG__HPP */