plugin_handle_impl.cpp
来自「ncbi源码」· C++ 代码 · 共 502 行
CPP
502 行
/* * =========================================================================== * PRODUCTION $Log: plugin_handle_impl.cpp,v $ * PRODUCTION Revision 1000.5 2004/06/01 20:44:26 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16 * PRODUCTION * =========================================================================== *//* $Id: plugin_handle_impl.cpp,v 1000.5 2004/06/01 20:44:26 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 * * File Description: * */#include <ncbi_pch.hpp>#include <gui/core/plugin.hpp>#include <gui/core/plugin_factory.hpp>#include <gui/core/plugin_exception.hpp>#include <gui/core/plugin_registry.hpp>#include <gui/plugin/PluginInfo.hpp>#include <gui/plugin/PluginLibInfo.hpp>#include <gui/plugin/PluginArgSet.hpp>#include <gui/plugin/PluginMessage.hpp>#include "plugin_handle_impl.hpp"#include <ctype.h>#include <corelib/ncbiapp.hpp>#include <corelib/ncbienv.hpp>#include <corelib/ncbifile.hpp>#include <corelib/ncbistr.hpp>#define DEFAULT_HELP_BASE \ "http://graceland:6224/projects/IEB-mj-docs/wiki/moin.cgi/GbenchPluginHelp"BEGIN_NCBI_SCOPEUSING_SCOPE(objects);CPluginHandle_Impl::CPluginHandle_Impl(const CPluginLibInfo& info) : m_Info(&info), m_Factory(NULL){}CPluginHandle_Impl::~CPluginHandle_Impl(){}// retrieve a plugin handle representing this implementationCPluginHandle CPluginHandle_Impl::GetHandle(void) const{ return CPluginHandle(const_cast<CPluginHandle_Impl&>(*this));}//////// accessor functions//////CPluginCommandSet::E_Choice CPluginHandle_Impl::GetCommand(void) const{ return m_Info->GetInfo().GetCommands().Which();}bool CPluginHandle_Impl::IsLoaded(void) const{ return m_Factory != NULL;}bool CPluginHandle_Impl::IsEnabled(void) const{ return m_Info->CanGetEnabled() && m_Info->GetEnabled();}const CPluginInfo& CPluginHandle_Impl::GetInfo(void) const{ return m_Info->GetInfo();}const CPluginLibInfo& CPluginHandle_Impl::GetLibInfo(void) const{ return *m_Info;}const string& CPluginHandle_Impl::GetClassName(void) const{ return m_Info->GetInfo().GetClass_name();}const string CPluginHandle_Impl::GetHelpFile(void) const{ string s_help_expr = ""; if (m_Info->GetInfo().CanGetHelp_file()) { s_help_expr = m_Info->GetInfo().GetHelp_file(); } else { // Get class name with underscores removed NStr::Replace(m_Info->GetInfo().GetClass_name(), "_", "", s_help_expr); } // If the help file is a simple URL, return it. if (s_help_expr.find("http://", 0) == 0) { return s_help_expr; } // Look up config CNcbiApplication *my_app = CNcbiApplication::Instance(); _ASSERT(my_app); // Non-absolute path implies config lookup CNcbiRegistry& registry = my_app->GetConfig(); // If there's a variable in the config whose name // is the expression, use the value of that variable string s_help_path = registry.GetString("Help", "HELP_BASE", kEmptyStr); s_help_path = registry.GetString("Help", "HELP_BASE", DEFAULT_HELP_BASE); // Help path isn't empty, so turn it into a URL if (s_help_path != kEmptyStr) { s_help_expr = s_help_path + "/" + s_help_expr; } return s_help_expr;}const string& CPluginHandle_Impl::GetLibrary(void) const{ return m_Info->GetLibrary();}const string& CPluginHandle_Impl::GetMenuItem(void) const{ if (m_Info->GetInfo().CanGetMenu_item()) { return m_Info->GetInfo().GetMenu_item(); } static string s_str; return s_str;}const string& CPluginHandle_Impl::GetToolTip(void) const{ if (m_Info->GetInfo().CanGetTooltip()) { return m_Info->GetInfo().GetTooltip(); } static string s_str; return s_str;}int CPluginHandle_Impl::GetVerMajor(void) const{ return m_Info->GetInfo().GetVer_major();}int CPluginHandle_Impl::GetVerMinor(void) const{ return m_Info->GetInfo().GetVer_minor();}int CPluginHandle_Impl::GetVerRevision(void) const{ return m_Info->GetInfo().GetVer_revision();}const string& CPluginHandle_Impl::GetVerBuildDate(void) const{ return m_Info->GetInfo().GetVer_build_date();}CRef<CPluginMessage> CPluginHandle_Impl::CreateMessage(EAlgoCommand cmd){ CRef<CPluginMessage> msg(new CPluginMessage()); msg->SetDestination(GetClassName()); FillDefaults(cmd, msg->SetRequest().SetAlgo()); return msg;}CRef<CPluginMessage> CPluginHandle_Impl::CreateMessage(EDataCommand cmd){ CRef<CPluginMessage> msg(new CPluginMessage()); msg->SetDestination(GetClassName()); FillDefaults(cmd, msg->SetRequest().SetData()); return msg;}CRef<CPluginMessage> CPluginHandle_Impl::CreateMessage(EViewCommand cmd){ CRef<CPluginMessage> msg(new CPluginMessage()); msg->SetDestination(GetClassName()); FillDefaults(cmd, msg->SetRequest().SetView()); return msg;}//// determine if a given command subtype is supported//bool CPluginHandle_Impl::HasCommandSubtype(EAlgoCommand cmd) const{ if ( GetCommand() != CPluginCommandSet::e_Algo ) { return false; } ITERATE (CPluginCommandSet::TAlgo, iter, m_Info->GetCommands().GetAlgo()) { if ( (*iter)->GetCommand() == cmd) { return true; } } return false;}bool CPluginHandle_Impl::HasCommandSubtype(EDataCommand cmd) const{ if ( GetCommand() != CPluginCommandSet::e_Data ) { return false; } ITERATE (CPluginCommandSet::TData, iter, m_Info->GetCommands().GetData()) { if ( (*iter)->GetCommand() == cmd) { return true; } } return false;}bool CPluginHandle_Impl::HasCommandSubtype(EViewCommand cmd) const{ if ( GetCommand() != CPluginCommandSet::e_View ) { return false; } ITERATE (CPluginCommandSet::TView, iter, m_Info->GetCommands().GetView()) { if ( (*iter)->GetCommand() == cmd) { return true; } } return false;}//// fill in the default set of arguments for a given command//template <class Command>inline bool s_FillDefaults(Command cmd, CPluginCommand& args, const list< CRef<CPluginCommand> >& cmd_list){ ITERATE (list< CRef<CPluginCommand> >, iter, cmd_list) { const CPluginCommand& pcmd = **iter; if ( pcmd.CanGetCommand() && pcmd.GetCommand() == cmd) { args.SetCommand(pcmd.GetCommand()); if (pcmd.CanGetContext()) { args.SetContext(pcmd.GetContext()); } if (pcmd.CanGetArgs()) { args.SetArgs(const_cast<CPluginArgSet&>(pcmd.GetArgs())); } return true; } } return false;}bool CPluginHandle_Impl::FillDefaults(EAlgoCommand cmd, CPluginCommand& args) const{ if (GetCommand() != CPluginCommandSet::e_Algo) { return false; } return s_FillDefaults(cmd, args, x_GetWorkingSet().GetCommands().GetAlgo());}bool CPluginHandle_Impl::FillDefaults(EDataCommand cmd, CPluginCommand& args) const{ if (GetCommand() != CPluginCommandSet::e_Data) { return false; } return s_FillDefaults(cmd, args, x_GetWorkingSet().GetCommands().GetData());}bool CPluginHandle_Impl::FillDefaults(EViewCommand cmd, CPluginCommand& args) const{ if (GetCommand() != CPluginCommandSet::e_View) { return false; } return s_FillDefaults(cmd, args, x_GetWorkingSet().GetCommands().GetView());}CPluginLibInfo& CPluginHandle_Impl::x_GetWorkingSet(void) const{ if ( !m_WorkingInfo ) { m_WorkingInfo.Reset(new CPluginLibInfo()); m_WorkingInfo->Assign(*m_Info); } return *m_WorkingInfo;}//// Execute()// This is the main interface function; it is forwarded to the actual plugin.//void CPluginHandle_Impl::Execute(CPluginMessage& msg){ // !!! temporary implementation !!! string context; if (msg.CanGetContext()) { context = msg.GetContext(); } CRef<CPluginBase> plugin(x_GetPlugin(context)); plugin->Execute(msg);}//// FinalizeArgs()// This is the main interface function; it is forwarded to the actual plugin.//void CPluginHandle_Impl::FinalizeArgs(CPluginMessage& msg){ // !!! temporary implementation !!! string context; if (msg.CanGetContext()) { context = msg.GetContext(); } CRef<CPluginBase> plugin(x_GetPlugin(context)); plugin->FinalizeArgs(msg);}void CPluginHandle_Impl::x_SetFactory(CPluginFactoryBase* factory) const{ m_Factory = factory;}CPluginBase* CPluginHandle_Impl::x_GetPlugin(const string& ctx_name){ if ( !m_Factory ) { CPluginRegistry::x_LoadLibrary(GetLibrary()); } if ( !m_Factory ) { NCBI_THROW(CPluginException, ePluginLoadFailed, "Failed to load plugin library " + GetLibrary()); } // retrieve a plugin based on its context TPluginDict::iterator iter = m_PluginDict.find(ctx_name); if (iter == m_PluginDict.end()) { m_PluginDict[ctx_name].Reset(m_Factory->GetPlugin()); iter = m_PluginDict.find(ctx_name); } return iter->second;}END_NCBI_SCOPE/* * =========================================================================== * $Log: plugin_handle_impl.cpp,v $ * Revision 1000.5 2004/06/01 20:44:26 gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16 * * Revision 1.16 2004/05/25 17:08:50 dicuccio * Added CreateMessage() API to generate a new plugin message for a given plugin * call * * Revision 1.15 2004/05/21 22:27:40 gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.14 2004/04/14 20:14:43 jcherry * Removed invalid "flag" (CNcbiRegistry::eReturn) from calls to * CNcbiRegistry::GetString() (was being ignored and provoking an * error message) * * Revision 1.13 2004/02/13 04:03:02 ucko * #include <ctype.h> rather than <cctype>, which some compilers (MIPSpro * anyway) lack. * * Revision 1.12 2004/02/12 23:03:02 mjohnson * Added documentation lookup. * * Revision 1.11 2004/02/03 21:23:48 dicuccio * Added standard accessors for the working set of plugin args * * Revision 1.10 2004/01/15 22:50:17 jcherry * Added FinalizeArgs() for plugins * * Revision 1.9 2003/12/23 20:23:21 jcherry * Make argument values persist across invocations of plugin * * Revision 1.8 2003/11/06 20:04:07 dicuccio * Refactored FillDefaults(). Added option to have cached set of arguments * * Revision 1.7 2003/11/04 17:18:41 dicuccio * Changed calling API for plugins - take CPluginMessage directly instead of * paired command/reply * * Revision 1.6 2003/10/23 16:16:36 dicuccio * Exposed CPluginLibInfo * * Revision 1.5 2003/08/05 17:07:15 dicuccio * Changed calling semantics for the message queue - pass by reference, not * CConstRef<> * * Revision 1.4 2003/08/02 12:51:07 dicuccio * Enabled the context dictionary inside of plugin handles * * Revision 1.3 2003/07/14 11:01:06 shomrat * Plugin messageing system related changes * * Revision 1.2 2003/07/11 12:37:37 dicuccio * Made many string members of CPluginInfo optional; added checks for safe * retrieval * * Revision 1.1 2003/06/25 17:02:54 dicuccio * Split CPluginHandle into a handle (pointer-to-implementation) and * implementation file. Lots of #include file clean-ups. * * =========================================================================== */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?