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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: external_plugin_init.cpp,v $
  4.  * PRODUCTION Revision 1000.6  2004/06/01 20:56:07  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: external_plugin_init.cpp,v 1000.6 2004/06/01 20:56:07 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:  Auto-run plugin to initialize
  37.  *                    "external plugins"
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <gui/utils/exec.hpp>
  42. #include <objmgr/object_manager.hpp>
  43. #include <gui/core/idocument.hpp>
  44. #include <gui/core/plugin_utils.hpp>
  45. #include <gui/core/doc_manager.hpp>
  46. #include <gui/core/version.hpp>
  47. #include <gui/plugin/PluginInfo.hpp>
  48. #include <gui/plugin/PluginRequest.hpp>
  49. #include <gui/plugin/PluginCommandSet.hpp>
  50. #include <gui/plugin/PluginCommand.hpp>
  51. #include <corelib/ncbifile.hpp>
  52. #include <corelib/ncbiapp.hpp>
  53. #include <corelib/ncbireg.hpp>
  54. #include <gui/core/plugin_registry.hpp>
  55. #include <gui/core/algo_factory.hpp>
  56. #include <gui/utils/system_path.hpp>
  57. #include "external_plugin_init.hpp"
  58. #include "exec_plugin.hpp"
  59. #include <serial/objistr.hpp>
  60. #include <serial/objistrasn.hpp>
  61. #include <serial/objistrasnb.hpp>
  62. #include <serial/objistrxml.hpp>
  63. #include <serial/serial.hpp>
  64. BEGIN_NCBI_SCOPE
  65. USING_SCOPE(objects);
  66. void CExternalPluginInit::GetInfo(CPluginInfo& info)
  67. {
  68.     info.Reset();
  69.     // version info macro
  70.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  71.                  string(__DATE__) + " " + string(__TIME__),
  72.                  "CExternalPluginInit", "", "", "");
  73.     // command info
  74.     info.SetCommands().AddAlgoCommand(eAlgoCommand_run);
  75.     info.SetAutorun(true);
  76. }
  77. void CExternalPluginInit::RunCommand(CPluginMessage& msg)
  78. {
  79.     CPluginReply& reply = msg.SetReply();
  80.     reply.SetStatus(eMessageStatus_success);
  81.     CNcbiApplication* app = CNcbiApplication::Instance();
  82.     _ASSERT(app);
  83.     CNcbiRegistry& registry = app->GetConfig();
  84.     string dir;
  85.     // load 'external' plugins
  86.     if ( (dir = registry.Get("app", "external_path")).empty() ) {
  87.         registry.Set("app", "external_path", "<std>, <home>",
  88.                      CNcbiRegistry::ePersistent, " default external_path");
  89.     }
  90.     if ( !(dir = registry.Get("app", "external_path")).empty() ) {
  91.         x_LoadExternalPlugins(dir);
  92.     }
  93. }
  94. void CExternalPluginInit::x_LoadExternalPlugins(const string& path)
  95. {
  96.     // one instance of algo factory for all external executables
  97.     static CAlgoFactory<CExecPlugin> s_AlgoFactory_CExecPlugin;
  98.     
  99.     list<string> paths;
  100.     NStr::Split(path, ", tnr", paths);
  101.     ITERATE (list<string>, iter, paths) {
  102.         string dir_name;
  103.         if (*iter == "<std>"  ||  *iter == "<home>") {
  104.             dir_name = CSystemPath::ResolvePath(*iter, "executables");
  105.         } else {
  106.             dir_name = CSystemPath::ResolvePath(*iter, "");
  107.         }
  108.         if ( dir_name.empty() ) {
  109.             continue;
  110.         }
  111.         
  112.         //cout << "scanning plugin directory " << dir_name << "..." << endl;
  113.         CDir dir(dir_name);
  114.         if ( !dir.Exists() ) {
  115.             //cout << "  directory " << dir_name << " does not exist" << endl;
  116.             continue;
  117.         }
  118.         CDir::TEntries entries = dir.GetEntries("*");
  119.         ITERATE (CDir::TEntries, entry_iter, entries) {
  120.             if ( !(*entry_iter)->IsFile() ) {
  121.                 continue;
  122.             }
  123.             
  124.             string full_path = (*entry_iter)->GetPath();
  125.             string path      = (*entry_iter)->GetDir();
  126.             string file      = (*entry_iter)->GetName();
  127.             //
  128.             // get PluginInfo by executing executable
  129.             //
  130.             string std_in, std_out, std_err;
  131.             vector<string> arguments;
  132.             std_in = "action=info";   // cgi query string
  133.             STimeout timeout = {5, 0};  // 5 sec
  134.             CExecute::Exec(full_path, arguments,
  135.                            std_in, std_out, std_err, &timeout);
  136.                         
  137.             CRef<CPluginInfo> info(new CPluginInfo);
  138.             
  139.             try {
  140.                 istrstream foo(std_out.c_str());
  141.                 auto_ptr<CObjectIStream> is
  142.                     (CObjectIStream::Open(eSerial_AsnText, foo));
  143.                 *is >> *info;
  144.             }
  145.             catch (...) {
  146.                 LOG_POST(Error << "skipping " << full_path <<
  147.                          "; error getting PluginInfo");
  148.                 continue;
  149.             }
  150.             
  151.             //info->SetClass_name(full_path);
  152.             CPluginCommandSet& cmds = info->SetCommands();
  153.             if (!cmds.IsAlgo()) {
  154.                 LOG_POST(Error << "skipping " << full_path <<
  155.                          "; invalid PluginInfo (not an algo)");
  156.                 continue;
  157.             }
  158.             CPluginCommand& args = *cmds.SetAlgo().front();
  159.             CPluginArg& arg = args.SetArgs()
  160.                 .AddDefaultArgument("__executable_path",
  161.                                     "path name to executable",
  162.                                     CPluginArg::eString, full_path);
  163.             arg.SetHidden(1);  // path name argument should be invisible
  164.             // set menu item
  165.             info->SetMenu_item(string("Scripts/") + file);
  166.             CPluginRegistry::RegisterPlugin(info, &s_AlgoFactory_CExecPlugin);
  167.             LOG_POST(Info << "  registered "
  168.                      << full_path << " as external plugin");
  169.         }
  170.     }
  171. }
  172. END_NCBI_SCOPE
  173. /*
  174.  * ===========================================================================
  175.  * $Log: external_plugin_init.cpp,v $
  176.  * Revision 1000.6  2004/06/01 20:56:07  gouriano
  177.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  178.  *
  179.  * Revision 1.16  2004/05/21 22:27:47  gorelenk
  180.  * Added PCH ncbi_pch.hpp
  181.  *
  182.  * Revision 1.15  2004/02/17 20:35:26  rsmith
  183.  * moved core/settings.[ch]pp and core/system_path.[ch]pp to config and utils, respectively.
  184.  *
  185.  * Revision 1.14  2004/01/27 18:45:23  dicuccio
  186.  * Added missing header files
  187.  *
  188.  * Revision 1.13  2004/01/07 17:39:02  vasilche
  189.  * Fixed include path to genbank loader.
  190.  *
  191.  * Revision 1.12  2003/12/02 14:41:22  dicuccio
  192.  * Restored autorun
  193.  *
  194.  * Revision 1.11  2003/11/26 17:13:08  dicuccio
  195.  * Lots of code clean-up.  CHanged names of algorithms to CAlgoWebServices{Init}
  196.  *
  197.  * Revision 1.10  2003/11/24 15:45:30  dicuccio
  198.  * Renamed CVersion to CPluginVersion
  199.  *
  200.  * Revision 1.9  2003/11/04 21:17:46  dicuccio
  201.  * Changed calling semantics to match new plugin API
  202.  *
  203.  * Revision 1.8  2003/09/25 19:10:30  jcherry
  204.  * Moved exec.?pp to gui/utils
  205.  *
  206.  * Revision 1.7  2003/09/25 17:36:27  jcherry
  207.  * Renamed CExec to CExecute to avoid name conflict.  Made Exec()
  208.  * really return the process's exit status.
  209.  *
  210.  * Revision 1.6  2003/09/09 22:45:47  jcherry
  211.  * Added timeout
  212.  *
  213.  * Revision 1.5  2003/09/04 14:05:24  dicuccio
  214.  * Use IDocument instead of CDocument
  215.  *
  216.  * Revision 1.4  2003/07/30 17:03:57  jcherry
  217.  * Changed to put all externals into one menu, "Scripts"
  218.  *
  219.  * Revision 1.3  2003/07/30 15:18:05  dicuccio
  220.  * Cleaned up references to CGBench_System
  221.  *
  222.  * Revision 1.2  2003/07/29 18:12:58  jcherry
  223.  * Eliminated calls to methods of CGBenchApp, which caused missing symbols
  224.  * problem in gbench_plugin_scan on some platforms
  225.  *
  226.  * Revision 1.1  2003/07/28 18:19:42  jcherry
  227.  * Initial version
  228.  *
  229.  * ===========================================================================
  230.  */