plugin_registry.cpp

来自「ncbi源码」· C++ 代码 · 共 748 行 · 第 1/2 页

CPP
748
字号
        **/        plugins.push_back((*iter)->GetHandle());    }    return plugins;}//// retrieve plugins specific for a given command and valid for a given document//CPluginRegistry::TPluginsCPluginRegistry::GetPlugins(EAlgoCommand cmd, TFlags flags){    CMutexGuard LOCK(s_PluginRegistryMutex);    return s_GetPlugins(s_PluginRegistry, cmd, (const IDocument*)NULL, flags);}CPluginRegistry::TPluginsCPluginRegistry::GetPlugins(EDataCommand cmd, const IDocument* doc,                            TFlags flags){    CMutexGuard LOCK(s_PluginRegistryMutex);    return s_GetPlugins(s_PluginRegistry, cmd, doc, flags);}CPluginRegistry::TPluginsCPluginRegistry::GetPlugins(EViewCommand cmd, TFlags flags){    CMutexGuard LOCK(s_PluginRegistryMutex);    return s_GetPlugins(s_PluginRegistry, cmd, (const IDocument*)NULL, flags);}//// retrieve plugins specific for a set of objects//CPluginRegistry::TPluginsCPluginRegistry::GetPlugins(EDataCommand cmd, const CSelectionBuffer& buf,                            TFlags flags){    CMutexGuard LOCK(s_PluginRegistryMutex);    return s_GetPlugins(s_PluginRegistry, cmd, &buf, flags);}//// retrieve all plugins//CPluginHandle CPluginRegistry::GetPlugin(const string& name){    CMutexGuard LOCK(s_PluginRegistryMutex);    ITERATE (TPluginRegistry, iter, s_PluginRegistry) {        if ((*iter)->IsEnabled()  &&  (*iter)->GetClassName() == name) {            return (*iter)->GetHandle();        }    }    _TRACE("CPluginRegistry::GetPlugin(): failed to find plugin " << name);    return CPluginHandle();}//// retrieve all plugins//CPluginRegistry::TPlugins CPluginRegistry::GetPlugins(TFlags flags){    CMutexGuard LOCK(s_PluginRegistryMutex);    TPlugins plugins;    ITERATE (TPluginRegistry, iter, s_PluginRegistry) {        if ( (flags & fHidden) == 0  && (*iter)->GetMenuItem().empty()) {            continue;        }        if ((*iter)->IsEnabled()) {            plugins.push_back((*iter)->GetHandle());        }    }    return plugins;}//// retrieve plugins valid for a given command type//CPluginRegistry::TPluginsCPluginRegistry::GetPlugins(CPluginCommandSet::E_Choice cmd, TFlags flags){    CMutexGuard LOCK(s_PluginRegistryMutex);    TPlugins plugins;    ITERATE (TPluginRegistry, iter, s_PluginRegistry) {        if ( (flags & fHidden) == 0  && (*iter)->GetMenuItem().empty()) {            continue;        }        if ( (*iter)->GetCommand() == cmd  &&  (*iter)->IsEnabled()) {            plugins.push_back((*iter)->GetHandle());        }    }    return plugins;}void CPluginRegistry::x_LoadLibrary(const string& lib){    CMutexGuard LOCK(s_PluginRegistryMutex);    string dir;    string base;    string ext;    CDirEntry::SplitPath(lib, &dir, &base, &ext);    CDll dll(dir, base + ext, CDll::eLoadLater);    try {        dll.Load();        LOG_POST(Info << "loaded plugin library " << base + ext);        // grab the single entry point        list<CPluginFactoryBase*> plugins;        CPluginFactoryBase::FPluginEntryPoint get_plugins =            dll.GetEntryPoint_Func("NCBIGBenchGetPlugins", &get_plugins);        if ( !get_plugins ) {            NCBI_THROW(CPluginException, ePluginLoadFailed,                       "Library is not a valid plug-in");        }        // grab our plugin factories        get_plugins(plugins);        ITERATE (list<CPluginFactoryBase*>, iter, plugins) {            CPluginFactoryBase* factory = *iter;            if ( !factory ) {                continue;            }            // check for version information            //CPluginRequest request;            //request.SetInfo();            //CPluginReply reply;            //factory->RunCommand(request, reply);            //if ( reply.GetStatus() != eRequestStatus_success  ||            //     !reply.GetAction().IsInfo() ) {            //    // the plugin factory doesn't support the 'info' command            //    continue;            //}            // make sure our library is set...            CPluginInfo info;            (*iter)->GetInfo(info);            //const CPluginInfo& info = reply.GetAction().GetInfo();            if ( !CPluginVersion::CheckVersion(info.GetVer_major(),                                               info.GetVer_minor()) ) {                string msg = "Version Mismatch:\nframework version ";                msg += NStr::IntToString(CPluginVersion::eMajor);                msg += "." + NStr::IntToString(CPluginVersion::eMinor);                msg += " : plugin version ";                msg += NStr::IntToString(info.GetVer_major());                msg += "." + NStr::IntToString(info.GetVer_minor());                msg += ", rev " + NStr::IntToString(info.GetVer_revision());                msg += "\nplugin build date: " + info.GetVer_build_date();                NCBI_THROW(CPluginException, eVersionMismatch, msg);            }            // retrieve and process all commands            // we will fill in details for plugin handles as we go            TPluginRegistry::iterator plug_iter = s_PluginRegistry.begin();            for ( ;  plug_iter != s_PluginRegistry.end();  ++plug_iter) {                if ( (*plug_iter)->GetClassName() == info.GetClass_name() ) {                    (*plug_iter)->x_SetFactory(factory);                    LOG_POST(Info                             << "registering plugin " << info.GetClass_name());                    break;                }            }            if (plug_iter == s_PluginRegistry.end()) {                LOG_POST(Warning                         << "failed to register plugin "                         << (*plug_iter)->GetClassName());            }        }    }    catch(CException& e) {        dll.Unload();        string msg("Failed to load plugin library ");        msg += base + ext;        msg += ":\n";        msg += e.GetMsg();        NcbiMessageBox(msg);    }#ifndef _DEBUG    catch (...) {        dll.Unload();        string msg("Failed to load plugin library ");        msg += base + ext;        msg += ":\nUnknown error.";        NcbiMessageBox(msg);    }#endif}END_NCBI_SCOPE/* * =========================================================================== * $Log: plugin_registry.cpp,v $ * Revision 1000.8  2004/06/01 20:44:30  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.45 * * Revision 1.45  2004/05/21 22:27:40  gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.44  2004/04/16 14:38:28  dicuccio * Eliminated APIs from GetPlugins() that would perform selection-based sieving - * they were not used * * Revision 1.43  2004/03/16 15:59:50  vasilche * Removed warning about unused exception variable * * Revision 1.42  2004/01/27 18:32:10  dicuccio * Added default handler to switch * * Revision 1.41  2004/01/06 14:24:03  dicuccio * Temporarily disable the use of CanFitArgs() inside of GetPlugins() when all * that is known is a document - the search is very expensive on big records. * * Revision 1.40  2003/12/09 15:44:53  dicuccio * Use CException::GetMsg() instead of what() * * Revision 1.39  2003/12/03 12:40:05  dicuccio * Restore auto-processing of autorun plugins * * Revision 1.38  2003/11/26 17:06:56  dicuccio * Dropped autoloading of plugins - favor explicit initialization * * Revision 1.37  2003/11/24 15:39:40  dicuccio * Renamed CVersion to CPluginVersion * * Revision 1.36  2003/11/19 18:15:14  ucko * Adjust for CDll API change. * * Revision 1.35  2003/11/06 20:06:29  dicuccio * Moved USING_SCOPE(objects) to implementation files * * Revision 1.34  2003/11/04 17:19:07  dicuccio * Added Clear().  CHanged to patch API change in CPluginMessage * * Revision 1.33  2003/10/27 17:37:51  dicuccio * Better diagnostics for exceptions in reading plugin cache * * Revision 1.32  2003/10/25 16:03:37  dicuccio * Removed debugging output that disabled plugin reading on Unix * * Revision 1.31  2003/10/23 16:17:03  dicuccio * Added API to add user-defined plugins * * Revision 1.30  2003/10/10 17:15:33  dicuccio * Changed sort params for plugin handles - now, sort by menu item.  Added object * conversion cache to plugin retrieval.  Removed unnecessary sort()s. * * Revision 1.29  2003/09/30 23:48:04  ucko * s_GetPlugins: re-fixed WorkShop build, and added a comment explaining * how to stay out of trouble. * * Revision 1.28  2003/09/30 13:40:12  dicuccio * Added sorting of plugins by menu name * * Revision 1.27  2003/09/04 14:01:51  dicuccio * Introduce IDocument and IView as abstract base classes for CDocument and CView * * Revision 1.26  2003/08/05 17:07:15  dicuccio * Changed calling semantics for the message queue - pass by reference, not * CConstRef<> * * Revision 1.25  2003/07/28 18:27:38  jcherry * Added CPluginRegistry::RegisterPlugin for registering external * (executable) plugins * * Revision 1.24  2003/07/25 19:45:22  shomrat * Immediately execute autorun plugins * * Revision 1.23  2003/07/21 19:28:37  dicuccio * Added retrieval of plugins based on contents of a selection buffer * * Revision 1.22  2003/07/14 11:01:16  shomrat * Plugin messageing system related changes * * Revision 1.21  2003/07/09 12:29:21  dicuccio * (Finally!) fixed build issues on WorkShop - removed accessing of all static * variables from inside local templated functions * * Revision 1.20  2003/06/30 13:33:15  dicuccio * Added API to screen out "empty" plugins * * Revision 1.19  2003/06/30 11:29:34  dicuccio * Moved access of mutex out of template (WorkShop compiler doesn't like this) * * Revision 1.18  2003/06/29 13:10:17  dicuccio * Use DEFINE_STATIC_MUTEX() instead of static member variables * * Revision 1.17  2003/06/25 17:02:54  dicuccio * Split CPluginHandle into a handle (pointer-to-implementation) and * implementation file.  Lots of #include file clean-ups. * * Revision 1.16  2003/06/20 14:47:41  dicuccio * Revised handling of plugin registration (moved GetInfo() out of plugin * factory and into each handler as a static function) * * Revision 1.15  2003/05/30 14:15:41  dicuccio * Renamed MessageBox to NcbiMessageBox because brain-dead MSVC thinks this is * ::MessageBox and rewrites the symbol as MessageBoxA, which results in an * unresolved external and conflict with the Win32 API :(. * * Revision 1.14  2003/05/30 12:56:50  dicuccio * Converted code to use MessageBox() instead of * fl_ask()/fl_message()/fl_alert() * * Revision 1.13  2003/05/19 13:35:59  dicuccio * Moved gui/core/plugin/ -> gui/plugin/.  Merged gui/core/algo, gui/core/doc/, * and gui/core/view/ into one library (gui/core/) * * Revision 1.12  2003/05/08 16:18:59  dicuccio* Changed CFastMutex --> CMutex - guards against recursive locking** Revision 1.11  2003/05/06 15:54:51  dicuccio* Added mutex to guard access to plugin registry** Revision 1.10  2003/04/29 14:41:18  dicuccio* Removed old GetPlugins() call - use new command-based API** Revision 1.9  2003/03/31 13:47:50  dicuccio* Changed standard start-up messages to be more comprehensible** Revision 1.8  2003/03/25 13:11:10  dicuccio* Fixed compilation issue on compaq compiler - don't redeclare loop variable* 'iter' inside of loop** Revision 1.7  2003/03/13 18:15:48  dicuccio* Added accessor for a single, named plugin.  Changed registration to* explicitly allow overriding of plugins** Revision 1.6  2003/03/10 22:58:51  kuznets* iterate -> ITERATE** Revision 1.5  2003/02/28 15:06:55  dicuccio* Added check to see if a plugin is enabled** Revision 1.4  2003/02/24 13:03:15  dicuccio* Renamed classes in plugin spec:*     CArgSeg --> CPluginArgSet*     CArgument --> CPluginArg*     CPluginArgs --> CPluginCommand*     CPluginCommands --> CPluginCommandSet** Revision 1.3  2003/02/21 17:16:52  dicuccio* Fixed compilation errors related to changes in plugin architecture** Revision 1.2  2003/02/20 20:35:45  dicuccio* Fixed compilation errors after commit of plugin architecture changes** Revision 1.1  2003/02/20 19:49:56  dicuccio* Created new plugin architecture, based on ASN.1 spec.  Moved GBENCH frameowrk* over to use new plugin architecture.** ===========================================================================*/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?