⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plugin_manager.cpp

📁 ncbi源码
💻 CPP
字号:
/* * =========================================================================== * PRODUCTION $Log: plugin_manager.cpp,v $ * PRODUCTION Revision 1000.3  2004/06/01 19:09:31  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6 * PRODUCTION * =========================================================================== *//*  $Id: plugin_manager.cpp,v 1000.3 2004/06/01 19:09:31 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. * * =========================================================================== * * Author:  Anatoliy Kuznetsov * * File Description: *   Plugin manager implementations * * =========================================================================== */#include <ncbi_pch.hpp>#include <corelib/plugin_manager.hpp>#include <corelib/ncbidll.hpp>BEGIN_NCBI_SCOPE///////////////////////////////////////////////////////////////////////////////  CPluginManager_DllResolver:://CPluginManager_DllResolver::CPluginManager_DllResolver(void) : m_DllNamePrefix("ncbi_plugin"),   m_EntryPointPrefix("NCBI_EntryPoint"),   m_Version(CVersionInfo::kAny),   m_DllResolver(0){}CPluginManager_DllResolver::CPluginManager_DllResolver(                    const string& interface_name,                    const string& driver_name,                    const CVersionInfo& version) : m_DllNamePrefix("ncbi_plugin"),   m_EntryPointPrefix("NCBI_EntryPoint"),   m_InterfaceName(interface_name),   m_DriverName(driver_name),   m_Version(version),   m_DllResolver(0){}CPluginManager_DllResolver::~CPluginManager_DllResolver(void){    delete m_DllResolver;}CDllResolver& CPluginManager_DllResolver::Resolve(const vector<string>& paths){    CDllResolver* resolver = GetCreateDllResolver();    _ASSERT(resolver);    // Generate DLL masks    string mask = GetDllNameMask(m_InterfaceName, m_DriverName, m_Version);    vector<string> masks;    masks.push_back(mask);    resolver->FindCandidates(paths, masks);    return *resolver;}CDllResolver& CPluginManager_DllResolver::Resolve(const string& path){    _ASSERT(!path.empty());    vector<string> paths;    paths.push_back(path);    return Resolve(paths);}string CPluginManager_DllResolver::GetDllName(const string&       interface_name,                                       const string&       driver_name,                                       const CVersionInfo& version) const{    string prefix = GetDllNamePrefix();    string name = prefix;    if (!interface_name.empty()) {        name.append("_");        name.append(interface_name);    }    if (!driver_name.empty()) {        name.append("_");        name.append(driver_name);    }    if (version.IsAny()) {        return name;    } else {        #if defined(NCBI_OS_MSWIN)        string delimiter = "_";#elif defined(NCBI_OS_UNIX)        string delimiter = ".";        name.append(".so");#endif        name.append(delimiter);        name.append(NStr::IntToString(version.GetMajor()));        name.append(delimiter);        name.append(NStr::IntToString(version.GetMinor()));        name.append(delimiter);        name.append(NStr::IntToString(version.GetPatchLevel()));    }    return name;}string CPluginManager_DllResolver::GetDllNameMask(        const string&       interface_name,        const string&       driver_name,        const CVersionInfo& version) const{    string prefix = GetDllNamePrefix();    string name = prefix;    name.append("_");    if (interface_name.empty()) {        name.append("*");    } else {        name.append(interface_name);    }    name.append("_");    if (driver_name.empty()) {        name.append("*");    } else {        name.append(driver_name);    }     if (version.IsAny()) {#if defined(NCBI_OS_MSWIN)        name.append("*.dll");#elif defined(NCBI_OS_UNIX)        name.append(".so*");#endif    } else {        #if defined(NCBI_OS_MSWIN)        string delimiter = "_";#elif defined(NCBI_OS_UNIX)        string delimiter = ".";        name.append(".so");#endif        name.append(delimiter);        if (version.GetMajor() <= 0) {            name.append("*");        } else {            name.append(NStr::IntToString(version.GetMajor()));        }        name.append(delimiter);        if (version.GetMinor() <= 0) {            name.append("*");        } else {            name.append(NStr::IntToString(version.GetMinor()));        }        name.append(delimiter);        name.append("*");  // always get the best patch level            }    return name;}string CPluginManager_DllResolver::GetEntryPointName(                      const string&       interface_name,                      const string&       driver_name) const{    string prefix = GetEntryPointPrefix();    string name = prefix;    if (!interface_name.empty()) {        name.append("_");        name.append(interface_name);    }    if (!driver_name.empty()) {        name.append("_");        name.append(driver_name);    }    return name;}string CPluginManager_DllResolver::GetEntryPointPrefix() const {     return m_EntryPointPrefix; }string CPluginManager_DllResolver::GetDllNamePrefix() const {     return m_DllNamePrefix; }void CPluginManager_DllResolver::SetDllNamePrefix(const string& prefix){     m_DllNamePrefix = prefix; }CDllResolver* CPluginManager_DllResolver::CreateDllResolver() const{    vector<string> entry_point_names;    string entry_name;        // Generate all variants of entry point names    // some of them can duplicate, and that's legal. Resolver stops trying    // after the first success.    entry_name = GetEntryPointName(m_InterfaceName, m_DriverName);    entry_point_names.push_back(entry_name);        entry_name = GetEntryPointName(kEmptyStr, kEmptyStr);    entry_point_names.push_back(entry_name);        entry_name = GetEntryPointName(m_InterfaceName, kEmptyStr);    entry_point_names.push_back(entry_name);        entry_name = GetEntryPointName(kEmptyStr, m_DriverName);    entry_point_names.push_back(entry_name);        // Make the library dependent entry point templates    string base_name_templ = "${basename}";    string prefix = GetEntryPointPrefix();        // Make "NCBI_EntryPoint_libname" EP name    entry_name = prefix;    entry_name.append("_");    entry_name.append(base_name_templ);    entry_point_names.push_back(entry_name);            // Make "NCBI_EntryPoint_interface_libname" EP name    if (!m_InterfaceName.empty()) {        entry_name = prefix;        entry_name.append("_");        entry_name.append(m_InterfaceName);        entry_name.append("_");                entry_name.append(base_name_templ);        entry_point_names.push_back(entry_name);    }        // Make "NCBI_EntryPoint_driver_libname" EP name    if (!m_DriverName.empty()) {        entry_name = prefix;        entry_name.append("_");        entry_name.append(m_DriverName);        entry_name.append("_");                entry_name.append(base_name_templ);        entry_point_names.push_back(entry_name);    }    CDllResolver* resolver = new CDllResolver(entry_point_names);    return resolver; }CDllResolver* CPluginManager_DllResolver::GetCreateDllResolver(){    if (m_DllResolver == 0) {        m_DllResolver = CreateDllResolver();    }    return m_DllResolver;}END_NCBI_SCOPE/* * =========================================================================== * $Log: plugin_manager.cpp,v $ * Revision 1000.3  2004/06/01 19:09:31  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6 * * Revision 1.6  2004/05/14 13:59:27  gorelenk * Added include of ncbi_pch.hpp * * Revision 1.5  2003/12/09 13:25:59  kuznets * Added DLL name based entry point names * * Revision 1.4  2003/11/18 15:26:48  kuznets * Minor cosmetic changes * * Revision 1.3  2003/11/17 17:04:22  kuznets * Cosmetic fixes * * Revision 1.2  2003/11/12 18:57:21  kuznets * Implemented dll resolution. * * * =========================================================================== */

⌨️ 快捷键说明

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