use FileTree2 in the TorrentInfo class when specified

adjust the filetree walking functions to match the server side code
This commit is contained in:
Damien Churchill 2010-03-31 14:20:49 +01:00
parent 14d9f6b7ba
commit 7053163f88
3 changed files with 42 additions and 26 deletions

View File

@ -80,7 +80,7 @@ class TorrentInfo(object):
:type filename: string
"""
def __init__(self, filename):
def __init__(self, filename, filetree=1):
# Get the torrent data from the torrent file
try:
log.debug("Attempting to open %s.", filename)
@ -108,6 +108,7 @@ class TorrentInfo(object):
# Get list of files from torrent info
paths = {}
dirs = {}
if self.__m_metadata["info"].has_key("files"):
prefix = ""
if len(self.__m_metadata["info"]["files"]) > 1:
@ -121,18 +122,38 @@ class TorrentInfo(object):
f["index"] = index
paths[path] = f
def walk(path, item):
if type(item) is dict:
return item
return [paths[path]['index'], paths[path]['length'], True]
dirname = os.path.dirname(path)
while dirname:
dirinfo = dirs.setdefault(dirname, {})
dirinfo["length"] = dirinfo.get("length", 0) + f["length"]
dirname = os.path.dirname(dirname)
file_tree = FileTree(paths)
file_tree.walk(walk)
if filetree == 2:
def walk(path, item):
if item["type"] == "dir":
item.update(dirs[path])
else:
item.update(paths[path])
item["download"] = True
file_tree = FileTree2(paths.keys())
file_tree.walk(walk)
else:
def walk(path, item):
if type(item) is dict:
return item
return [paths[path]["index"], paths[path]["length"], True]
file_tree = FileTree(paths)
file_tree.walk(walk)
self.__m_files_tree = file_tree.get_tree()
else:
self.__m_files_tree = {
self.__m_name: (0, self.__m_metadata["info"]["length"], True)
}
if filetree == 2:
pass
else:
self.__m_files_tree = {
self.__m_name: (0, self.__m_metadata["info"]["length"], True)
}
self.__m_files = []
if self.__m_metadata["info"].has_key("files"):

View File

@ -65,10 +65,6 @@ Deluge.add.OptionsPanel = Ext.extend(Ext.TabPanel, {
}]
}));
new Ext.tree.TreeSorter(this.files, {
folderSort: true
});
this.optionsManager = new Deluge.MultiOptionsManager();
this.form = this.add({
@ -200,7 +196,7 @@ Deluge.add.OptionsPanel = Ext.extend(Ext.TabPanel, {
var fileIndexes = {};
this.walkFileTree(torrent['files_tree'], function(filename, type, entry, parent) {
if (type != 'file') return;
fileIndexes[entry[0]] = entry[2];
fileIndexes[entry.index] = entry.download;
}, this);
var priorities = [];
@ -279,9 +275,9 @@ Deluge.add.OptionsPanel = Ext.extend(Ext.TabPanel, {
this.walkFileTree(this.torrents[torrentId]['files_tree'], function(filename, type, entry, parentNode) {
if (type == 'dir') {
alert(Ext.encode(entry));
var folder = new Ext.tree.TreeNode({
filename: filename,
size: entry.length,
checked: true
});
folder.on('checkchange', this.onFolderCheck, this);
@ -290,12 +286,10 @@ Deluge.add.OptionsPanel = Ext.extend(Ext.TabPanel, {
} else {
var node = new Ext.tree.TreeNode({
filename: filename,
fileindex: entry[0],
text: filename, // this needs to be here for sorting reasons
size: entry[1],
fileindex: entry.index,
size: entry.length,
leaf: true,
checked: priorities[entry[0]],
iconCls: 'x-deluge-file',
checked: priorities[entry.index],
uiProvider: Ext.tree.ColumnNodeUI
});
node.on('checkchange', this.onNodeCheck, this);
@ -306,9 +300,9 @@ Deluge.add.OptionsPanel = Ext.extend(Ext.TabPanel, {
},
walkFileTree: function(files, callback, scope, parentNode) {
for (var filename in files) {
var entry = files[filename];
var type = (Ext.type(entry) == 'object') ? 'dir' : 'file';
for (var filename in files.contents) {
var entry = files.contents[filename];
var type = entry.type;
if (scope) {
var ret = callback.apply(scope, [filename, type, entry, parentNode]);

View File

@ -652,9 +652,10 @@ class WebApi(JSONComponent):
:rtype: dictionary
"""
try:
torrent_info = uicommon.TorrentInfo(filename.strip())
torrent_info = uicommon.TorrentInfo(filename.strip(), 2)
return torrent_info.as_dict("name", "info_hash", "files_tree")
except:
except Exception, e:
log.exception(e)
return False
@export