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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: plugin_info_from_reg.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 20:56:11  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: plugin_info_from_reg.cpp,v 1000.3 2004/06/01 20:56:11 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:  Josh Cherry
  35.  *
  36.  * File Description:  Create plugin info objects from registry
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "plugin_info_from_reg.hpp"
  41. #include <gui/core/plugin_utils.hpp>
  42. #include <gui/plugin/PluginValueConstraint.hpp>
  43. #include <gui/plugin/PluginCommand.hpp>
  44. #include <gui/plugin/PluginCommandSet.hpp>
  45. #include <gui/core/selection_buffer.hpp>
  46. #include <gui/core/version.hpp>
  47. #include <corelib/ncbireg.hpp>
  48. #include <util/regexp.hpp>
  49. #include <algorithm>
  50. BEGIN_NCBI_SCOPE
  51. USING_SCOPE(objects);
  52. // compare strings s.t. all foo.bar come right after foo
  53. // and compare equal to each other
  54. struct SCompare
  55. {
  56. public:
  57.     bool operator()(const string& lhs, const string& rhs) const
  58.     {
  59.         for (unsigned int i = 0;  ; i++) {
  60.             if (i == lhs.size()) {
  61.                 return i != rhs.size();
  62.             }
  63.             if (i == rhs.size()) {
  64.                 return false;
  65.             }
  66.             if (rhs[i] == '.') {
  67.                 // even if lhs[i] == '.' too
  68.                 return false;
  69.             }
  70.             if (lhs[i] == rhs[i]) {
  71.                 continue;
  72.             }
  73.             if (lhs[i] == '.') {
  74.                 return true;
  75.             }
  76.             return lhs[i] < rhs[i];
  77.         }
  78.     }
  79. };
  80. void PluginInfoFromRegistry(const CNcbiRegistry& reg,
  81.                             vector<CRef<CPluginInfo> >& plugins,
  82.                             const vector<string>& sect_order)
  83. {
  84.     // if sect_order is empty, use the order returned by
  85.     // EnumerateSections
  86.     vector<string> sections;
  87.     if (sect_order.empty()) {
  88.         list<string> sec_tmp;
  89.         reg.EnumerateSections(&sec_tmp);
  90.         sections.reserve(sec_tmp.size());
  91.         ITERATE (list<string>, iter, sec_tmp) {
  92.             sections.push_back(*iter);
  93.         }
  94.     } else {
  95.         sections = sect_order;
  96.     }
  97.     std::stable_sort(sections.begin(), sections.end(), SCompare());
  98.     vector<string>::iterator section = sections.begin();
  99.     while (section != sections.end()) {
  100.         CRef<CPluginInfo> info(new CPluginInfo);
  101.         // the name used in section headings; may have no
  102.         // relationship to the "class name"
  103.         string plugin_name = *section;
  104.         // basic info from this plugin
  105.         int ver_major = reg.GetInt(plugin_name, "ver-major", 0);
  106.         int ver_minor = reg.GetInt(plugin_name, "ver-minor", 0);
  107.         int ver_revision = reg.GetInt(plugin_name, "ver-revision", 0);
  108.         string ver_build_date = reg.GetString(plugin_name,
  109.                                               "ver-build-date", "unknown");
  110.         string class_name = reg.Get(plugin_name, "class-name");
  111.         string menu_item = reg.Get(plugin_name, "menu-item");
  112.         string tool_tip = reg.Get(plugin_name, "tool-tip");
  113.         string help_file = reg.Get(plugin_name, "help-file");
  114.     
  115.         info->SetInfo(ver_major, ver_minor, ver_revision, ver_build_date,
  116.                       class_name, menu_item, tool_tip, help_file);
  117.         CPluginCommandSet& cmds = info->SetCommands();
  118.         CPluginCommand&    args = cmds.AddAlgoCommand(eAlgoCommand_run);
  119.         // each section of form *section + '.' + something defines
  120.         // one plugin argument
  121.         ++section;
  122.         while (1) {
  123.             if (section == sections.end() ||
  124.                 !NStr::StartsWith(*section, plugin_name + '.')) {
  125.                 break;
  126.             }
  127.             string name = reg.Get(*section, "name");
  128.             string desc = reg.Get(*section, "desc");
  129.             // a default value, if present
  130.             string value = reg.Get(*section, "value");
  131.             string type_str = reg.Get(*section, "type");
  132.             bool optional = reg.GetBool(*section, "optional", false);
  133.             // whether it's an array (otherwise single)
  134.             bool array = reg.GetBool(*section, "array", false);
  135.             bool hidden = reg.GetBool(*section, "hidden", false);
  136.             string constraint_set = reg.Get(*section, "constraint-set");
  137.             // now some consistency checks
  138.             if (array && !value.empty()) {
  139.                 throw runtime_error("array parameter can't have "
  140.                                     "default value");
  141.             }
  142.             if (hidden && value.empty() && !optional) {
  143.                 throw runtime_error("non-optional hidden argument "
  144.                                     "must have a default value");
  145.             }
  146.             // figure out the argument's type
  147.             CPluginArg::EType type;
  148.             if (type_str == "boolean") {
  149.                 type = CPluginArg::eBoolean;
  150.             } else if (type_str == "double") {
  151.                 type = CPluginArg::eDouble;
  152.             } else if (type_str == "integer") {
  153.                 type = CPluginArg::eInteger;
  154.             } else if (type_str == "string") {
  155.                 type = CPluginArg::eString;
  156.             } else if (type_str == "seq" || type_str == "naseq"
  157.                        || type_str == "aaseq") {
  158.                 type = CPluginArg::eObject;
  159.             } else {
  160.                 throw runtime_error(string("unrecognized type: ") + type_str);
  161.             }
  162.             if (type != CPluginArg::eObject) {
  163.                 if (value.empty() && !optional) {
  164.                     args.AddArgument(name, desc, type,
  165.                                      array ? CPluginArg::TData::e_Array
  166.                                      : CPluginArg::TData::e_Single);
  167.                 } else if (optional) {
  168.                     args.AddOptionalArgument(name, desc, type,
  169.                                              array ? CPluginArg::TData::e_Array
  170.                                              : CPluginArg::TData::e_Single);
  171.                 } else {
  172.                     args.AddDefaultArgument(name, desc, type, value);
  173.                 }
  174.                 if (hidden) {
  175.                     args[name].SetHidden(1);
  176.                 }
  177.                 if (!constraint_set.empty()) {
  178.                     vector<string> elements;
  179.                     NStr::Tokenize(constraint_set, "n", elements);
  180.                     CPluginValueConstraint *code_list =
  181.                         CPluginValueConstraint::CreateSet();
  182.                     ITERATE (vector<string>, element, elements) {
  183.                         code_list->SetSet().push_back(*element);
  184.                     }
  185.                     args.SetConstraint(name, *code_list);
  186.                 }
  187.             } else {
  188.                 // a Seq-loc
  189.                 if (!value.empty()) {
  190.                     throw runtime_error("Seq-loc parameter can't have "
  191.                                         "default value");
  192.                 }
  193.                 if (hidden) {
  194.                     throw runtime_error("Seq-loc parameter can't be hidden");
  195.                 }
  196.                 args.AddArgument(name, desc,
  197.                                  CSeq_loc::GetTypeInfo(),
  198.                                  array ? CPluginArg::TData::e_Array
  199.                                  : CPluginArg::TData::e_Single);
  200.                 if (type_str == "naseq") {
  201.                     args.SetConstraint
  202.                         (name,
  203.                          (*CPluginValueConstraint::CreateSeqMol(),
  204.                           CSeq_inst::eMol_na,
  205.                           CSeq_inst::eMol_dna,
  206.                           CSeq_inst::eMol_rna));
  207.                 } else if (type_str == "aaseq") {
  208.                     args.SetConstraint
  209.                         (name,
  210.                          (*CPluginValueConstraint::CreateSeqMol(),
  211.                           CSeq_inst::eMol_aa));
  212.                 }
  213.             }
  214.             ++section;
  215.         }
  216.         plugins.push_back(info);
  217.     }
  218. }
  219. void PluginInfoFromRegistry(CNcbiIstream& istr,
  220.                             vector<CRef<CPluginInfo> >& plugins)
  221. {
  222.     CT_POS_TYPE pos = istr.tellg();
  223.     
  224.     // get section names in order
  225.     vector<string> sect_order;
  226.     string line;
  227.     CRegexp re("^ *\[ *([^ ]*) *\] *$");
  228.     while(getline(istr, line)) {
  229.         if (!re.GetMatch(line.c_str(), 0).empty()) {
  230.             const int *name_range = re.GetResults(1);
  231.             string name = line.substr(name_range[0],
  232.                                       name_range[1] - name_range[0]);
  233.             sect_order.push_back(name);
  234.         }
  235.     }
  236.     // back up in stream and make a registry
  237.     istr.clear();  // because getline failed
  238.     istr.seekg(pos);
  239.     CNcbiRegistry reg(istr);
  240.     
  241.     PluginInfoFromRegistry(reg, plugins, sect_order);
  242. }
  243. END_NCBI_SCOPE
  244. /*
  245.  * ===========================================================================
  246.  * $Log: plugin_info_from_reg.cpp,v $
  247.  * Revision 1000.3  2004/06/01 20:56:11  gouriano
  248.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  249.  *
  250.  * Revision 1.7  2004/05/21 22:27:47  gorelenk
  251.  * Added PCH ncbi_pch.hpp
  252.  *
  253.  * Revision 1.6  2004/01/27 18:45:24  dicuccio
  254.  * Added missing header files
  255.  *
  256.  * Revision 1.5  2003/12/10 16:08:50  ucko
  257.  * Change the pos_type substitute (needed on GCC 2.95) to CT_POS_TYPE.
  258.  *
  259.  * Revision 1.4  2003/12/10 12:31:22  dicuccio
  260.  * Replace ios::pos_type with size_t to make Alpha compile happy
  261.  *
  262.  * Revision 1.3  2003/12/04 00:36:54  jcherry
  263.  * Preserve order of plugin parameters specified in registry format
  264.  *
  265.  * Revision 1.2  2003/12/02 14:41:02  dicuccio
  266.  * Fixed compilation errors on MSVC - don't sort std::list()
  267.  *
  268.  * Revision 1.1  2003/12/01 23:13:20  jcherry
  269.  * Initial version
  270.  *
  271.  * ===========================================================================
  272.  */