From ac1bffb65f07ec57f01ae2573c7b51dbfe1b7739 Mon Sep 17 00:00:00 2001 From: Andrew Resch Date: Wed, 25 Jul 2007 05:07:43 +0000 Subject: [PATCH] get_torrent_status() and get_torrent_info() now use pickled dictionaries thus removing the need for the templates. --- deluge/core/core.py | 31 +++++++++---------------- deluge/core/torrent.py | 41 +++++++++++++++++----------------- deluge/core/torrentmanager.py | 41 ++++++++++------------------------ deluge/ui/gtkui/functions.py | 33 ++++++++++++++------------- deluge/ui/gtkui/torrentview.py | 12 +++++----- 5 files changed, 66 insertions(+), 92 deletions(-) diff --git a/deluge/core/core.py b/deluge/core/core.py index d25825f02..7e2d79654 100644 --- a/deluge/core/core.py +++ b/deluge/core/core.py @@ -33,6 +33,7 @@ import logging import os.path +import pickle try: import dbus, dbus.service @@ -128,31 +129,21 @@ class Core(dbus.service.Object): self.torrent_paused(torrent_id) @dbus.service.method(dbus_interface="org.deluge_torrent.Deluge", - in_signature="s", out_signature="(sxi)") + in_signature="s", out_signature="ay") def get_torrent_info(self, torrent_id): - # Get the info tuple from the torrent and return it - return self.torrents[torrent_id].get_info() + # Pickle the info dictionary from the torrent and return it + info = self.torrents[torrent_id].get_info() + info = pickle.dumps(info) + return info @dbus.service.method(dbus_interface="org.deluge_torrent.Deluge", in_signature="s", - out_signature="(ibdixxddiixii)") + out_signature="ay") def get_torrent_status(self, torrent_id): - # Get the status tuple from the torrent and return it - return self.torrents[torrent_id].get_status() - - @dbus.service.method(dbus_interface="org.deluge_torrent.Deluge", - in_signature="", - out_signature="as") - def get_torrent_status_template(self): - # A list of strings the correspond to the status tuple - return self.torrents.get_status_template() - - @dbus.service.method(dbus_interface="org.deluge_torrent.Deluge", - in_signature="", - out_signature="as") - def get_torrent_info_template(self): - # A list of strings the correspond to the info tuple - return self.torrents.get_info_template() + # Pickle the status dictionary from the torrent and return it + status = self.torrents[torrent_id].get_status() + status = pickle.dumps(status) + return status ## Queueing functions ###### @dbus.service.method(dbus_interface="org.deluge_torrent.Deluge", diff --git a/deluge/core/torrent.py b/deluge/core/torrent.py index ca58efb67..27e7f675d 100644 --- a/deluge/core/torrent.py +++ b/deluge/core/torrent.py @@ -75,29 +75,28 @@ class Torrent: """Returns the torrents info.. stuff that remains constant, such as name.""" - return ( - self.handle.torrent_info().name(), - self.handle.torrent_info().total_size(), - self.handle.status().num_pieces - ) + return { + "name": self.handle.torrent_info().name(), + "total_size": self.handle.torrent_info().total_size(), + "num_pieces": self.handle.status().num_pieces + } def get_status(self): """Returns the torrent status""" status = self.handle.status() - return ( - status.state, - status.paused, - status.progress, - status.next_announce.seconds, - status.total_payload_download, - status.total_payload_upload, - status.download_payload_rate, - status.upload_payload_rate, - status.num_peers, - status.num_seeds, - status.total_wanted, - self.get_eta(), - self.queue[self.torrent_id] - ) - + return { + "state": int(status.state), + "paused": status.paused, + "progress": status.progress, + "next_announce": status.next_announce.seconds, + "total_payload_download": status.total_payload_download, + "total_payload_upload": status.total_payload_upload, + "download_payload_rate": status.download_payload_rate, + "upload_payload_rate": status.upload_payload_rate, + "num_peers": status.num_peers, + "num_seeds": status.num_seeds, + "total_wanted": status.total_wanted, + "eta": self.get_eta(), + "queue": self.queue[self.torrent_id] + } diff --git a/deluge/core/torrentmanager.py b/deluge/core/torrentmanager.py index bd40a1340..af125e287 100644 --- a/deluge/core/torrentmanager.py +++ b/deluge/core/torrentmanager.py @@ -59,15 +59,24 @@ class TorrentManager: """Return the Torrent with torrent_id""" return self.torrents[torrent_id] - def add(self, filename, filedump): + def add(self, filename, filedump=None): """Add a torrent to the manager and returns it's torrent_id""" # Get the core config config = Config("core.conf") # Convert the filedump data array into a string of bytes - filedump = "".join(chr(b) for b in filedump) + if filedump is not None: + filedump = "".join(chr(b) for b in filedump) + else: + # Get the data from the file + try: + filedump = open(os.path.join(config["torrentfiles_location"], + filename, "rb")).read() + except IOError: + log.warning("Unable to open %s", filename) + return None - # Bdecode the filedata sent from the UI + # Bdecode the filedata torrent_filedump = lt.bdecode(filedump) handle = None @@ -144,29 +153,3 @@ class TorrentManager: except IOError: log.warning("Unable to save state file.") - - def get_info_template(self): - """Returns a list of strings that correspond to the info tuple""" - return [ - "name", - "total_size", - "num_pieces" - ] - - def get_status_template(self): - """Returns a list of strings that correspond to the status tuple""" - return [ - "state", - "paused", - "progress", - "next_announce", - "total_payload_download", - "total_payload_upload", - "download_payload_rate", - "upload_payload_rate", - "num_peers", - "num_seeds", - "total_wanted", - "eta", - "position" - ] diff --git a/deluge/ui/gtkui/functions.py b/deluge/ui/gtkui/functions.py index b11cb5c3e..91428e24d 100644 --- a/deluge/ui/gtkui/functions.py +++ b/deluge/ui/gtkui/functions.py @@ -33,6 +33,7 @@ import logging import os.path +import pickle try: import dbus, dbus.service @@ -127,20 +128,20 @@ def queue_bottom(torrent_ids): for torrent_id in torrent_ids: core.queue_bottom(torrent_id) -def get_torrent_status_dict(core, torrent_id): - """Builds and returns a status dictionary using the status template""" - status = core.get_torrent_status(torrent_id) - template = core.get_torrent_status_template() - status_dict = {} - for string in template: - status_dict[string] = status[template.index(string)] - return status_dict - -def get_torrent_info_dict(core, torrent_id): - """Builds and returns an info dictionary using the info template""" +def get_torrent_info(core, torrent_id): + """Builds the info dictionary and returns it""" info = core.get_torrent_info(torrent_id) - template = core.get_torrent_info_template() - info_dict = {} - for string in template: - info_dict[string] = info[template.index(string)] - return info_dict + # Join the array of bytes into a string for pickle to read + info = "".join(chr(b) for b in info) + # De-serialize the object + info = pickle.loads(info) + return info + +def get_torrent_status(core, torrent_id): + """Builds the status dictionary and returns it""" + status = core.get_torrent_status(torrent_id) + # Join the array of bytes into a string for pickle to read + status = "".join(chr(b) for b in status) + # De-serialize the object + status = pickle.loads(status) + return status diff --git a/deluge/ui/gtkui/torrentview.py b/deluge/ui/gtkui/torrentview.py index 7c8d8b002..985e1b921 100644 --- a/deluge/ui/gtkui/torrentview.py +++ b/deluge/ui/gtkui/torrentview.py @@ -157,10 +157,10 @@ class TorrentView: # This function is used for the foreach method of the treemodel def update_row(model, path, row, user_data): torrent_id = self.torrent_model.get_value(row, 0) - status = functions.get_torrent_status_dict(self.core, torrent_id) + status = functions.get_torrent_status(self.core, torrent_id) # Set values for each column in the row self.torrent_model.set_value(row, TORRENT_VIEW_COL_QUEUE, - status["position"]+1) + status["queue"]+1) self.torrent_model.set_value(row, TORRENT_VIEW_COL_PROGRESS, status["progress"]*100) self.torrent_model.set_value(row, TORRENT_VIEW_COL_STATUS, @@ -186,13 +186,13 @@ class TorrentView: def add_row(self, torrent_id): """Adds a new torrent row to the treeview""" # Get the status and info dictionaries - status = functions.get_torrent_status_dict(self.core, torrent_id) - info = functions.get_torrent_info_dict(self.core, torrent_id) + status = functions.get_torrent_status(self.core, torrent_id) + info = functions.get_torrent_info(self.core, torrent_id) # Insert the row with info provided from core - self.torrent_model.insert(status["position"], [ + self.torrent_model.insert(status["queue"], [ torrent_id, - status["position"]+1, + status["queue"]+1, None, info["name"], info["total_size"],