More queue fixes. Now store torrent_info instance in the queue instead of

unique_id as there is no sense to store unique_ids in the persistent queue
while uqique_ids is changed on each restart. In the core self.state.torrents
now a dict with torrent_info -> unique_id. Needs testing.
This commit is contained in:
Alex Dedul 2007-08-13 20:33:08 +00:00
parent 72fa2a44a5
commit 6207033b36
2 changed files with 56 additions and 38 deletions

View File

@ -173,8 +173,8 @@ class torrent_info:
class persistent_state:
def __init__(self):
# Torrents
self.torrents = []
# Torrents is a torrent_info instance -> unique_ID dict
self.torrents = {}
# Prepare queue (queue is pickled, just like everything else)
# queue[x] is the unique_ID of the x-th queue position. Simple.
@ -258,6 +258,11 @@ class Manager:
'rb')
self.state = pickle.load(pkl_file)
pkl_file.close()
if isinstance(self.state.torrents, list):
# One time convert of old torrents list to dict
self.state.torrents = dict((x, None) for x in
self.state.torrents)
# Sync with the core: tell core about torrents, and get
# unique_IDs
@ -384,7 +389,7 @@ class Manager:
# Create torrent object
new_torrent = torrent_info(full_new_name, save_dir, compact)
self.state.torrents.append(new_torrent)
self.state.torrents[new_torrent] = None
return self.sync()
@ -425,7 +430,7 @@ class Manager:
# This is the EXTERNAL function, for the GUI. It returns the core_state + supp_state
def get_torrent_state(self, unique_ID):
# Check to see if unique_ID exists:
if unique_ID not in self.state.queue:
if unique_ID not in self.unique_IDs:
raise InvalidUniqueIDError(_("Asked for a torrent that doesn't exist"))
ret = self.get_core_torrent_state(unique_ID).copy()
@ -434,7 +439,8 @@ class Manager:
ret.update(self.get_supp_torrent_state(unique_ID))
# Get queue position
ret['queue_pos'] = self.state.queue.index(unique_ID) + 1
torrent = self.unique_IDs[unique_ID]
ret['queue_pos'] = self.state.queue.index(torrent) + 1
return ret
@ -450,38 +456,45 @@ class Manager:
def get_all_piece_info(self, unique_ID):
return deluge_core.get_all_piece_info(unique_ID)
def get_torrent_unique_id(self, torrent):
return self.state.torrents[torrent]
# Queueing functions
def queue_top(self, unique_ID):
torrent = self.unique_IDs[unique_ID]
self.state.queue.insert(0,
self.state.queue.pop(self.get_queue_index(unique_ID)))
self.state.queue.pop(self.get_queue_index(torrent)))
self.apply_queue()
self.pickle_state()
def queue_up(self, unique_ID):
curr_index = self.get_queue_index(unique_ID)
torrent = self.unique_IDs[unique_ID]
curr_index = self.get_queue_index(torrent)
if curr_index > 0:
temp = self.state.queue[curr_index - 1]
self.state.queue[curr_index - 1] = unique_ID
self.state.queue[curr_index - 1] = torrent
self.state.queue[curr_index] = temp
self.apply_queue()
self.pickle_state()
def queue_down(self, unique_ID):
curr_index = self.get_queue_index(unique_ID)
torrent = self.unique_IDs[unique_ID]
curr_index = self.get_queue_index(torrent)
if curr_index < (len(self.state.queue) - 1):
temp = self.state.queue[curr_index + 1]
self.state.queue[curr_index + 1] = unique_ID
self.state.queue[curr_index + 1] = torrent
self.state.queue[curr_index] = temp
self.apply_queue()
self.pickle_state()
def queue_bottom(self, unique_ID, enforce_queue=True):
curr_index = self.get_queue_index(unique_ID)
torrent = self.unique_IDs[unique_ID]
curr_index = self.get_queue_index(torrent)
if curr_index < (len(self.state.queue) - 1):
self.state.queue.remove(unique_ID)
self.state.queue.append(unique_ID)
self.state.queue.remove(torrent)
self.state.queue.append(torrent)
if enforce_queue:
self.apply_queue()
self.pickle_state()
@ -507,7 +520,8 @@ class Manager:
active_torrent_cnt = 0
# Pause and resume torrents
for unique_ID in self.state.queue:
for torrent in self.state.queue:
unique_ID = self.state.torrents[torrent]
# Get not cached torrent state so we don't pause/resume torrents
# more than 1 time - if cached torrent_state['is_paused'] can be
# still paused after we already paused it.
@ -559,7 +573,7 @@ class Manager:
self.set_user_pause(unique_ID, True, enforce_queue=False)
if self.get_pref('clear_max_ratio_torrents'):
for unique_ID in self.state.queue:
for unique_ID in self.unique_IDs:
torrent_state = self.get_core_torrent_state(unique_ID)
if torrent_state['is_seed']:
ratio = self.calc_ratio(unique_ID, torrent_state)
@ -740,13 +754,13 @@ class Manager:
self.apply_prefs_per_torrent(unique_ID)
def pause_all(self):
for unique_ID in self.state.queue:
for unique_ID in self.unique_IDs:
torrent_state = self.get_core_torrent_state(unique_ID)
if not torrent_state['is_paused']:
self.set_user_pause(unique_ID, True, enforce_queue=False)
def resume_all(self):
for unique_ID in self.state.queue:
for unique_ID in self.unique_IDs:
torrent_state = self.get_core_torrent_state(unique_ID)
if torrent_state['is_paused']:
self.set_user_pause(unique_ID, False, enforce_queue=True)
@ -802,7 +816,7 @@ class Manager:
# Create torrent object
new_torrent = torrent_info(full_new_name, save_dir, compact)
self.state.torrents.append(new_torrent)
self.state.torrents[new_torrent] = None
def remove_torrent_ns(self, unique_ID):
self.unique_IDs[unique_ID].delete_me = True
@ -825,7 +839,7 @@ class Manager:
for torrent in self.state.torrents:
if not os.path.exists(torrent.filename):
print "Missing file: %s" % torrent.filename
self.state.torrents.remove(torrent)
del self.state.torrents[torrent]
continue
if torrent not in self.unique_IDs.values():
# print "Adding torrent to core:", torrent.filename, torrent.save_dir, torrent.compact
@ -837,12 +851,13 @@ class Manager:
self.apply_prefs_per_torrent(unique_ID)
except DelugeError, e:
print "Error:", e
self.state.torrents.remove(torrent)
del self.state.torrents[torrent]
raise e
# print "Got unique ID:", unique_ID
ret = unique_ID
self.unique_IDs[unique_ID] = torrent
self.state.torrents[torrent] = unique_ID
# Remove torrents from core, unique_IDs and queue
to_delete = []
@ -853,8 +868,8 @@ class Manager:
to_delete.append(unique_ID)
for unique_ID in to_delete:
self.state.torrents.remove(self.unique_IDs[unique_ID])
self.state.queue.remove(unique_ID)
del self.state.torrents[self.unique_IDs[unique_ID]]
self.state.queue.remove(self.unique_IDs[unique_ID])
# Remove .fastresume
try:
# Must be after removal of the torrent, because that saves a new .fastresume
@ -864,28 +879,30 @@ class Manager:
del self.unique_IDs[unique_ID]
# Add torrents to queue - at the end, of course
for unique_ID in self.unique_IDs.keys():
if unique_ID not in self.state.queue:
for torrent in self.unique_IDs.values():
if torrent not in self.state.queue:
if self.get_pref('queue_above_completed') and \
len(self.state.queue) > 0 and not called_on_start:
for index in xrange(len(self.state.queue)):
torrent_state = self.get_core_torrent_state(
self.state.queue[index])
for index, torrent_tmp in enumerate(self.state.queue):
unique_ID = self.state.torrents[torrent_tmp]
torrent_state = self.get_core_torrent_state(unique_ID)
if torrent_state['progress'] == 1.0:
break
if torrent_state['progress'] == 1.0:
self.state.queue.insert(index, unique_ID)
self.state.queue.insert(index, torrent)
else:
self.state.queue.append(unique_ID)
self.state.queue.append(torrent)
else:
self.state.queue.append(unique_ID)
self.state.queue.append(torrent)
# run through queue, remove those that no longer exists
to_delete = []
for queue_item in self.state.queue:
if queue_item not in self.unique_IDs.keys():
to_delete.append(queue_item)
for del_item in to_delete:
self.state.queue.remove(del_item)
for torrent in self.state.queue:
if torrent not in self.state.torrents:
to_delete.append(torrent)
for torrent in to_delete:
self.state.queue.remove(torrent)
assert(len(self.unique_IDs) == len(self.state.torrents))
@ -899,8 +916,8 @@ class Manager:
return ret
def get_queue_index(self, unique_ID):
return self.state.queue.index(unique_ID)
def get_queue_index(self, torrent):
return self.state.queue.index(torrent)
def apply_prefs(self):
print "Applying preferences"

View File

@ -822,7 +822,8 @@ class DelugeGTK:
self.window.show()
## add torrents in manager's queue to interface
for unique_id in self.manager.get_queue():
for torrent in self.manager.get_queue():
unique_id = self.manager.get_torrent_unique_id(torrent)
self.torrent_model_append(unique_id)
for torrent_file in cmd_line_torrents: