diff --git a/deluge/plugins/stats/stats/__init__.py b/deluge/plugins/stats/stats/__init__.py index 79a2bc9d1..09d38103c 100644 --- a/deluge/plugins/stats/stats/__init__.py +++ b/deluge/plugins/stats/stats/__init__.py @@ -35,42 +35,23 @@ # this exception statement from your version. If you delete this exception # statement from all source files in the program, then also delete it here. # -# -# In addition, as a special exception, the copyright holders give -# permission to link the code of portions of this program with the OpenSSL -# library. -# You must obey the GNU General Public License in all respects for all of -# the code used other than OpenSSL. If you modify file(s) with this -# exception, you may extend this exception to your version of the file(s), -# but you are not obligated to do so. If you do not wish to do so, delete -# this exception statement from your version. If you delete this exception -from deluge.log import LOG as log +from deluge.plugins.init import PluginInitBase -from deluge.plugins.init import PluginBase +class CorePlugin(PluginInitBase): + def __init__(self, plugin_name): + from core import Core as _plugin_cls + self._plugin_cls = _plugin_cls + super(CorePlugin, self).__init__(plugin_name) -class CorePlugin(PluginBase): - def __init__(self, plugin_api, plugin_name): - # Load the Core portion of the plugin - try: - from core import Core - self.plugin = Core(plugin_api, plugin_name) - except Exception, e: - log.debug("Did not load a Core plugin: %s", e) +class GtkUIPlugin(PluginInitBase): + def __init__(self, plugin_name): + from gtkui import GtkUI as _plugin_cls + self._plugin_cls = _plugin_cls + super(GtkUIPlugin, self).__init__(plugin_name) -class WebUIPlugin(PluginBase): - def __init__(self, plugin_api, plugin_name): - try: - from webui import WebUI - self.plugin = WebUI(plugin_api, plugin_name) - except Exception, e: - log.debug("Did not load a WebUI plugin: %s", e) - -class GtkUIPlugin(PluginBase): - def __init__(self, plugin_api, plugin_name): - # Load the GtkUI portion of the plugin - try: - from gtkui import GtkUI - self.plugin = GtkUI(plugin_api, plugin_name) - except Exception, e: - log.debug("Did not load a GtkUI plugin: %s", e) +class WebUIPlugin(PluginInitBase): + def __init__(self, plugin_name): + from webui import WebUI as _plugin_cls + self._plugin_cls = _plugin_cls + super(WebUIPlugin, self).__init__(plugin_name) diff --git a/deluge/plugins/stats/stats/core.py b/deluge/plugins/stats/stats/core.py index d9848bdd4..4cddc42ee 100644 --- a/deluge/plugins/stats/stats/core.py +++ b/deluge/plugins/stats/stats/core.py @@ -43,27 +43,27 @@ # but you are not obligated to do so. If you do not wish to do so, delete # this exception statement from your version. If you delete this exception +from twisted.internet.task import LoopingCall + import deluge from deluge.log import LOG as log -from deluge.plugins.corepluginbase import CorePluginBase +from deluge.plugins.pluginbase import CorePluginBase from deluge import component from deluge import configmanager -import gobject -#from deluge.plugins.coreclient import client #1.1 and later only -#client: see http://dev.deluge-torrent.org/wiki/Development/UiClient#Remoteapi +from deluge.core.rpcserver import export DEFAULT_PREFS = { - "test":"NiNiNi", - "update_interval":2000, #2 seconds. - "length":150, # 2 seconds * 150 --> 5 minutes. + "test": "NiNiNi", + "update_interval": 2, #2 seconds. + "length": 150, # 2 seconds * 150 --> 5 minutes. } DEFAULT_TOTALS = { - "total_upload":0, - "total_download":0, - "total_payload_upload":0, - "total_payload_download":0, - "stats":{} + "total_upload": 0, + "total_download": 0, + "total_payload_upload": 0, + "total_payload_download": 0, + "stats": {} } class Core(CorePluginBase): @@ -78,90 +78,88 @@ class Core(CorePluginBase): if self.totals == {}: self.totals.update(self.saved_stats.config) - self.stats = self.saved_stats.get("stats") or {} - self.add_stats( - 'upload_rate', - 'download_rate', - 'num_connections', - 'dht_nodes', - 'dht_cache_nodes', - 'dht_torrents', - ) + self.stats = self.saved_stats["stats"] or {} - self.update_timer = gobject.timeout_add( - self.config.get("update_interval"), self.update_stats) - self.save_timer = gobject.timeout_add(60 * 1000, self.save_stats) - self.length = self.config.get("length") + self.stats_keys = [ + "payload_download_rate", + "payload_upload_rate" + ] + self.update_stats() + + self.update_timer = LoopingCall(self.update_stats) + self.update_timer.start(self.config["update_interval"]) + + self.save_timer = LoopingCall(self.save_stats) + self.save_timer.start(60) def disable(self): self.save_stats() - gobject.source_remove(self.update_timer) - gobject.source_remove(self.save_timer) - - def add_stats(self, *stats): - for stat in stats: - if stat not in self.stats: - self.stats[stat] = [] + try: + self.update_timer.stop() + self.save_timer.stop() + except: + pass def update_stats(self): try: - stats = self.core.export_get_stats() - status = self.core.session.status() - for stat in dir(status): - if not stat.startswith('_') and stat not in stats: - stats[stat] = getattr(status, stat, None) + status = self.core.get_session_status(self.stats_keys) + for key, value in status.items(): + if key not in self.stats: + self.stats[key] = [] + self.stats[key].insert(0, value) - for stat, stat_list in self.stats.iteritems(): - if stat in stats: - stat_list.insert(0, int(stats[stat])) - - if len(stat_list) > self.length: + for stat_list in self.stats.values(): + if len(stat_list) > self.config["length"]: stat_list.pop() - except Exception,e: - log.error(e.message) - return True + + except Exception, e: + log.exception(e) def save_stats(self): try: - self.saved_stats.set("stats", self.stats) - self.saved_stats.config.update(self.export_get_totals()) + self.saved_stats["stats"] = self.stats + self.saved_stats.config.update(self.get_totals()) self.saved_stats.save() except Exception,e: - log.error(e.message) + log.exception(e) return True # export: - def export_get_stats(self, keys): + @export() + def get_stats(self, keys): stats_dict = {} - for stat in self.stats: - if stat not in keys: - continue - stats_dict[stat] = self.stats[stat] + for key in keys: + if key in self.stats: + stats_dict[key] = self.stats[key] return stats_dict - def export_get_totals(self): + @export() + def get_totals(self): result = {} - session_totals = self.export_get_session_totals() + session_totals = self.get_session_totals() for key in session_totals: result[key] = self.totals[key] + session_totals[key] return result - def export_get_session_totals(self): + @export() + def get_session_totals(self): status = self.core.session.status() return { - "total_upload":status.total_upload, - "total_download":status.total_download, - "total_payload_upload":status.total_payload_upload, - "total_payload_download":status.total_payload_download + "total_upload": status.total_upload, + "total_download": status.total_download, + "total_payload_upload": status.total_payload_upload, + "total_payload_download": status.total_payload_download } - def export_set_config(self, config): + @export() + def set_config(self, config): "sets the config dictionary" for key in config.keys(): self.config[key] = config[key] self.config.save() - def export_get_config(self): + @export() + def get_config(self): "returns the config dictionary" return self.config.config diff --git a/deluge/plugins/stats/stats/graph.py b/deluge/plugins/stats/stats/graph.py index 5c09b6608..ce839aba5 100644 --- a/deluge/plugins/stats/stats/graph.py +++ b/deluge/plugins/stats/stats/graph.py @@ -49,7 +49,7 @@ port of old plugin by markybob. import time import cairo from deluge.log import LOG as log -from deluge.ui.client import aclient +from deluge.ui.client import client black = (0, 0, 0) gray = (0.75, 0.75, 0.75) @@ -101,10 +101,6 @@ class Graph: 'color': color } - def async_request(self): - aclient.stats_get_stats(self.set_stats, self.stat_info.keys()) - aclient.stats_get_config(self.set_config) - def set_stats(self, stats): self.stats = stats @@ -115,12 +111,15 @@ class Graph: def draw_to_context(self, context, width, height): self.ctx = context self.width, self.height = width, height - self.draw_rect(white, 0, 0, self.width, self.height) - self.draw_x_axis() - self.draw_left_axis() + try: + self.draw_rect(white, 0, 0, self.width, self.height) + self.draw_x_axis() + self.draw_left_axis() - if self.legend_selected: - self.draw_legend() + if self.legend_selected: + self.draw_legend() + except cairo.Error, e: + log.exception(e) return self.ctx def draw(self, width, height): @@ -258,4 +257,4 @@ class Graph: #self.ctx.set_dash((1, 1), 0) if __name__ == "__main__": - import test \ No newline at end of file + import test diff --git a/deluge/plugins/stats/stats/gtkui.py b/deluge/plugins/stats/stats/gtkui.py index d79fc4876..0e2111152 100644 --- a/deluge/plugins/stats/stats/gtkui.py +++ b/deluge/plugins/stats/stats/gtkui.py @@ -49,12 +49,15 @@ import gtk import gobject from gtk.glade import XML +from twisted.internet import defer + import graph from deluge import component from deluge.log import LOG as log from deluge.common import fspeed -from deluge.ui.client import aclient +from deluge.ui.client import client from deluge.ui.gtkui.torrentdetails import Tab +from deluge.plugins.pluginbase import GtkPluginBase class GraphsTab(Tab): def __init__(self, glade): @@ -72,8 +75,8 @@ class GraphsTab(Tab): def bandwidth_expose(self, widget, event): self.graph_widget = self.bandwidth_graph self.graph = graph.Graph() - self.graph.add_stat('download_rate', label='Download Rate', color=graph.green) - self.graph.add_stat('upload_rate', label='Upload Rate', color=graph.blue) + self.graph.add_stat('payload_download_rate', label='Download Rate', color=graph.green) + self.graph.add_stat('payload_upload_rate', label='Upload Rate', color=graph.blue) self.graph.set_left_axis(formatter=fspeed, min=10240) self.update_timer = gobject.timeout_add(2000, self.update_graph) self.update_graph() @@ -81,21 +84,26 @@ class GraphsTab(Tab): def update_graph(self): width, height = self.graph_widget.allocation.width, self.graph_widget.allocation.height context = self.graph_widget.window.cairo_create() - self.graph.async_request() - aclient.force_call(True) - self.graph.draw_to_context(context, width, height) + + log.debug("getstat keys: %s", self.graph.stat_info.keys()) + d1 = client.stats.get_stats(self.graph.stat_info.keys()) + d1.addCallback(self.graph.set_stats) + d2 = client.stats.get_config() + d2.addCallback(self.graph.set_config) + dl = defer.DeferredList([d1, d2]) + + def draw_context(result): + self.graph.draw_to_context(context, width, height) + dl.addCallback(draw_context) + return True -class GtkUI(object): - def __init__(self, plugin_api, plugin_name): - log.debug("Calling Stats UI init") - self.plugin = plugin_api - +class GtkUI(GtkPluginBase): def enable(self): self.glade = XML(self.get_resource("config.glade")) - self.plugin.add_preferences_page("Stats", self.glade.get_widget("prefs_box")) - self.plugin.register_hook("on_apply_prefs", self.on_apply_prefs) - self.plugin.register_hook("on_show_prefs", self.on_show_prefs) + component.get("Preferences").add_page("Stats", self.glade.get_widget("prefs_box")) + component.get("PluginManager").register_hook("on_apply_prefs", self.on_apply_prefs) + component.get("PluginManager").register_hook("on_show_prefs", self.on_show_prefs) self.on_show_prefs() self.graphs_tab = GraphsTab(XML(self.get_resource("tabs.glade"))) @@ -103,19 +111,19 @@ class GtkUI(object): self.torrent_details.notebook.append_page(self.graphs_tab.window, self.graphs_tab.label) def disable(self): - self.plugin.remove_preferences_page("Stats") - self.plugin.deregister_hook("on_apply_prefs", self.on_apply_prefs) - self.plugin.deregister_hook("on_show_prefs", self.on_show_prefs) + component.get("Preferences").remove_page("Stats") + component.get("PluginManager").deregister_hook("on_apply_prefs", self.on_apply_prefs) + component.get("PluginManager").deregister_hook("on_show_prefs", self.on_show_prefs) def on_apply_prefs(self): log.debug("applying prefs for Stats") config = { "test":self.glade.get_widget("txt_test").get_text() } - aclient.stats_set_config(None, config) + client.stats.set_config(config) def on_show_prefs(self): - aclient.stats_get_config(self.cb_get_config) + client.stats.get_config().addCallback(self.cb_get_config) def cb_get_config(self, config): "callback for on show_prefs"