Katana Plug-in APIs 0.1

FnPluginManager.h

00001 // Copyright (c) 2013 The Foundry Visionmongers Ltd. All Rights Reserved.
00002 
00003 #ifndef FoundryKatanaPluginManager_H
00004 #define FoundryKatanaPluginManager_H
00005 
00006 #include <string>
00007 #include <vector>
00008 
00009 #include <FnPlatform/internal/Atomic.h>
00010 
00011 #include <FnPluginSystem/FnPluginSystem.h>
00012 #include <FnPluginManager/FnPluginManagerAPI.h>
00013 #include <FnPluginManager/suite/FnPluginManagerSuite.h>
00014 
00015 #include "ns.h"
00016 
00017 FNPLUGINMANAGER_NAMESPACE_ENTER
00018 {
00019     class FNPLUGINMANAGER_API PluginManager
00020     {
00021     public:
00022 
00023         static void addSearchPath(const std::vector<std::string> &searchPath,
00024                                   bool replace = false);
00025         static std::vector<std::string> getSearchPaths();
00026         static void findPlugins();
00027         static void flushPluginCaches();
00028         static void flushSpecificPluginCache(FnPluginHandle pluginHandle);
00029         static void getApiNames(std::vector<std::string>& names);
00030         static void getPluginApiVersions(const std::string& apiName,
00031                                            std::vector<int>& names);
00032         static void getPluginNames(const std::string& apiName,
00033                                    std::vector<std::string>& names,
00034                                    unsigned int apiVersion);
00035         static FnPluginHandle getPlugin(const std::string& pluginName,
00036                                         const std::string& apiName,
00037                                         unsigned int apiVersion);
00038         static const void* getPluginSuite(FnPluginHandle h);
00039         static const char* getPluginPath(FnPluginHandle h);
00040 
00041         static void releasePluginHandle(FnPluginHandle h);
00042 
00043         static const FnPluginManagerHostSuite_v1* getSuite();
00044         static const void *getHostSuite(const std::string& apiName,
00045                                         unsigned int apiVersion);
00046 
00047         static FnPluginStatus setHost(FnPluginHost* host);
00048         static FnPluginHost* getHost();
00049 
00050     protected:
00051 
00052         PluginManager();
00053         ~PluginManager();
00054 
00055         static const FnPluginManagerHostSuite_v1 * _pluginMgrSuite;
00056     };
00057 
00067     template <typename SuiteT>
00068     class LazyHostSuite
00069     {
00070     public:
00071         const SuiteT* get()
00072         {
00073             using FnPlatform::internal::AtomicCompareExchangeStrong;
00074             using FnPlatform::internal::AtomicThreadFenceAcqRel;
00075 
00076             const SuiteT* suite = suite_;
00077             AtomicThreadFenceAcqRel();
00078             if (!suite)
00079             {
00080                 const SuiteT* newVal = static_cast<const SuiteT*>(
00081                     FnPluginManager::PluginManager::getHostSuite(apiName_,
00082                                                                  apiVersion_));
00083 
00084                 const SuiteT* oldVal = NULL;
00085                 suite = AtomicCompareExchangeStrong(&suite_, &oldVal, newVal)
00086                             ? newVal
00087                             : oldVal;
00088             }
00089             return suite;
00090         }
00091 
00092         const SuiteT* operator->()
00093         {
00094             return get();
00095         }
00096 
00097         const SuiteT& operator*()
00098         {
00099             return *get();
00100         }
00101 
00102         const char* apiName_;
00103         unsigned int apiVersion_;
00104         const SuiteT* volatile suite_;
00105     };
00106 }
00107 FNPLUGINMANAGER_NAMESPACE_EXIT
00108 
00109 #endif // FoundryKatanaPluginManager_H
 All Classes Functions Variables Typedefs Enumerations Enumerator