|
Katana Plug-in APIs 0.1
|
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
1.7.3