diff src/core/sat_main.py @ 972:07b817f5a197

core: better plugin initialisation sequence: - profileConnected are now executed in a deferredList, instead of one after the other - failure are collected, and a global message show which plugins failed and the failure message
author Goffi <goffi@goffi.org>
date Wed, 02 Apr 2014 12:31:23 +0200
parents 723f28cd15c7
children 3a96920c07b7
line wrap: on
line diff
--- a/src/core/sat_main.py	Wed Apr 02 12:31:15 2014 +0200
+++ b/src/core/sat_main.py	Wed Apr 02 12:31:23 2014 +0200
@@ -204,7 +204,6 @@
         """Connect to jabber server with asynchronous reply
         @param profile_key: %(doc_profile)s
         """
-
         profile = self.memory.getProfileName(profile_key)
         if not profile:
             error(_('Trying to connect a non-exsitant profile'))
@@ -255,14 +254,34 @@
                     plugin[1].getHandler(profile).setHandlerParent(current)
                 connected_cb = getattr(plugin[1], "profileConnected", None)
                 if connected_cb:
-                    plugin_conn_cb.append(connected_cb)
+                    plugin_conn_cb.append((plugin[0], connected_cb))
 
             current.startService()
 
             d = current.getConnectionDeferred()
             d.addCallback(lambda dummy: current.roster.got_roster)  # we want to be sure that we got the roster
-            for callback in plugin_conn_cb:
-                d.addCallback(lambda dummy, callback=callback: callback(profile))
+
+            def pluginsConnection(dummy):
+                """Call profileConnected callback for all plugins, and print error message if any of them fails"""
+                conn_cb_list = []
+                for dummy, callback in plugin_conn_cb:
+                    conn_cb_list.append(defer.maybeDeferred(callback, profile))
+                list_d = defer.DeferredList(conn_cb_list)
+
+                def logPluginResults(results):
+                    all_succeed = all([success for success, result in results])
+                    if not all_succeed:
+                        error(_("Plugins initialisation error"))
+                        for idx, (success, result) in enumerate(results):
+                            if not success:
+                                error("Error (plugin %(name)s): %(failure)s" % {'name': plugin_conn_cb[idx][0],
+                                                                                'failure': result})
+
+                list_d.addCallback(logPluginResults)
+                return list_d
+
+
+            d.addCallback(pluginsConnection)
             return d
 
         self.memory.startProfileSession(profile)