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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: plugin_manager.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:09:31  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: plugin_manager.cpp,v 1000.3 2004/06/01 19:09:31 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.  * Author:  Anatoliy Kuznetsov
  35.  *
  36.  * File Description:
  37.  *   Plugin manager implementations
  38.  *
  39.  * ===========================================================================
  40.  */
  41. #include <ncbi_pch.hpp>
  42. #include <corelib/plugin_manager.hpp>
  43. #include <corelib/ncbidll.hpp>
  44. BEGIN_NCBI_SCOPE
  45. /////////////////////////////////////////////////////////////////////////////
  46. //  CPluginManager_DllResolver::
  47. //
  48. CPluginManager_DllResolver::CPluginManager_DllResolver(void)
  49.  : m_DllNamePrefix("ncbi_plugin"),
  50.    m_EntryPointPrefix("NCBI_EntryPoint"),
  51.    m_Version(CVersionInfo::kAny),
  52.    m_DllResolver(0)
  53. {}
  54. CPluginManager_DllResolver::CPluginManager_DllResolver(
  55.                     const string& interface_name,
  56.                     const string& driver_name,
  57.                     const CVersionInfo& version)
  58.  : m_DllNamePrefix("ncbi_plugin"),
  59.    m_EntryPointPrefix("NCBI_EntryPoint"),
  60.    m_InterfaceName(interface_name),
  61.    m_DriverName(driver_name),
  62.    m_Version(version),
  63.    m_DllResolver(0)
  64. {
  65. }
  66. CPluginManager_DllResolver::~CPluginManager_DllResolver(void)
  67. {
  68.     delete m_DllResolver;
  69. }
  70. CDllResolver& CPluginManager_DllResolver::Resolve(const vector<string>& paths)
  71. {
  72.     CDllResolver* resolver = GetCreateDllResolver();
  73.     _ASSERT(resolver);
  74.     // Generate DLL masks
  75.     string mask = GetDllNameMask(m_InterfaceName, m_DriverName, m_Version);
  76.     vector<string> masks;
  77.     masks.push_back(mask);
  78.     resolver->FindCandidates(paths, masks);
  79.     return *resolver;
  80. }
  81. CDllResolver& CPluginManager_DllResolver::Resolve(const string& path)
  82. {
  83.     _ASSERT(!path.empty());
  84.     vector<string> paths;
  85.     paths.push_back(path);
  86.     return Resolve(paths);
  87. }
  88. string 
  89. CPluginManager_DllResolver::GetDllName(const string&       interface_name,
  90.                                        const string&       driver_name,
  91.                                        const CVersionInfo& version) const
  92. {
  93.     string prefix = GetDllNamePrefix();
  94.     string name = prefix;
  95.     if (!interface_name.empty()) {
  96.         name.append("_");
  97.         name.append(interface_name);
  98.     }
  99.     if (!driver_name.empty()) {
  100.         name.append("_");
  101.         name.append(driver_name);
  102.     }
  103.     if (version.IsAny()) {
  104.         return name;
  105.     } else {
  106.         
  107. #if defined(NCBI_OS_MSWIN)
  108.         string delimiter = "_";
  109. #elif defined(NCBI_OS_UNIX)
  110.         string delimiter = ".";
  111.         name.append(".so");
  112. #endif
  113.         name.append(delimiter);
  114.         name.append(NStr::IntToString(version.GetMajor()));
  115.         name.append(delimiter);
  116.         name.append(NStr::IntToString(version.GetMinor()));
  117.         name.append(delimiter);
  118.         name.append(NStr::IntToString(version.GetPatchLevel()));
  119.     }
  120.     return name;
  121. }
  122. string 
  123. CPluginManager_DllResolver::GetDllNameMask(
  124.         const string&       interface_name,
  125.         const string&       driver_name,
  126.         const CVersionInfo& version) const
  127. {
  128.     string prefix = GetDllNamePrefix();
  129.     string name = prefix;
  130.     name.append("_");
  131.     if (interface_name.empty()) {
  132.         name.append("*");
  133.     } else {
  134.         name.append(interface_name);
  135.     }
  136.     name.append("_");
  137.     if (driver_name.empty()) {
  138.         name.append("*");
  139.     } else {
  140.         name.append(driver_name);
  141.     } 
  142.     if (version.IsAny()) {
  143. #if defined(NCBI_OS_MSWIN)
  144.         name.append("*.dll");
  145. #elif defined(NCBI_OS_UNIX)
  146.         name.append(".so*");
  147. #endif
  148.     } else {
  149.         
  150. #if defined(NCBI_OS_MSWIN)
  151.         string delimiter = "_";
  152. #elif defined(NCBI_OS_UNIX)
  153.         string delimiter = ".";
  154.         name.append(".so");
  155. #endif
  156.         name.append(delimiter);
  157.         if (version.GetMajor() <= 0) {
  158.             name.append("*");
  159.         } else {
  160.             name.append(NStr::IntToString(version.GetMajor()));
  161.         }
  162.         name.append(delimiter);
  163.         if (version.GetMinor() <= 0) {
  164.             name.append("*");
  165.         } else {
  166.             name.append(NStr::IntToString(version.GetMinor()));
  167.         }
  168.         name.append(delimiter);
  169.         name.append("*");  // always get the best patch level
  170.         
  171.     }
  172.     return name;
  173. }
  174. string 
  175. CPluginManager_DllResolver::GetEntryPointName(
  176.                       const string&       interface_name,
  177.                       const string&       driver_name) const
  178. {
  179.     string prefix = GetEntryPointPrefix();
  180.     string name = prefix;
  181.     if (!interface_name.empty()) {
  182.         name.append("_");
  183.         name.append(interface_name);
  184.     }
  185.     if (!driver_name.empty()) {
  186.         name.append("_");
  187.         name.append(driver_name);
  188.     }
  189.     return name;
  190. }
  191. string CPluginManager_DllResolver::GetEntryPointPrefix() const 
  192.     return m_EntryPointPrefix; 
  193. }
  194. string CPluginManager_DllResolver::GetDllNamePrefix() const 
  195.     return m_DllNamePrefix; 
  196. }
  197. void CPluginManager_DllResolver::SetDllNamePrefix(const string& prefix)
  198.     m_DllNamePrefix = prefix; 
  199. }
  200. CDllResolver* CPluginManager_DllResolver::CreateDllResolver() const
  201. {
  202.     vector<string> entry_point_names;
  203.     string entry_name;
  204.     
  205.     // Generate all variants of entry point names
  206.     // some of them can duplicate, and that's legal. Resolver stops trying
  207.     // after the first success.
  208.     entry_name = GetEntryPointName(m_InterfaceName, m_DriverName);
  209.     entry_point_names.push_back(entry_name);
  210.     
  211.     entry_name = GetEntryPointName(kEmptyStr, kEmptyStr);
  212.     entry_point_names.push_back(entry_name);
  213.     
  214.     entry_name = GetEntryPointName(m_InterfaceName, kEmptyStr);
  215.     entry_point_names.push_back(entry_name);
  216.     
  217.     entry_name = GetEntryPointName(kEmptyStr, m_DriverName);
  218.     entry_point_names.push_back(entry_name);
  219.     
  220.     // Make the library dependent entry point templates
  221.     string base_name_templ = "${basename}";
  222.     string prefix = GetEntryPointPrefix();
  223.     
  224.     // Make "NCBI_EntryPoint_libname" EP name
  225.     entry_name = prefix;
  226.     entry_name.append("_");
  227.     entry_name.append(base_name_templ);
  228.     entry_point_names.push_back(entry_name);
  229.         
  230.     // Make "NCBI_EntryPoint_interface_libname" EP name
  231.     if (!m_InterfaceName.empty()) {
  232.         entry_name = prefix;
  233.         entry_name.append("_");
  234.         entry_name.append(m_InterfaceName);
  235.         entry_name.append("_");        
  236.         entry_name.append(base_name_templ);
  237.         entry_point_names.push_back(entry_name);
  238.     }
  239.     
  240.     // Make "NCBI_EntryPoint_driver_libname" EP name
  241.     if (!m_DriverName.empty()) {
  242.         entry_name = prefix;
  243.         entry_name.append("_");
  244.         entry_name.append(m_DriverName);
  245.         entry_name.append("_");        
  246.         entry_name.append(base_name_templ);
  247.         entry_point_names.push_back(entry_name);
  248.     }
  249.     CDllResolver* resolver = new CDllResolver(entry_point_names);
  250.     return resolver;
  251.  }
  252. CDllResolver* CPluginManager_DllResolver::GetCreateDllResolver()
  253. {
  254.     if (m_DllResolver == 0) {
  255.         m_DllResolver = CreateDllResolver();
  256.     }
  257.     return m_DllResolver;
  258. }
  259. END_NCBI_SCOPE
  260. /*
  261.  * ===========================================================================
  262.  * $Log: plugin_manager.cpp,v $
  263.  * Revision 1000.3  2004/06/01 19:09:31  gouriano
  264.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  265.  *
  266.  * Revision 1.6  2004/05/14 13:59:27  gorelenk
  267.  * Added include of ncbi_pch.hpp
  268.  *
  269.  * Revision 1.5  2003/12/09 13:25:59  kuznets
  270.  * Added DLL name based entry point names
  271.  *
  272.  * Revision 1.4  2003/11/18 15:26:48  kuznets
  273.  * Minor cosmetic changes
  274.  *
  275.  * Revision 1.3  2003/11/17 17:04:22  kuznets
  276.  * Cosmetic fixes
  277.  *
  278.  * Revision 1.2  2003/11/12 18:57:21  kuznets
  279.  * Implemented dll resolution.
  280.  *
  281.  *
  282.  * ===========================================================================
  283.  */