linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #05823
[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;