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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: plugin_handle_impl.cpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 20:44:26  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: plugin_handle_impl.cpp,v 1000.5 2004/06/01 20:44:26 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
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/core/plugin.hpp>
  41. #include <gui/core/plugin_factory.hpp>
  42. #include <gui/core/plugin_exception.hpp>
  43. #include <gui/core/plugin_registry.hpp>
  44. #include <gui/plugin/PluginInfo.hpp>
  45. #include <gui/plugin/PluginLibInfo.hpp>
  46. #include <gui/plugin/PluginArgSet.hpp>
  47. #include <gui/plugin/PluginMessage.hpp>
  48. #include "plugin_handle_impl.hpp"
  49. #include <ctype.h>
  50. #include <corelib/ncbiapp.hpp>
  51. #include <corelib/ncbienv.hpp>
  52. #include <corelib/ncbifile.hpp>
  53. #include <corelib/ncbistr.hpp>
  54. #define DEFAULT_HELP_BASE 
  55.  "http://graceland:6224/projects/IEB-mj-docs/wiki/moin.cgi/GbenchPluginHelp"
  56. BEGIN_NCBI_SCOPE
  57. USING_SCOPE(objects);
  58. CPluginHandle_Impl::CPluginHandle_Impl(const CPluginLibInfo& info)
  59.     : m_Info(&info),
  60.       m_Factory(NULL)
  61. {
  62. }
  63. CPluginHandle_Impl::~CPluginHandle_Impl()
  64. {
  65. }
  66. // retrieve a plugin handle representing this implementation
  67. CPluginHandle CPluginHandle_Impl::GetHandle(void) const
  68. {
  69.     return CPluginHandle(const_cast<CPluginHandle_Impl&>(*this));
  70. }
  71. //
  72. //
  73. //
  74. // accessor functions
  75. //
  76. //
  77. //
  78. CPluginCommandSet::E_Choice CPluginHandle_Impl::GetCommand(void) const
  79. {
  80.     return m_Info->GetInfo().GetCommands().Which();
  81. }
  82. bool CPluginHandle_Impl::IsLoaded(void) const
  83. {
  84.     return m_Factory != NULL;
  85. }
  86. bool CPluginHandle_Impl::IsEnabled(void) const
  87. {
  88.     return m_Info->CanGetEnabled()  &&  m_Info->GetEnabled();
  89. }
  90. const CPluginInfo& CPluginHandle_Impl::GetInfo(void) const
  91. {
  92.     return m_Info->GetInfo();
  93. }
  94. const CPluginLibInfo& CPluginHandle_Impl::GetLibInfo(void) const
  95. {
  96.     return *m_Info;
  97. }
  98. const string& CPluginHandle_Impl::GetClassName(void) const
  99. {
  100.     return m_Info->GetInfo().GetClass_name();
  101. }
  102. const string CPluginHandle_Impl::GetHelpFile(void) const
  103. {
  104.     string s_help_expr = "";
  105.     if (m_Info->GetInfo().CanGetHelp_file()) {
  106.         s_help_expr = m_Info->GetInfo().GetHelp_file();
  107.     } else {
  108.         // Get class name with underscores removed
  109.         NStr::Replace(m_Info->GetInfo().GetClass_name(),
  110.                       "_", "", s_help_expr);
  111.     }
  112.     // If the help file is a simple URL, return it.
  113.     if (s_help_expr.find("http://", 0) == 0) {
  114.         return s_help_expr;
  115.     }
  116.     // Look up config
  117.     CNcbiApplication *my_app = CNcbiApplication::Instance();
  118.     _ASSERT(my_app);
  119.     // Non-absolute path implies config lookup
  120.     CNcbiRegistry& registry = my_app->GetConfig();
  121.     // If there's a variable in the config whose name
  122.     // is the expression, use the value of that variable
  123.     string s_help_path = 
  124.       registry.GetString("Help", "HELP_BASE", kEmptyStr);
  125.     s_help_path = 
  126.       registry.GetString("Help", "HELP_BASE", DEFAULT_HELP_BASE);
  127.     // Help path isn't empty, so turn it into a URL
  128.     if (s_help_path != kEmptyStr) {
  129.         s_help_expr = s_help_path + "/" + s_help_expr;
  130.     }
  131.     return s_help_expr;
  132. }
  133. const string& CPluginHandle_Impl::GetLibrary(void) const
  134. {
  135.     return m_Info->GetLibrary();
  136. }
  137. const string& CPluginHandle_Impl::GetMenuItem(void) const
  138. {
  139.     if (m_Info->GetInfo().CanGetMenu_item()) {
  140.         return m_Info->GetInfo().GetMenu_item();
  141.     }
  142.     static string s_str;
  143.     return s_str;
  144. }
  145. const string& CPluginHandle_Impl::GetToolTip(void) const
  146. {
  147.     if (m_Info->GetInfo().CanGetTooltip()) {
  148.         return m_Info->GetInfo().GetTooltip();
  149.     }
  150.     static string s_str;
  151.     return s_str;
  152. }
  153. int CPluginHandle_Impl::GetVerMajor(void) const
  154. {
  155.     return m_Info->GetInfo().GetVer_major();
  156. }
  157. int CPluginHandle_Impl::GetVerMinor(void) const
  158. {
  159.     return m_Info->GetInfo().GetVer_minor();
  160. }
  161. int CPluginHandle_Impl::GetVerRevision(void) const
  162. {
  163.     return m_Info->GetInfo().GetVer_revision();
  164. }
  165. const string& CPluginHandle_Impl::GetVerBuildDate(void) const
  166. {
  167.     return m_Info->GetInfo().GetVer_build_date();
  168. }
  169. CRef<CPluginMessage> CPluginHandle_Impl::CreateMessage(EAlgoCommand cmd)
  170. {
  171.     CRef<CPluginMessage> msg(new CPluginMessage());
  172.     msg->SetDestination(GetClassName());
  173.     FillDefaults(cmd, msg->SetRequest().SetAlgo());
  174.     return msg;
  175. }
  176. CRef<CPluginMessage> CPluginHandle_Impl::CreateMessage(EDataCommand cmd)
  177. {
  178.     CRef<CPluginMessage> msg(new CPluginMessage());
  179.     msg->SetDestination(GetClassName());
  180.     FillDefaults(cmd, msg->SetRequest().SetData());
  181.     return msg;
  182. }
  183. CRef<CPluginMessage> CPluginHandle_Impl::CreateMessage(EViewCommand cmd)
  184. {
  185.     CRef<CPluginMessage> msg(new CPluginMessage());
  186.     msg->SetDestination(GetClassName());
  187.     FillDefaults(cmd, msg->SetRequest().SetView());
  188.     return msg;
  189. }
  190. //
  191. // determine if a given command subtype is supported
  192. //
  193. bool CPluginHandle_Impl::HasCommandSubtype(EAlgoCommand cmd) const
  194. {
  195.     if ( GetCommand() != CPluginCommandSet::e_Algo ) {
  196.         return false;
  197.     }
  198.     ITERATE (CPluginCommandSet::TAlgo, iter, m_Info->GetCommands().GetAlgo()) {
  199.         if ( (*iter)->GetCommand() == cmd) {
  200.             return true;
  201.         }
  202.     }
  203.     return false;
  204. }
  205. bool CPluginHandle_Impl::HasCommandSubtype(EDataCommand cmd) const
  206. {
  207.     if ( GetCommand() != CPluginCommandSet::e_Data ) {
  208.         return false;
  209.     }
  210.     ITERATE (CPluginCommandSet::TData, iter, m_Info->GetCommands().GetData()) {
  211.         if ( (*iter)->GetCommand() == cmd) {
  212.             return true;
  213.         }
  214.     }
  215.     return false;
  216. }
  217. bool CPluginHandle_Impl::HasCommandSubtype(EViewCommand cmd) const
  218. {
  219.     if ( GetCommand() != CPluginCommandSet::e_View ) {
  220.         return false;
  221.     }
  222.     ITERATE (CPluginCommandSet::TView, iter, m_Info->GetCommands().GetView()) {
  223.         if ( (*iter)->GetCommand() == cmd) {
  224.             return true;
  225.         }
  226.     }
  227.     return false;
  228. }
  229. //
  230. // fill in the default set of arguments for a given command
  231. //
  232. template <class Command>
  233. inline bool s_FillDefaults(Command cmd, CPluginCommand& args,
  234.                            const list< CRef<CPluginCommand> >& cmd_list)
  235. {
  236.     ITERATE (list< CRef<CPluginCommand> >, iter, cmd_list) {
  237.         const CPluginCommand& pcmd = **iter;
  238.         if ( pcmd.CanGetCommand()  &&  pcmd.GetCommand() == cmd) {
  239.             
  240.             args.SetCommand(pcmd.GetCommand());
  241.             if (pcmd.CanGetContext()) {
  242.                 args.SetContext(pcmd.GetContext());
  243.             }
  244.             if (pcmd.CanGetArgs()) {
  245.                 args.SetArgs(const_cast<CPluginArgSet&>(pcmd.GetArgs()));
  246.             }
  247.             return true;
  248.         }
  249.     }
  250.     return false;
  251. }
  252. bool CPluginHandle_Impl::FillDefaults(EAlgoCommand cmd,
  253.                                       CPluginCommand& args) const
  254. {
  255.     if (GetCommand() != CPluginCommandSet::e_Algo) {
  256.         return false;
  257.     }
  258.     return s_FillDefaults(cmd, args, x_GetWorkingSet().GetCommands().GetAlgo());
  259. }
  260. bool CPluginHandle_Impl::FillDefaults(EDataCommand cmd,
  261.                                       CPluginCommand& args) const
  262. {
  263.     if (GetCommand() != CPluginCommandSet::e_Data) {
  264.         return false;
  265.     }
  266.     return s_FillDefaults(cmd, args, x_GetWorkingSet().GetCommands().GetData());
  267. }
  268. bool CPluginHandle_Impl::FillDefaults(EViewCommand cmd,
  269.                                       CPluginCommand& args) const
  270. {
  271.     if (GetCommand() != CPluginCommandSet::e_View) {
  272.         return false;
  273.     }
  274.     return s_FillDefaults(cmd, args, x_GetWorkingSet().GetCommands().GetView());
  275. }
  276. CPluginLibInfo& CPluginHandle_Impl::x_GetWorkingSet(void) const
  277. {
  278.     if ( !m_WorkingInfo ) {
  279.         m_WorkingInfo.Reset(new CPluginLibInfo());
  280.         m_WorkingInfo->Assign(*m_Info);
  281.     }
  282.     return *m_WorkingInfo;
  283. }
  284. //
  285. // Execute()
  286. // This is the main interface function; it is forwarded to the actual plugin.
  287. //
  288. void CPluginHandle_Impl::Execute(CPluginMessage& msg)
  289. {
  290.     // !!! temporary implementation !!!
  291.     string context;
  292.     if (msg.CanGetContext()) {
  293.         context = msg.GetContext();
  294.     }
  295.     CRef<CPluginBase> plugin(x_GetPlugin(context));
  296.     plugin->Execute(msg);
  297. }
  298. //
  299. // FinalizeArgs()
  300. // This is the main interface function; it is forwarded to the actual plugin.
  301. //
  302. void CPluginHandle_Impl::FinalizeArgs(CPluginMessage& msg)
  303. {
  304.     // !!! temporary implementation !!!
  305.     string context;
  306.     if (msg.CanGetContext()) {
  307.         context = msg.GetContext();
  308.     }
  309.     CRef<CPluginBase> plugin(x_GetPlugin(context));
  310.     plugin->FinalizeArgs(msg);
  311. }
  312. void CPluginHandle_Impl::x_SetFactory(CPluginFactoryBase* factory) const
  313. {
  314.     m_Factory = factory;
  315. }
  316. CPluginBase* CPluginHandle_Impl::x_GetPlugin(const string& ctx_name)
  317. {
  318.     if ( !m_Factory ) {
  319.         CPluginRegistry::x_LoadLibrary(GetLibrary());
  320.     }
  321.     if ( !m_Factory ) {
  322.         NCBI_THROW(CPluginException, ePluginLoadFailed,
  323.                    "Failed to load plugin library " + GetLibrary());
  324.     }
  325.     // retrieve a plugin based on its context
  326.     TPluginDict::iterator iter = m_PluginDict.find(ctx_name);
  327.     if (iter == m_PluginDict.end()) {
  328.         m_PluginDict[ctx_name].Reset(m_Factory->GetPlugin());
  329.         iter = m_PluginDict.find(ctx_name);
  330.     }
  331.     return iter->second;
  332. }
  333. END_NCBI_SCOPE
  334. /*
  335.  * ===========================================================================
  336.  * $Log: plugin_handle_impl.cpp,v $
  337.  * Revision 1000.5  2004/06/01 20:44:26  gouriano
  338.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  339.  *
  340.  * Revision 1.16  2004/05/25 17:08:50  dicuccio
  341.  * Added CreateMessage() API to generate a new plugin message for a given plugin
  342.  * call
  343.  *
  344.  * Revision 1.15  2004/05/21 22:27:40  gorelenk
  345.  * Added PCH ncbi_pch.hpp
  346.  *
  347.  * Revision 1.14  2004/04/14 20:14:43  jcherry
  348.  * Removed invalid "flag" (CNcbiRegistry::eReturn) from calls to
  349.  * CNcbiRegistry::GetString() (was being ignored and provoking an
  350.  * error message)
  351.  *
  352.  * Revision 1.13  2004/02/13 04:03:02  ucko
  353.  * #include <ctype.h> rather than <cctype>, which some compilers (MIPSpro
  354.  * anyway) lack.
  355.  *
  356.  * Revision 1.12  2004/02/12 23:03:02  mjohnson
  357.  * Added documentation lookup.
  358.  *
  359.  * Revision 1.11  2004/02/03 21:23:48  dicuccio
  360.  * Added standard accessors for the working set of plugin args
  361.  *
  362.  * Revision 1.10  2004/01/15 22:50:17  jcherry
  363.  * Added FinalizeArgs() for plugins
  364.  *
  365.  * Revision 1.9  2003/12/23 20:23:21  jcherry
  366.  * Make argument values persist across invocations of plugin
  367.  *
  368.  * Revision 1.8  2003/11/06 20:04:07  dicuccio
  369.  * Refactored FillDefaults().  Added option to have cached set of arguments
  370.  *
  371.  * Revision 1.7  2003/11/04 17:18:41  dicuccio
  372.  * Changed calling API for plugins - take CPluginMessage directly instead of
  373.  * paired command/reply
  374.  *
  375.  * Revision 1.6  2003/10/23 16:16:36  dicuccio
  376.  * Exposed CPluginLibInfo
  377.  *
  378.  * Revision 1.5  2003/08/05 17:07:15  dicuccio
  379.  * Changed calling semantics for the message queue - pass by reference, not
  380.  * CConstRef<>
  381.  *
  382.  * Revision 1.4  2003/08/02 12:51:07  dicuccio
  383.  * Enabled the context dictionary inside of plugin handles
  384.  *
  385.  * Revision 1.3  2003/07/14 11:01:06  shomrat
  386.  * Plugin messageing system related changes
  387.  *
  388.  * Revision 1.2  2003/07/11 12:37:37  dicuccio
  389.  * Made many string members of CPluginInfo optional; added checks for safe
  390.  * retrieval
  391.  *
  392.  * Revision 1.1  2003/06/25 17:02:54  dicuccio
  393.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  394.  * implementation file.  Lots of #include file clean-ups.
  395.  *
  396.  * ===========================================================================
  397.  */