diff options
| -rw-r--r-- | base/main.cpp | 7 | ||||
| -rw-r--r-- | base/plugins.cpp | 31 | ||||
| -rw-r--r-- | base/plugins.h | 16 | 
3 files changed, 33 insertions, 21 deletions
diff --git a/base/main.cpp b/base/main.cpp index 17acf58266..b925391a96 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -346,7 +346,7 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) {  #if defined(ONE_PLUGIN_AT_A_TIME) && defined(DYNAMIC_MODULES)  	// Only load non-engine plugins and first engine plugin initially in this case. -	PluginManager::instance().loadFirstPlugin(); //This should be the only call to loadFirstPlugin external to the PluginManager class. +	PluginManager::instance().loadFirstPlugin();  #else   	// Load the plugins.   	PluginManager::instance().loadPlugins(); @@ -433,7 +433,12 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) {  			ConfMan.setActiveDomain("");  			// PluginManager::instance().unloadPlugins(); + +#if defined(ONE_PLUGIN_AT_A_TIME) && defined(DYNAMIC_MODULES) +			PluginManager::instance().loadFirstPlugin(); +#else  			PluginManager::instance().loadPlugins(); +#endif  		} else {  			// A dialog would be nicer, but we don't have any  			// screen to draw on yet. diff --git a/base/plugins.cpp b/base/plugins.cpp index dfb1d85141..a7e0036bac 100644 --- a/base/plugins.cpp +++ b/base/plugins.cpp @@ -284,7 +284,7 @@ DECLARE_SINGLETON(PluginManager)  PluginManager::PluginManager() {  	// Always add the static plugin provider.  	addPluginProvider(new StaticPluginProvider()); -	nonEnginePlugs = -1; +	_skipStaticPlugs = false;  }  PluginManager::~PluginManager() { @@ -304,30 +304,25 @@ void PluginManager::addPluginProvider(PluginProvider *pp) {  }  void PluginManager::loadFirstPlugin() { //TODO: rename? It's not quite clear that this loads all non-engine plugins and first engine plugin. +	unloadPluginsExcept(PLUGIN_TYPE_ENGINE, NULL);  	_allPlugs.clear();  	for (ProviderList::iterator pp = _providers.begin();  	                            pp != _providers.end();  	                            ++pp) { -		PluginList pl((*pp)->getPlugins()); -		for (PluginList::iterator p = pl.begin(); p != pl.end(); ++p) { -			_allPlugs.push_back(*p); +		if ((_skipStaticPlugs && (*pp)->isFilePluginProvider()) || !_skipStaticPlugs) { +			PluginList pl((*pp)->getPlugins()); +			for (PluginList::iterator p = pl.begin(); p != pl.end(); ++p) { +				_allPlugs.push_back(*p); +			}  		}  	} -	_currentPlugin = _allPlugs.begin(); +	_nonEnginePlugs = 0; +	_skipStaticPlugs = true; //Only need to load static plugins once. -	bool updateNonEnginePlugs; -	if (nonEnginePlugs == -1) { //TODO: All of this assumes engine plugins will always be last in "plugs". Is this the case? -		nonEnginePlugs = 0; -		updateNonEnginePlugs = true; -	} else { -		for (int i=0; i<nonEnginePlugs; i++) { -			++_currentPlugin; -		} -		updateNonEnginePlugs = false; -	} +	_currentPlugin = _allPlugs.begin(); -	if (_allPlugs.empty()) { //TODO: this case is untested. +	if (_allPlugs.empty()) {  		return; //return here if somehow there are no plugins to load.  	} @@ -337,7 +332,7 @@ void PluginManager::loadFirstPlugin() { //TODO: rename? It's not quite clear tha  		if ((*_currentPlugin)->getType() == PLUGIN_TYPE_ENGINE) {  			break;  		} -		if (updateNonEnginePlugs) nonEnginePlugs++; +		_nonEnginePlugs++;  		++_currentPlugin;  		if (_currentPlugin == _allPlugs.end()) {  			break; //break if there were no engine plugins to load. @@ -347,7 +342,7 @@ void PluginManager::loadFirstPlugin() { //TODO: rename? It's not quite clear tha  }  bool PluginManager::loadNextPlugin() { -	if (nonEnginePlugs == _allPlugs.size()) return false; //There are no Engine Plugins in this case. +	if (_nonEnginePlugs == _allPlugs.size()) return false; //There are no Engine Plugins in this case.  	//To ensure only one engine plugin is loaded at a time, we unload all engine plugins before trying to load a new one.  	unloadPluginsExcept(PLUGIN_TYPE_ENGINE, NULL);  	++_currentPlugin; diff --git a/base/plugins.h b/base/plugins.h index 1c7b84e338..717e18a4a7 100644 --- a/base/plugins.h +++ b/base/plugins.h @@ -212,6 +212,11 @@ public:  	 * @return a list of Plugin instances  	 */  	virtual PluginList getPlugins() = 0; + +	/** +	 * @return whether or not object is a FilePluginProvider. +	 */ +	virtual bool isFilePluginProvider() { return false; }  };  #ifdef DYNAMIC_MODULES @@ -234,6 +239,11 @@ public:  	 */  	virtual PluginList getPlugins(); +	/** +	 * @return whether or not object is a FilePluginProvider. +	 */ +	bool isFilePluginProvider() { return true; } +  protected:  	/**  	 * Create a Plugin instance from a loadable code module with the specified name. @@ -279,8 +289,10 @@ private:  	PluginList _allPlugs;  	PluginList::iterator _currentPlugin; -	int nonEnginePlugs; -	 +	bool _skipStaticPlugs; + +	int _nonEnginePlugs; +  	bool tryLoadPlugin(Plugin *plugin);  	friend class Common::Singleton<SingletonBaseType>;  | 
