← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2978: more unique_ptr

 

------------------------------------------------------------
revno: 2978
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Mon 2012-07-02 23:05:41 +0200
message:
  more unique_ptr
modified:
  dcpp/PluginManager.cpp
  dcpp/PluginManager.h


--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk

Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'dcpp/PluginManager.cpp'
--- dcpp/PluginManager.cpp	2012-07-02 18:13:18 +0000
+++ dcpp/PluginManager.cpp	2012-07-02 21:05:41 +0000
@@ -19,16 +19,15 @@
 #include "stdinc.h"
 #include "PluginManager.h"
 
-#include <utility>
-
+#include "Client.h"
+#include "ClientManager.h"
 #include "ConnectionManager.h"
 #include "QueueManager.h"
-#include "ClientManager.h"
+#include "SimpleXML.h"
 #include "StringTokenizer.h"
-#include "SimpleXML.h"
-
 #include "UserConnection.h"
-#include "Client.h"
+
+#include <utility>
 
 #ifdef _WIN32
 # define PLUGIN_EXT "*.dll"
@@ -81,7 +80,7 @@
 
 	dcassert(dcCore.apiVersion != 0);
 
-	pluginHandle hr = LOAD_LIBRARY(fileName);
+	PluginHandle hr = LOAD_LIBRARY(fileName);
 	if(!hr) {
 		LogManager::getInstance()->message(str(F_("Error loading %1%: %2%") % Util::getFileName(fileName) % GET_ERROR()));
 		return false;
@@ -97,7 +96,7 @@
 		if((dcMain = pluginInfo(&info)) != NULL) {
 			if(checkPlugin(info)) {
 				if(dcMain((isInstall ? ON_INSTALL : ON_LOAD), &dcCore, NULL) != False) {
-					plugins.push_back(new PluginInfo(fileName, hr, info, dcMain));
+					plugins.emplace_back(new PluginInfo(fileName, hr, info, dcMain));
 					return true;
 				}
 			}
@@ -109,7 +108,7 @@
 }
 
 bool PluginManager::isLoaded(const string& guid) {
-	auto pluginComp = [&guid](const PluginInfo* p) -> bool { return strcmp(p->getInfo().guid, guid.c_str()) == 0; };
+	auto pluginComp = [&guid](const unique_ptr<PluginInfo>& p) -> bool { return strcmp(p->getInfo().guid, guid.c_str()) == 0; };
 	auto i = std::find_if(plugins.begin(), plugins.end(), pluginComp);
 	return (i != plugins.end());
 }
@@ -144,21 +143,20 @@
 	Lock l(cs);
 	shutdown = true;
 
-	// Off we go...
+	// Update plugin order
 	string installed;
-	for(PluginList::reverse_iterator i = plugins.rbegin(); i != plugins.rend();) {
-		PluginInfo* plugin = *i;
-		installed.size() ? installed = plugin->getFile() + ";" + installed : installed = plugin->getFile(); 
-		i = PluginList::reverse_iterator(plugins.erase(i.base()-1));
-		delete plugin;
+	for(auto& i: plugins) {
+		if(!installed.empty()) installed += ";";
+		installed += i->getFile();
 	}
-
-	// Update plugin order
 	setPluginSetting("CoreSetup", "Plugins", installed);
 
+	// Off we go...
+	plugins.clear();
+
 	// Really unload plugins that have been flagged inactive (ON_UNLOAD returns False)
-	for(auto i = inactive.begin(); i != inactive.end(); ++i)
-		FREE_LIBRARY(*i);
+	for(auto& i: inactive)
+		FREE_LIBRARY(i);
 
 	// Destroy hooks that may have not been correctly freed
 	hooks.clear();
@@ -170,15 +168,12 @@
 	PluginApiImpl::releaseAPI();
 }
 
-void PluginManager::unloadPlugin(int index) {
+void PluginManager::unloadPlugin(size_t index) {
 	Lock l(cs);
-
-	PluginInfo* plugin = plugins[index];
 	plugins.erase(plugins.begin() + index);
-	delete plugin;
 }
 
-bool PluginManager::addInactivePlugin(pluginHandle h) {
+bool PluginManager::addInactivePlugin(PluginHandle h) {
 	if(std::find(inactive.begin(), inactive.end(), h) == inactive.end()) {
 		inactive.push_back(h);
 		return true;
@@ -192,6 +187,18 @@
 	swap(*i, *(i + pos));
 }
 
+vector<PluginInfo*> PluginManager::getPluginList() const {
+	Lock l(cs);
+	vector<PluginInfo*> ret;
+	std::copy(plugins.begin(), plugins.end(), ret.begin());
+	return ret;
+};
+
+const PluginInfo* PluginManager::getPlugin(size_t index) const {
+	Lock l(cs);
+	return plugins[index].get();
+}
+
 // Functions that call the plugin
 bool PluginManager::onChatDisplay(string& htmlMessage, OnlineUser* from) {
 	StringData data;

=== modified file 'dcpp/PluginManager.h'
--- dcpp/PluginManager.h	2012-07-02 18:13:18 +0000
+++ dcpp/PluginManager.h	2012-07-02 21:05:41 +0000
@@ -38,9 +38,9 @@
 #include "PluginApiImpl.h"
 
 #ifdef _WIN32
-typedef HMODULE pluginHandle;
+typedef HMODULE PluginHandle;
 #else
-typedef void* pluginHandle;
+typedef void* PluginHandle;
 #endif
 
 namespace dcpp {
@@ -75,7 +75,7 @@
 public:
 	typedef	DCMAIN	(DCAPI *PLUGIN_INIT)(MetaDataPtr info);
 
-	PluginInfo(const string& aFile, pluginHandle hInst, MetaData aInfo, DCMAIN aMain)
+	PluginInfo(const string& aFile, PluginHandle hInst, MetaData aInfo, DCMAIN aMain)
 		: dcMain(aMain), info(aInfo), file(aFile), handle(hInst) { };
 
 	~PluginInfo();
@@ -87,14 +87,12 @@
 private:
 	MetaData info;
 	string file;
-	pluginHandle handle;
+	PluginHandle handle;
 };
 
 class PluginManager : public Singleton<PluginManager>, private TimerManagerListener,
 	private ClientManagerListener, private QueueManagerListener, private SettingsManagerListener
 {
-	typedef vector<PluginInfo*> PluginList;
-
 public:
 	PluginManager() : shutdown(false), secNum(Util::rand()) {
 		memzero(&dcCore, sizeof(DCCore));
@@ -110,14 +108,14 @@
 	bool isLoaded(const string& guid);
 
 	void unloadPlugins();
-	void unloadPlugin(int index);
+	void unloadPlugin(size_t index);
 
-	bool addInactivePlugin(pluginHandle h);
+	bool addInactivePlugin(PluginHandle h);
 	bool getShutdown() const { return shutdown; }
 
 	void movePlugin(size_t index, int pos);
-	PluginList getPluginList() const { Lock l(cs); return plugins; };
-	const PluginInfo* getPlugin(size_t index) const { Lock l(cs); return plugins[index]; }
+	vector<PluginInfo*> getPluginList() const;
+	const PluginInfo* getPlugin(size_t index) const;
 
 	DCCorePtr getCore() { return &dcCore; }
 
@@ -185,8 +183,8 @@
 	void on(SettingsManagerListener::Load, SimpleXML& /*xml*/) noexcept;
 	void on(SettingsManagerListener::Save, SimpleXML& /*xml*/) noexcept;
 
-	PluginList plugins;
-	vector<pluginHandle> inactive;
+	vector<unique_ptr<PluginInfo>> plugins;
+	vector<PluginHandle> inactive;
 
 	map<string, unique_ptr<PluginHook>> hooks;
 	map<string, dcptr_t> interfaces;