00001 00005 #include "SO3PluginManager.h" 00006 00007 namespace Ogre 00008 { 00009 //Singleton instance 00010 template<> SO3::SPluginManager* Ogre::Singleton<SO3::SPluginManager>::ms_Singleton = 0; 00011 } 00012 00013 namespace SO3 00014 { 00015 00016 SPluginManager* SPluginManager::getSingletonPtr() 00017 { 00018 return ms_Singleton; 00019 } 00020 00021 SPluginManager& SPluginManager::getSingleton() 00022 { 00023 assert(ms_Singleton); 00024 return (*ms_Singleton); 00025 } 00026 00027 SPluginManager::SPluginManager() 00028 { 00029 } 00030 00031 SPlugin* SPluginManager::Load(const std::string& fileName) 00032 { 00033 SPlugin* plugin = new SPlugin(fileName); 00034 plugin->Load(); 00035 pluginList.insert(SPluginList::value_type(plugin->GetInfo().name, plugin)); 00036 00037 if (plugin) 00038 { 00039 if (plugin->IsLoaded()) 00040 { 00041 SO3_START_PLUGIN pFunc = (SO3_START_PLUGIN)plugin->GetSymbol("SO3_Start"); 00042 00043 if (!pFunc) 00044 OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, "Cannot find the \"Start\" symbol in SO3 plugin " + plugin->GetInfo().name, "SPluginManager::Load"); 00045 00046 pFunc(); 00047 } 00048 } 00049 return plugin; 00050 } 00051 00052 void SPluginManager::Unload(SPlugin* loadedPlugin) 00053 { 00054 SPluginList::iterator i = pluginList.find(loadedPlugin->GetInfo().name); 00055 if (i != pluginList.end()) 00056 { 00057 // Call plugin shutdown 00058 SO3_STOP_PLUGIN pFunc = (SO3_STOP_PLUGIN)(i->second)->GetSymbol("SO3_Stop"); 00059 00060 if (!pFunc) 00061 OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, "Cannot find the \"Stop\" symbol in SO3 plugin " + (i->second)->GetInfo().name, "SPluginManager::Unload"); 00062 00063 pFunc(); 00064 pluginList.erase(i); 00065 } 00066 delete loadedPlugin; 00067 } 00068 00069 void SPluginManager::Unload(const std::string& pluginName) 00070 { 00071 SPluginList::iterator i = pluginList.find(pluginName); 00072 if (i != pluginList.end()) 00073 { 00074 Unload(i->second); 00075 } 00076 } 00077 00078 SPluginManager::~SPluginManager() 00079 { 00080 std::vector<std::string> list = GetPluginList(); 00081 int nbPlugins = list.size()-1; 00082 00083 for(int it = nbPlugins; it >= 0; it--) 00084 { 00085 Unload(list[it]); 00086 } 00087 pluginList.clear(); 00088 } 00089 00090 std::vector<std::string> SPluginManager::GetPluginList() 00091 { 00092 std::vector<std::string> list; 00093 SPluginList::iterator i = pluginList.begin(); 00094 00095 while (i != pluginList.end()) 00096 { 00097 list.push_back(i->first); 00098 i++; 00099 } 00100 00101 return list; 00102 } 00103 00104 }
1.6.3