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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: settings.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:43:22  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: settings.cpp,v 1000.1 2004/06/01 20:43:22 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Mike DiCuccio, Robert Smith
  35.  *
  36.  * File Description:
  37.  *    CSettings -- Repository for application settings.
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/config/settings.hpp>
  41. #include <gui/utils/system_path.hpp>
  42. #include <serial/serial.hpp>
  43. #include <serial/objostr.hpp>
  44. #include <serial/objistr.hpp>
  45. #include <corelib/ncbifile.hpp>
  46. BEGIN_NCBI_SCOPE
  47. USING_SCOPE(objects);
  48. namespace {
  49.     const string kDefaultConfigFileName("plugin_config.asn");
  50. }
  51. CSettings::CSettings()
  52.     : m_PCC(NULL),
  53.     m_PluginConfigSaveFile(CSystemPath::ResolvePath("<home>", kDefaultConfigFileName))
  54. {
  55. }
  56. bool CSettings::IsSetPluginConfig(void) const
  57. {
  58.     return m_PCC;
  59. }
  60. bool CSettings::CanGetPluginConfig(void) const
  61. {
  62.     return IsSetPluginConfig();
  63. }
  64. const CPluginConfigCache& CSettings::GetPluginConfig(void) const
  65. {
  66.     return *m_PCC;
  67. }
  68. CPluginConfigCache& CSettings::SetPluginConfig(void)
  69. {
  70.     if (! IsSetPluginConfig() ) {
  71.         m_PCC.Reset( new CPluginConfigCache() );
  72.     }
  73.     return *m_PCC;
  74. }
  75. void CSettings::SetPluginConfig(CPluginConfigCache& pcc)
  76. {
  77.     m_PCC.Reset(&pcc);
  78. }
  79. void CSettings::ShutDown(void)
  80. {
  81.     SavePluginConfig();
  82. }
  83. void CSettings::SavePluginConfig(const string& pcfile)
  84. {
  85.     if (CanGetPluginConfig()) {
  86.         WritePluginConfig(pcfile, GetPluginConfig());
  87.     }
  88. }
  89. void CSettings::SavePluginConfig(void)
  90. {
  91.     if (CanGetPluginConfig()) {
  92.         WritePluginConfig(GetPluginConfigWriteFile(), GetPluginConfig());
  93.     }
  94. }
  95. string CSettings::SetPluginConfigWriteFile(const string file_name)
  96. {
  97.     string old_file(m_PluginConfigSaveFile);
  98.     m_PluginConfigSaveFile = file_name;
  99.     return old_file;
  100. }
  101. string CSettings::GetPluginConfigWriteFile() const
  102. {
  103.     return m_PluginConfigSaveFile;
  104. }
  105. void CSettings::LoadPluginConfig(void)
  106. {
  107.     
  108.     LoadPluginConfigFromString(GetBuiltInPluginConfig());
  109.     const string pcfile(kDefaultConfigFileName);
  110.     string pcc_path;
  111.     
  112.     pcc_path = CDirEntry::MakePath(CSystemPath::ResolvePath("<std>", "etc"), pcfile);
  113.     LoadPluginConfig(pcc_path);
  114.     pcc_path = CDirEntry::MakePath(CSystemPath::ResolvePath("<home>", ""), pcfile);
  115.     LoadPluginConfig(pcc_path);
  116. }
  117. void CSettings::LoadPluginConfigs(const string& pcfiles)
  118. {
  119.     list<string> paths;
  120.     NStr::Split(pcfiles, ",tnr", paths);
  121.     ITERATE(list<string>, pcfile_it, paths) {
  122.         if ( ! (pcfile_it->empty())) {
  123.             LoadPluginConfig(*pcfile_it);
  124.         }
  125.     }
  126.     return;
  127. }
  128. void CSettings::LoadPluginConfig(const string& pc_file)
  129. {
  130.     string pcfile = CSystemPath::ResolvePath(pc_file);
  131.     CRef<CPluginConfigCache> config_cache(new CPluginConfigCache);
  132.     
  133.     if (ReadPluginConfig(pc_file, *config_cache)) {
  134.         x_LoadPluginConfig(*config_cache);
  135.     }
  136. }
  137. void CSettings::x_LoadPluginConfig(CPluginConfigCache& pcc)
  138. {
  139.     if ( IsSetPluginConfig()) {
  140.         SetPluginConfig().Merge(pcc);
  141.     } else {
  142.         SetPluginConfig(pcc);
  143.     }
  144.     return;
  145. }
  146. void CSettings::WritePluginConfig(const string& pcfile, const CPluginConfigCache& pcc)
  147. {
  148.     try {
  149.         auto_ptr<CObjectOStream> os(CObjectOStream::Open(eSerial_AsnText, pcfile));
  150.         *os << pcc;
  151.         LOG_POST( Info << "CSettings::SavePluginConfig(): "
  152.             "plugin config cache written to: " << pcfile);
  153.      } catch (const CException& e) {
  154.         LOG_POST( Error << "CSettings::SavePluginConfig(): "
  155.             "Write of plugin config cache to " << pcfile << " failed.");
  156.         LOG_POST( Error << e.what());
  157.      }
  158.      
  159.      return;
  160. }
  161. bool CSettings::ReadPluginConfig(const string& pcfile, objects::CPluginConfigCache& config_cache)
  162. {
  163.     {{
  164.         // first check if the file exists.
  165.         CFile   file(pcfile);
  166.         if ( ! file.Exists() ) {
  167.             LOG_POST( Info << "CSettings::ReadPluginConfig(): "
  168.                 "no plugin config cache found at " << pcfile);
  169.             return false;
  170.         }
  171.     }}
  172.     
  173.     // try reading in ASN.1 test format
  174.     try {
  175.         auto_ptr<CObjectIStream> is(CObjectIStream::Open(eSerial_AsnText, pcfile));
  176.     
  177.         *is >> config_cache;
  178.         LOG_POST( Info << "CSettings::ReadPluginConfig(): "
  179.             "text plugin config cache read from: " << pcfile);
  180.         return true;
  181.     } catch (...) {
  182.         _TRACE("read of ASN.1 text plugin config cache in " << pcfile << " failed");
  183.     }
  184.     
  185.     // try reading in ASN.1 binary format
  186.     try {
  187.         auto_ptr<CObjectIStream> is(CObjectIStream::Open(eSerial_AsnBinary, pcfile));
  188.     
  189.         *is >> config_cache;
  190.         LOG_POST( Info << "CSettings::ReadPluginConfig(): "
  191.             "binary plugin config cache read from: " << pcfile);
  192.         return true;
  193.     } catch (...) {
  194.         _TRACE("read of ASN.1 binary plugin config cache in " << pcfile << " failed");
  195.     }
  196.     // if not, try reading in XML
  197.     try {
  198.         auto_ptr<CObjectIStream> is(CObjectIStream::Open(eSerial_Xml, pcfile));
  199.     
  200.         *is >> config_cache;
  201.         LOG_POST( Info << "CSettings::ReadPluginConfig(): "
  202.             "XML plugin config cache read from: " << pcfile);
  203.         return true;
  204.     } catch (...) {
  205.         _TRACE("read of XML plugin config cache in " << pcfile << " failed");
  206.     }
  207.     
  208.     // Log an error and continue.
  209.     LOG_POST( Error << "CSettings::ReadPluginConfig(): "
  210.         "File does not contain a plugin config cache: " << pcfile);
  211.     
  212.     return false;
  213. }
  214. /// method to allocate and create a PCC from a string with the asn1 source for it.
  215. void  CSettings::LoadPluginConfigFromString(const string& asn1_str)
  216. {
  217.     CRef<CPluginConfigCache> config_cache(new CPluginConfigCache);
  218.     
  219.     if (ReadPluginConfigFromString(asn1_str, *config_cache)) {
  220.         x_LoadPluginConfig(*config_cache);
  221.     }
  222. }
  223. bool CSettings::ReadPluginConfigFromString(const string& asn1_str, 
  224.     objects::CPluginConfigCache& config_cache)
  225. {
  226.     try {
  227.         CNcbiIstrstream is(asn1_str.c_str(), strlen(asn1_str.c_str()));
  228.         auto_ptr<CObjectIStream>
  229.             pcc_in(CObjectIStream::Open(eSerial_AsnText, is));
  230.         *pcc_in >> config_cache;
  231.         LOG_POST( Info << "CSettings::LoadPluginConfigFromString(): "
  232.             "text plugin config cache read from string: "" << asn1_str.substr(0,20) << " ... "" );
  233.     } catch (...) {
  234.         _TRACE("read of ASN.1 text plugin config cache in string failed.  String's first 100 chars are: " 
  235.             << asn1_str.substr(0, 100));
  236.         return false;
  237.     }
  238.     return true;
  239. }
  240. // defines sc_BuiltInASN.
  241. #include "settings_builtin.cpp"
  242. /// Get the string containing our built-in config settings in ASN format.
  243. string  CSettings::GetBuiltInPluginConfig()
  244. {
  245.     return BuildString(sc_BuiltInASN);
  246. }
  247. /// Concatenate a bunch of cstrings into one string.
  248. /// useful since on some platforms string literals must be of limited size.
  249. //  MSVC++ compiler < 2096.
  250. string CSettings::BuildString(const char* cstrings[])
  251. {
  252.     string str;
  253.     for (size_t i = 0;  cstrings[i];  i++) {
  254.         str += cstrings[i];
  255.     }
  256.     return str;
  257. }
  258. END_NCBI_SCOPE
  259. /*
  260.  * ===========================================================================
  261.  * $Log: settings.cpp,v $
  262.  * Revision 1000.1  2004/06/01 20:43:22  gouriano
  263.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  264.  *
  265.  * Revision 1.5  2004/05/21 22:27:40  gorelenk
  266.  * Added PCH ncbi_pch.hpp
  267.  *
  268.  * Revision 1.4  2004/04/02 18:43:19  rsmith
  269.  * comment added for builtin settings.
  270.  *
  271.  * Revision 1.3  2004/02/20 16:11:50  rsmith
  272.  * somewhat better diagnostics on failure to write out settings.
  273.  *
  274.  * Revision 1.2  2004/02/18 17:16:24  dicuccio
  275.  * Use static non-member string array for defaults
  276.  *
  277.  * Revision 1.1  2004/02/17 20:35:19  rsmith
  278.  * moved core/settings.[ch]pp and core/system_path.[ch]pp to config and utils, respectively.
  279.  *
  280.  * Revision 1.8  2004/01/16 21:43:26  rsmith
  281.  * Support for built-in configuration settings.
  282.  *
  283.  * Revision 1.7  2004/01/06 19:53:15  rsmith
  284.  * Add method to read PCC ASN.1 values from strings.
  285.  * Reorganize methods with static methods so that PCC reading and writing could be done
  286.  * without linking in all the gui framework stuff.
  287.  *
  288.  * Revision 1.6  2003/11/06 20:05:09  dicuccio
  289.  * Un-inlined code
  290.  *
  291.  * Revision 1.5  2003/08/25 18:54:01  rsmith
  292.  * took out all the color stuff and made this the manager of the Plugin Config Cache, including reading writing it to disk.
  293.  *
  294.  * Revision 1.4  2003/08/22 15:46:10  dicuccio
  295.  * Removed config file from CSettings - accessible through CNcbiApplication
  296.  *
  297.  * Revision 1.3  2003/05/30 12:56:50  dicuccio
  298.  * Converted code to use MessageBox() instead of fl_ask()/fl_message()/fl_alert()
  299.  *
  300.  * Revision 1.2  2003/02/25 14:47:11  dicuccio
  301.  * Added registry file to CSettings
  302.  *
  303.  * Revision 1.1  2003/01/15 21:06:34  dicuccio
  304.  * Initial revision
  305.  *
  306.  * ===========================================================================
  307.  */