← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2984: show plugin addition errors in a message box

 

------------------------------------------------------------
revno: 2984
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Sat 2012-07-07 18:11:11 +0200
message:
  show plugin addition errors in a message box
modified:
  dcpp/DCPlusPlus.cpp
  dcpp/DCPlusPlus.h
  dcpp/PluginManager.cpp
  dcpp/PluginManager.h
  win32/PluginPage.cpp
  win32/main.cpp


--
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/DCPlusPlus.cpp'
--- dcpp/DCPlusPlus.cpp	2012-07-01 18:41:13 +0000
+++ dcpp/DCPlusPlus.cpp	2012-07-07 16:11:11 +0000
@@ -47,7 +47,7 @@
 
 namespace dcpp {
 
-void startup(void (*f)(void*, const string&), void* p) {
+void startup(function<void (const string&)> f) {
 	// "Dedicated to the near-memory of Nev. Let's start remembering people while they're still alive."
 	// Nev's great contribution to dc++
 	while(1) break;
@@ -99,16 +99,17 @@
 	}
 #endif
 
-	auto announce = [&f, &p](const string& str) {
-		if(f)
-			(*f)(p, str);
+	auto announce = [&f](const string& str) {
+		if(f) {
+			f(str);
+		}
 	};
 
 	announce(_("Users"));
 	ClientManager::getInstance()->loadUsers();
 	FavoriteManager::getInstance()->load();
 
-	PluginManager::getInstance()->loadPlugins(f, p);
+	PluginManager::getInstance()->loadPlugins(f);
 
 	announce(_("Security certificates"));
 	CryptoManager::getInstance()->loadCertificates();

=== modified file 'dcpp/DCPlusPlus.h'
--- dcpp/DCPlusPlus.h	2012-01-13 20:55:20 +0000
+++ dcpp/DCPlusPlus.h	2012-07-07 16:11:11 +0000
@@ -21,13 +21,15 @@
 
 #include "compiler.h"
 
+#include <functional>
 #include <string>
 
 namespace dcpp {
 
+using std::function;
 using std::string;
 
-extern void startup(void (*f)(void*, const string&), void* p);
+extern void startup(function<void (const string&)> f);
 extern void shutdown();
 
 } // namespace dcpp

=== modified file 'dcpp/PluginManager.cpp'
--- dcpp/PluginManager.cpp	2012-07-03 17:17:03 +0000
+++ dcpp/PluginManager.cpp	2012-07-07 16:11:11 +0000
@@ -61,7 +61,7 @@
 	}
 }
 
-void PluginManager::loadPlugins(void (*f)(void*, const string&), void* p) {
+void PluginManager::loadPlugins(function<void (const string&)> f) {
 	PluginApiImpl::initAPI(dcCore);
 
 	TimerManager::getInstance()->addListener(this);
@@ -69,20 +69,21 @@
 	QueueManager::getInstance()->addListener(this);
 
 	StringTokenizer<string> st(getPluginSetting("CoreSetup", "Plugins"), ";");
-	for(StringIter i = st.getTokens().begin(); i != st.getTokens().end(); ++i) {
-		if(!loadPlugin(*i) || !f) continue;
-		(*f)(p, Util::getFileName(*i));
+	auto err = [](const string& str) { LogManager::getInstance()->message(str); };
+	for(auto& i: st.getTokens()) {
+		if(!loadPlugin(i, err) || !f) continue;
+		f(Util::getFileName(i));
 	}
 }
 
-bool PluginManager::loadPlugin(const string& fileName, bool isInstall /*= false*/) {
+bool PluginManager::loadPlugin(const string& fileName, function<void (const string&)> err, bool install) {
 	Lock l(cs);
 
 	dcassert(dcCore.apiVersion != 0);
 
 	PluginHandle hr = LOAD_LIBRARY(fileName);
 	if(!hr) {
-		LogManager::getInstance()->message(str(F_("Error loading %1%: %2%") % Util::getFileName(fileName) % GET_ERROR()));
+		err(str(F_("Error loading %1%: %2%") % Util::getFileName(fileName) % GET_ERROR()));
 		return false;
 	}
 
@@ -94,14 +95,14 @@
 
 		DCMAIN dcMain;
 		if((dcMain = pluginInfo(&info)) != NULL) {
-			if(checkPlugin(info)) {
-				if(dcMain((isInstall ? ON_INSTALL : ON_LOAD), &dcCore, NULL) != False) {
+			if(checkPlugin(info, err)) {
+				if(dcMain((install ? ON_INSTALL : ON_LOAD), &dcCore, NULL) != False) {
 					plugins.emplace_back(new PluginInfo(fileName, hr, info, dcMain));
 					return true;
 				}
 			}
 		}
-	} else LogManager::getInstance()->message(str(F_("%1% is not a valid plugin") % Util::getFileName(fileName)));
+	} else err(str(F_("%1% is not a valid plugin") % Util::getFileName(fileName)));
 
 	FREE_LIBRARY(hr);
 	return false;
@@ -113,16 +114,16 @@
 	return (i != plugins.end());
 }
 
-bool PluginManager::checkPlugin(const MetaData& info) {
+bool PluginManager::checkPlugin(const MetaData& info, function<void (const string&)> err) {
 	// Check if user is trying to load a duplicate
 	if(isLoaded(info.guid)) {
-		LogManager::getInstance()->message(str(F_("%1% is already installed") % info.name));
+		err(str(F_("%1% is already installed") % info.name));
 		return false;
 	}
 
 	// Check API compatibility (this should only block on absolutely wrecking api changes, which generally should not happen)
 	if(info.apiVersion < DCAPI_CORE_VER) {
-		LogManager::getInstance()->message(str(F_("%1% is too old, contact the plugin author for an update") % info.name));
+		err(str(F_("%1% is too old, contact the plugin author for an update") % info.name));
 		return false;
 	}
 
@@ -130,7 +131,7 @@
 	if(info.numDependencies != 0) {
 		for(size_t i = 0; i < info.numDependencies; ++i) {
 			if(!isLoaded(info.dependencies[i])) {
-				LogManager::getInstance()->message(str(F_("Missing dependencies for %1%") % info.name));
+				err(str(F_("Missing dependencies for %1%") % info.name));
 				return false;
 			}
 		}

=== modified file 'dcpp/PluginManager.h'
--- dcpp/PluginManager.h	2012-07-02 21:05:41 +0000
+++ dcpp/PluginManager.h	2012-07-07 16:11:11 +0000
@@ -24,6 +24,7 @@
 #include <functional>
 #include <map>
 #include <memory>
+#include <string>
 #include <vector>
 
 #include "Singleton.h"
@@ -47,6 +48,7 @@
 
 using std::function;
 using std::map;
+using std::string;
 using std::unique_ptr;
 using std::vector;
 
@@ -103,8 +105,8 @@
 		SettingsManager::getInstance()->removeListener(this);
 	}
 
-	void loadPlugins(void (*f)(void*, const string&), void* p);
-	bool loadPlugin(const string& fileName, bool isInstall = false);
+	void loadPlugins(function<void (const string&)> f);
+	bool loadPlugin(const string& fileName, function<void (const string&)> err, bool install = false);
 	bool isLoaded(const string& guid);
 
 	void unloadPlugins();
@@ -166,7 +168,7 @@
 
 private:
 	// Check if plugin can be loaded
-	bool checkPlugin(const MetaData& info);
+	bool checkPlugin(const MetaData& info, function<void (const string&)> err);
 
 	// Listeners
 	void on(TimerManagerListener::Second, uint64_t ticks) noexcept { runHook(HOOK_TIMER_SECOND, NULL, &ticks); }

=== modified file 'win32/PluginPage.cpp'
--- win32/PluginPage.cpp	2012-07-07 13:21:05 +0000
+++ win32/PluginPage.cpp	2012-07-07 16:11:11 +0000
@@ -253,15 +253,17 @@
 }
 
 void PluginPage::handleAddPlugin() {
-	auto aPath = Util::emptyStringT;
-		LoadDialog dlg(this);
-		dlg.addFilter(T_("DLL Files"), _T("*.dll"));
-		dlg.setInitialDirectory(Text::toT(Util::getPath(Util::PATH_GLOBAL_CONFIG) + "Plugins"));
-	
-	if(dlg.open(aPath)) {
+	tstring path;
+	if(LoadDialog(this).addFilter(T_("DLL files"), _T("*.dll"))
+		.setInitialDirectory(Text::toT(Util::getPath(Util::PATH_GLOBAL_CONFIG) + "Plugins")).open(path))
+	{
 		auto idx = plugins->size();
-		if(PluginManager::getInstance()->loadPlugin(Text::fromT(aPath), true))
+		if(PluginManager::getInstance()->loadPlugin(Text::fromT(path), [this, &path](const string& str) {
+			dwt::MessageBox(this).show(Text::toT(str), Text::toT(Util::getFileName(Text::fromT(path))),
+				dwt::MessageBox::BOX_OK, dwt::MessageBox::BOX_ICONSTOP);
+		}, true)) {
 			addEntry(idx, PluginManager::getInstance()->getPlugin(idx)->getInfo());
+		}
 	}
 }
 

=== modified file 'win32/main.cpp'
--- win32/main.cpp	2012-01-13 20:55:20 +0000
+++ win32/main.cpp	2012-07-07 16:11:11 +0000
@@ -58,11 +58,6 @@
 	return TRUE;
 }
 
-void callBack(void* ptr, const string& a) {
-	SplashWindow& splash = *((SplashWindow*)ptr);
-	splash(a);
-}
-
 #ifdef _DEBUG
 void (*old_handler)();
 
@@ -140,7 +135,7 @@
 
 	try {
 		SplashWindow* splash(new SplashWindow);
-		startup(&callBack, splash);
+		startup([splash](const string& str) { (*splash)(str); });
 
 		bindtextdomain(PACKAGE, LOCALEDIR);
 		textdomain(PACKAGE);