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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: plugin_manager_impl.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/02/18 18:54:47  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CORELIB___PLUGIN_MANAGER__IMPL__HPP
  10. #define CORELIB___PLUGIN_MANAGER__IMPL__HPP
  11. /* $Id: plugin_manager_impl.hpp,v 1000.2 2004/02/18 18:54:47 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Anatoliy Kuznetsov
  37.  *
  38.  * File Description:  Collection of classes to implement different 
  39.  *                    plugin manager paradigms.
  40.  * 
  41.  *
  42.  */
  43. /// @file plugin_manager_impl.hpp
  44. /// Helper classes and templates to implement plugins.
  45. #include <corelib/plugin_manager.hpp>
  46. BEGIN_NCBI_SCOPE
  47. /** @addtogroup PluginMgr
  48.  *
  49.  * @{
  50.  */
  51. /// Template class helps to implement one driver class factory.
  52. ///
  53. /// Class supports one driver, one version class factory 
  54. /// (the very basic one)
  55. /// Template parameters are:
  56. ///   IFace - interface class 
  57. ///   TDriver - driver class (implements IFace)
  58. template <class IFace, class TDriver>
  59. class CSimpleClassFactoryImpl : public IClassFactory<IFace>
  60. {
  61. public:
  62.     typedef IClassFactory<IFace>           TParent;
  63.     typedef typename TParent::SDriverInfo  TDriverInfo;
  64.     typedef typename TParent::TDriverList  TDriverList;
  65.     /// Construction
  66.     ///
  67.     /// @param driver_name
  68.     ///   Driver name string
  69.     /// @param patch_level
  70.     ///   Patch level implemented by the driver. 
  71.     ///   By default corresponds to interface patch level.
  72.     CSimpleClassFactoryImpl(const string& driver_name, int patch_level = -1) 
  73.         : m_DriverVersionInfo
  74.         (ncbi::CInterfaceVersion<IFace>::eMajor, 
  75.          ncbi::CInterfaceVersion<IFace>::eMinor, 
  76.          patch_level >= 0 ?
  77.             patch_level : ncbi::CInterfaceVersion<IFace>::ePatchLevel),
  78.           m_DriverName(driver_name)
  79.     {
  80.         _ASSERT(!m_DriverName.empty());
  81.     }
  82.     /// Create instance of TDriver
  83.     IFace* 
  84.     CreateInstance(const string& driver  = kEmptyStr,
  85.                    CVersionInfo version = NCBI_INTERFACE_VERSION(IFace),
  86.                    const TPluginManagerParamTree* /*params*/ = 0) const
  87.     {
  88.         TDriver* drv = 0;
  89.         if (driver.empty() || driver == m_DriverName) {
  90.             if (version.Match(NCBI_INTERFACE_VERSION(IFace)) 
  91.                                 != CVersionInfo::eNonCompatible) {
  92.                 drv = new TDriver();
  93.             }
  94.         }
  95.         return drv;
  96.     }
  97.     void GetDriverVersions(TDriverList& info_list) const
  98.     {
  99.         info_list.push_back(TDriverInfo(m_DriverName, m_DriverVersionInfo));
  100.     }
  101. protected:
  102.     CVersionInfo  m_DriverVersionInfo;
  103.     string        m_DriverName;
  104. };
  105. /// Template implements entry point
  106. ///
  107. /// The actual entry point is a C callable exported function 
  108. ///   delegates the functionality to 
  109. ///               CHostEntryPointImpl<>::NCBI_EntryPointImpl()
  110. template<class TClassFactory> 
  111. struct CHostEntryPointImpl
  112. {
  113.     typedef typename TClassFactory::TInterface                TInterface;
  114.     typedef CPluginManager<TInterface>                        TPluginManager;
  115.     typedef typename CPluginManager<TInterface>::SDriverInfo  TDriverInfo;
  116.     
  117.     typedef typename 
  118.     CPluginManager<TInterface>::TDriverInfoList         TDriverInfoList;
  119.     typedef typename 
  120.     CPluginManager<TInterface>::EEntryPointRequest      EEntryPointRequest;
  121.     typedef typename TClassFactory::SDriverInfo         TCFDriverInfo;
  122.     
  123.     /// Entry point implementation. 
  124.     ///
  125.     /// @sa CPluginManager::FNCBI_EntryPoint
  126.     static void NCBI_EntryPointImpl(TDriverInfoList& info_list,
  127.                                     EEntryPointRequest method)
  128.     {
  129.         TClassFactory cf;
  130.         list<TCFDriverInfo> cf_info_list;
  131.         cf.GetDriverVersions(cf_info_list);
  132.         switch (method)
  133.             { 
  134.             case TPluginManager::eGetFactoryInfo:
  135.                 {
  136.                     typename list<TCFDriverInfo>::const_iterator it =
  137.                         cf_info_list.begin();
  138.                     typename list<TCFDriverInfo>::const_iterator it_end =
  139.                         cf_info_list.end();
  140.                     for (; it != it_end; ++it) {
  141.                         info_list.push_back(TDriverInfo(it->name, it->version));
  142.                     }
  143.                 }
  144.             break;
  145.             case TPluginManager::eInstantiateFactory:
  146.                 {
  147.                     typename TDriverInfoList::iterator it1 = info_list.begin();
  148.                     typename TDriverInfoList::iterator it1_end = info_list.end();
  149.                     for(; it1 != it1_end; ++it1) {
  150.                         if (it1->factory) {    // already instantiated
  151.                             continue;
  152.                         }
  153.                         typename list<TCFDriverInfo>::iterator it2 = 
  154.                             cf_info_list.begin();
  155.                         typename list<TCFDriverInfo>::iterator it2_end = 
  156.                             cf_info_list.end();
  157.                         for (; it2 != it2_end; ++it2) {
  158.                             if (it1->name == it2->name) {
  159.                                 if (it1->version.Match(it2->version) != 
  160.                                     CVersionInfo::eNonCompatible)
  161.                                     {
  162.                                         TClassFactory* cg = new TClassFactory();
  163.                                         IClassFactory<TInterface>* icf = cg;
  164.                                         it1->factory = icf;
  165.                                     }
  166.                             }
  167.                         } // for
  168.                     } // for
  169.                 }
  170.             break;
  171.             default:
  172.                 _ASSERT(0);
  173.             } // switch
  174.     }
  175. };
  176. /* @} */
  177. END_NCBI_SCOPE
  178. /*
  179.  * ===========================================================================
  180.  * $Log: plugin_manager_impl.hpp,v $
  181.  * Revision 1000.2  2004/02/18 18:54:47  gouriano
  182.  * PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.3
  183.  *
  184.  * Revision 1.3  2004/02/17 21:07:18  vasilche
  185.  * Commented out unused argument.
  186.  *
  187.  * Revision 1.2  2004/01/13 17:21:24  kuznets
  188.  * Class factory CreateInstance method received an additional parameter
  189.  * TPluginManagerParamTree (to specify initialization parameters or prefrences)
  190.  *
  191.  * Revision 1.1  2003/11/19 13:44:55  kuznets
  192.  * Initial revision
  193.  *
  194.  *
  195.  * ===========================================================================
  196.  */
  197. #endif  /* CORELIB___PLUGIN_MANAGER__IMPL_HPP */