settings.cpp
来自「ncbi源码」· C++ 代码 · 共 363 行
CPP
363 行
/* * =========================================================================== * PRODUCTION $Log: settings.cpp,v $ * PRODUCTION Revision 1000.1 2004/06/01 20:43:22 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5 * PRODUCTION * =========================================================================== *//* $Id: settings.cpp,v 1000.1 2004/06/01 20:43:22 gouriano Exp $ * =========================================================================== * * PUBLIC DOMAIN NOTICE * National Center for Biotechnology Information * * This software/database is a "United States Government Work" under the * terms of the United States Copyright Act. It was written as part of * the author's official duties as a United States Government employee and * thus cannot be copyrighted. This software/database is freely available * to the public for use. The National Library of Medicine and the U.S. * Government have not placed any restriction on its use or reproduction. * * Although all reasonable efforts have been taken to ensure the accuracy * and reliability of the software and data, the NLM and the U.S. * Government do not and cannot warrant the performance or results that * may be obtained by using this software or data. The NLM and the U.S. * Government disclaim all warranties, express or implied, including * warranties of performance, merchantability or fitness for any particular * purpose. * * Please cite the author in any work or product based on this material. * * =========================================================================== * * Authors: Mike DiCuccio, Robert Smith * * File Description: * CSettings -- Repository for application settings. */#include <ncbi_pch.hpp>#include <gui/config/settings.hpp>#include <gui/utils/system_path.hpp>#include <serial/serial.hpp>#include <serial/objostr.hpp>#include <serial/objistr.hpp>#include <corelib/ncbifile.hpp>BEGIN_NCBI_SCOPEUSING_SCOPE(objects);namespace { const string kDefaultConfigFileName("plugin_config.asn");}CSettings::CSettings() : m_PCC(NULL), m_PluginConfigSaveFile(CSystemPath::ResolvePath("<home>", kDefaultConfigFileName)){}bool CSettings::IsSetPluginConfig(void) const{ return m_PCC;}bool CSettings::CanGetPluginConfig(void) const{ return IsSetPluginConfig();}const CPluginConfigCache& CSettings::GetPluginConfig(void) const{ return *m_PCC;}CPluginConfigCache& CSettings::SetPluginConfig(void){ if (! IsSetPluginConfig() ) { m_PCC.Reset( new CPluginConfigCache() ); } return *m_PCC;}void CSettings::SetPluginConfig(CPluginConfigCache& pcc){ m_PCC.Reset(&pcc);}void CSettings::ShutDown(void){ SavePluginConfig();}void CSettings::SavePluginConfig(const string& pcfile){ if (CanGetPluginConfig()) { WritePluginConfig(pcfile, GetPluginConfig()); }}void CSettings::SavePluginConfig(void){ if (CanGetPluginConfig()) { WritePluginConfig(GetPluginConfigWriteFile(), GetPluginConfig()); }}string CSettings::SetPluginConfigWriteFile(const string file_name){ string old_file(m_PluginConfigSaveFile); m_PluginConfigSaveFile = file_name; return old_file;}string CSettings::GetPluginConfigWriteFile() const{ return m_PluginConfigSaveFile;}void CSettings::LoadPluginConfig(void){ LoadPluginConfigFromString(GetBuiltInPluginConfig()); const string pcfile(kDefaultConfigFileName); string pcc_path; pcc_path = CDirEntry::MakePath(CSystemPath::ResolvePath("<std>", "etc"), pcfile); LoadPluginConfig(pcc_path); pcc_path = CDirEntry::MakePath(CSystemPath::ResolvePath("<home>", ""), pcfile); LoadPluginConfig(pcc_path);}void CSettings::LoadPluginConfigs(const string& pcfiles){ list<string> paths; NStr::Split(pcfiles, ",\t\n\r", paths); ITERATE(list<string>, pcfile_it, paths) { if ( ! (pcfile_it->empty())) { LoadPluginConfig(*pcfile_it); } } return;}void CSettings::LoadPluginConfig(const string& pc_file){ string pcfile = CSystemPath::ResolvePath(pc_file); CRef<CPluginConfigCache> config_cache(new CPluginConfigCache); if (ReadPluginConfig(pc_file, *config_cache)) { x_LoadPluginConfig(*config_cache); }}void CSettings::x_LoadPluginConfig(CPluginConfigCache& pcc){ if ( IsSetPluginConfig()) { SetPluginConfig().Merge(pcc); } else { SetPluginConfig(pcc); } return;}void CSettings::WritePluginConfig(const string& pcfile, const CPluginConfigCache& pcc){ try { auto_ptr<CObjectOStream> os(CObjectOStream::Open(eSerial_AsnText, pcfile)); *os << pcc; LOG_POST( Info << "CSettings::SavePluginConfig(): " "plugin config cache written to: " << pcfile); } catch (const CException& e) { LOG_POST( Error << "CSettings::SavePluginConfig(): " "Write of plugin config cache to " << pcfile << " failed."); LOG_POST( Error << e.what()); } return;}bool CSettings::ReadPluginConfig(const string& pcfile, objects::CPluginConfigCache& config_cache){ {{ // first check if the file exists. CFile file(pcfile); if ( ! file.Exists() ) { LOG_POST( Info << "CSettings::ReadPluginConfig(): " "no plugin config cache found at " << pcfile); return false; } }} // try reading in ASN.1 test format try { auto_ptr<CObjectIStream> is(CObjectIStream::Open(eSerial_AsnText, pcfile)); *is >> config_cache; LOG_POST( Info << "CSettings::ReadPluginConfig(): " "text plugin config cache read from: " << pcfile); return true; } catch (...) { _TRACE("read of ASN.1 text plugin config cache in " << pcfile << " failed"); } // try reading in ASN.1 binary format try { auto_ptr<CObjectIStream> is(CObjectIStream::Open(eSerial_AsnBinary, pcfile)); *is >> config_cache; LOG_POST( Info << "CSettings::ReadPluginConfig(): " "binary plugin config cache read from: " << pcfile); return true; } catch (...) { _TRACE("read of ASN.1 binary plugin config cache in " << pcfile << " failed"); } // if not, try reading in XML try { auto_ptr<CObjectIStream> is(CObjectIStream::Open(eSerial_Xml, pcfile)); *is >> config_cache; LOG_POST( Info << "CSettings::ReadPluginConfig(): " "XML plugin config cache read from: " << pcfile); return true; } catch (...) { _TRACE("read of XML plugin config cache in " << pcfile << " failed"); } // Log an error and continue. LOG_POST( Error << "CSettings::ReadPluginConfig(): " "File does not contain a plugin config cache: " << pcfile); return false;}/// method to allocate and create a PCC from a string with the asn1 source for it.void CSettings::LoadPluginConfigFromString(const string& asn1_str){ CRef<CPluginConfigCache> config_cache(new CPluginConfigCache); if (ReadPluginConfigFromString(asn1_str, *config_cache)) { x_LoadPluginConfig(*config_cache); }}bool CSettings::ReadPluginConfigFromString(const string& asn1_str, objects::CPluginConfigCache& config_cache){ try { CNcbiIstrstream is(asn1_str.c_str(), strlen(asn1_str.c_str())); auto_ptr<CObjectIStream> pcc_in(CObjectIStream::Open(eSerial_AsnText, is)); *pcc_in >> config_cache; LOG_POST( Info << "CSettings::LoadPluginConfigFromString(): " "text plugin config cache read from string: \"" << asn1_str.substr(0,20) << " ... \"" ); } catch (...) { _TRACE("read of ASN.1 text plugin config cache in string failed. String's first 100 chars are: " << asn1_str.substr(0, 100)); return false; } return true;}// defines sc_BuiltInASN.#include "settings_builtin.cpp"/// Get the string containing our built-in config settings in ASN format.string CSettings::GetBuiltInPluginConfig(){ return BuildString(sc_BuiltInASN);}/// Concatenate a bunch of cstrings into one string./// useful since on some platforms string literals must be of limited size.// MSVC++ compiler < 2096.string CSettings::BuildString(const char* cstrings[]){ string str; for (size_t i = 0; cstrings[i]; i++) { str += cstrings[i]; } return str;}END_NCBI_SCOPE/* * =========================================================================== * $Log: settings.cpp,v $ * Revision 1000.1 2004/06/01 20:43:22 gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5 * * Revision 1.5 2004/05/21 22:27:40 gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.4 2004/04/02 18:43:19 rsmith * comment added for builtin settings. * * Revision 1.3 2004/02/20 16:11:50 rsmith * somewhat better diagnostics on failure to write out settings. * * Revision 1.2 2004/02/18 17:16:24 dicuccio * Use static non-member string array for defaults * * Revision 1.1 2004/02/17 20:35:19 rsmith * moved core/settings.[ch]pp and core/system_path.[ch]pp to config and utils, respectively. * * Revision 1.8 2004/01/16 21:43:26 rsmith * Support for built-in configuration settings. * * Revision 1.7 2004/01/06 19:53:15 rsmith * Add method to read PCC ASN.1 values from strings. * Reorganize methods with static methods so that PCC reading and writing could be done * without linking in all the gui framework stuff. * * Revision 1.6 2003/11/06 20:05:09 dicuccio * Un-inlined code * * Revision 1.5 2003/08/25 18:54:01 rsmith * took out all the color stuff and made this the manager of the Plugin Config Cache, including reading writing it to disk. * * Revision 1.4 2003/08/22 15:46:10 dicuccio * Removed config file from CSettings - accessible through CNcbiApplication * * Revision 1.3 2003/05/30 12:56:50 dicuccio * Converted code to use MessageBox() instead of fl_ask()/fl_message()/fl_alert() * * Revision 1.2 2003/02/25 14:47:11 dicuccio * Added registry file to CSettings * * Revision 1.1 2003/01/15 21:06:34 dicuccio * Initial revision * * =========================================================================== */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?