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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: exec_plugin.cpp,v $
  4.  * PRODUCTION Revision 1000.6  2004/06/01 20:56:02  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: exec_plugin.cpp,v 1000.6 2004/06/01 20:56:02 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:  Execute an external program as a plugin
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/utils/exec.hpp>
  41. #include "../basic/output_dlg.hpp"
  42. #include <gui/core/idocument.hpp>
  43. #include <gui/core/plugin_utils.hpp>
  44. #include <gui/plugin/PluginRequest.hpp>
  45. #include <gui/plugin/PluginInfo.hpp>
  46. #include <gui/plugin/PluginCommandSet.hpp>
  47. #include <gui/plugin/PluginValueConstraint.hpp>
  48. #include <gui/core/version.hpp>
  49. #include "exec_plugin.hpp"
  50. #include "plugin_args_as_strs.hpp"
  51. #include <objmgr/util/sequence.hpp>
  52. #include <objmgr/scope.hpp>
  53. #include <objmgr/seq_vector.hpp>
  54. #include <objects/seqloc/Seq_loc.hpp>
  55. #include <connect/ncbi_pipe.hpp>
  56. #include <cgi/ncbicgi.hpp>
  57. BEGIN_NCBI_SCOPE
  58. USING_SCOPE(objects);
  59. // stuff for running external apps
  60. void CExecPlugin::GetInfo(CPluginInfo& info)
  61. {
  62.     info.Reset();
  63.     // version info macro
  64.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  65.                  string(__DATE__) + " " + string(__TIME__),
  66.                  "CExecPlugin", "This should not appear in a menu",
  67.                  "An interface for running external executables",
  68.                  "");
  69.     // command info
  70.     CPluginCommandSet& cmds = info.SetCommands();
  71.     CPluginCommand&    args = cmds.AddAlgoCommand(eAlgoCommand_run);
  72.     args.AddArgument("locs", "Sequences to evaluate",
  73.                      CSeq_loc::GetTypeInfo(),
  74.                      CPluginArg::TData::e_Array);
  75.     args.SetConstraint("locs",
  76.                        *CPluginValueConstraint::CreateSeqSameMol());
  77.     args.AddArgument("__executable_path", "path name to executable",
  78.                      CPluginArg::eString);
  79. }
  80. void CExecPlugin::RunCommand(CPluginMessage& msg)
  81. {
  82.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  83.     CPluginReply& reply = msg.SetReply();
  84.     _TRACE("CExecPlugin::Run()");
  85.     if ( !m_OutputDlg.get() ) {
  86.         m_OutputDlg.reset(new COutputDlg());
  87.     }
  88.     m_OutputDlg->SetTitle("Results of executing external app");
  89.     const CPluginArgSet_Base::Tdata& argset = args.GetArgs().Get();
  90.     vector<string> keys, values;
  91.     try {
  92.         PluginArgsAsStrs(argset, keys, values);
  93.     }
  94.     catch (...) {
  95.         LOG_POST(Info << "CExecPlugin: couldn't convert to string rep");
  96.         reply.SetStatus(eMessageStatus_failed);
  97.         return;
  98.     }
  99.     keys.push_back("action");
  100.     values.push_back("run");
  101.     string std_in;
  102.     for (unsigned int i = 0;  i < keys.size();  i++) {
  103.         if (i > 0) {
  104.             std_in += '&';
  105.         }
  106.         std_in += URL_EncodeString(keys[i]) + "="
  107.             + URL_EncodeString(values[i]);
  108.     }
  109.     
  110.     string std_out, std_err;
  111.     vector<string> arguments;
  112.     CExecute::Exec(args["__executable_path"].AsString(), arguments,
  113.                    std_in, std_out, std_err );
  114.     string str;
  115.     str += "standard output:nn";
  116.     str += std_out + "nn";
  117.     str += "standard error:nn";
  118.     str += std_err + "nn";
  119.     m_OutputDlg->SetText(str);
  120.     m_OutputDlg->Show();
  121.     reply.SetStatus(eMessageStatus_success);
  122. }
  123. END_NCBI_SCOPE
  124. /*
  125.  * ===========================================================================
  126.  * $Log: exec_plugin.cpp,v $
  127.  * Revision 1000.6  2004/06/01 20:56:02  gouriano
  128.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18
  129.  *
  130.  * Revision 1.18  2004/05/21 22:27:47  gorelenk
  131.  * Added PCH ncbi_pch.hpp
  132.  *
  133.  * Revision 1.17  2004/01/27 18:45:22  dicuccio
  134.  * Added missing header files
  135.  *
  136.  * Revision 1.16  2003/11/26 15:31:36  jcherry
  137.  * Use external function to convert plugin arguments to strings
  138.  *
  139.  * Revision 1.15  2003/11/24 15:45:29  dicuccio
  140.  * Renamed CVersion to CPluginVersion
  141.  *
  142.  * Revision 1.14  2003/11/06 21:17:19  ucko
  143.  * Adjust for scope fixes in public headers.
  144.  *
  145.  * Revision 1.13  2003/11/04 21:17:46  dicuccio
  146.  * Changed calling semantics to match new plugin API
  147.  *
  148.  * Revision 1.12  2003/10/28 14:06:47  dicuccio
  149.  * Fixed compilation errors after change in CPluginValue
  150.  *
  151.  * Revision 1.11  2003/10/07 15:31:17  ucko
  152.  * Fixed fallout from URL -> Value conversion
  153.  *
  154.  * Revision 1.10  2003/10/07 13:47:04  dicuccio
  155.  * Renamed CPluginURL* to CPluginValue*
  156.  *
  157.  * Revision 1.9  2003/09/25 19:10:30  jcherry
  158.  * Moved exec.?pp to gui/utils
  159.  *
  160.  * Revision 1.8  2003/09/25 17:36:27  jcherry
  161.  * Renamed CExec to CExecute to avoid name conflict.  Made Exec()
  162.  * really return the process's exit status.
  163.  *
  164.  * Revision 1.7  2003/09/04 17:34:04  ucko
  165.  * Really use IDocument instead of CDocument.
  166.  *
  167.  * Revision 1.6  2003/09/04 14:05:24  dicuccio
  168.  * Use IDocument instead of CDocument
  169.  *
  170.  * Revision 1.5  2003/09/03 14:46:53  rsmith
  171.  * change namespace name from args to plugin_args to avoid clashes with variable names.
  172.  *
  173.  * Revision 1.4  2003/09/02 23:12:02  jcherry
  174.  * Partial accommodation of changes to CPipe
  175.  *
  176.  * Revision 1.3  2003/08/25 14:00:48  jcherry
  177.  * Changed to handle optional arguments that are left blank
  178.  *
  179.  * Revision 1.2  2003/08/21 12:03:08  dicuccio
  180.  * Make use of new typedef in plugin_utils.hpp for argument values.
  181.  *
  182.  * Revision 1.1  2003/07/28 18:19:42  jcherry
  183.  * Initial version
  184.  *
  185.  * ===========================================================================
  186.  */