Thomas Piccirello
5 years ago
9 changed files with 979 additions and 118 deletions
@ -0,0 +1,176 @@ |
|||||||
|
/* |
||||||
|
* Bittorrent Client using Qt and libtorrent. |
||||||
|
* Copyright (C) 2019 Thomas Piccirello <thomas.piccirello@gmail.com> |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or |
||||||
|
* modify it under the terms of the GNU General Public License |
||||||
|
* as published by the Free Software Foundation; either version 2 |
||||||
|
* of the License, or (at your option) any later version. |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program; if not, write to the Free Software |
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
* |
||||||
|
* In addition, as a special exception, the copyright holders give permission to |
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with |
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library), |
||||||
|
* and distribute the linked executables. 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), 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. |
||||||
|
*/ |
||||||
|
|
||||||
|
'use strict'; |
||||||
|
|
||||||
|
const FilePriority = { |
||||||
|
"Ignored": 0, |
||||||
|
"Normal": 1, |
||||||
|
"High": 6, |
||||||
|
"Maximum": 7, |
||||||
|
"Mixed": -1 |
||||||
|
}; |
||||||
|
Object.freeze(FilePriority); |
||||||
|
|
||||||
|
const TriState = { |
||||||
|
"Unchecked": 0, |
||||||
|
"Checked": 1, |
||||||
|
"Partial": 2 |
||||||
|
}; |
||||||
|
Object.freeze(TriState); |
||||||
|
|
||||||
|
const FileTree = new Class({ |
||||||
|
root: null, |
||||||
|
nodeMap: {}, |
||||||
|
|
||||||
|
setRoot: function(root) { |
||||||
|
this.root = root; |
||||||
|
this.generateNodeMap(root); |
||||||
|
|
||||||
|
if (this.root.isFolder) |
||||||
|
this.root.calculateSize(); |
||||||
|
}, |
||||||
|
|
||||||
|
getRoot: function() { |
||||||
|
return this.root; |
||||||
|
}, |
||||||
|
|
||||||
|
generateNodeMap: function(node) { |
||||||
|
// don't store root node in map
|
||||||
|
if (node.root !== null) { |
||||||
|
this.nodeMap[node.rowId] = node; |
||||||
|
} |
||||||
|
|
||||||
|
node.children.each(function(child) { |
||||||
|
this.generateNodeMap(child); |
||||||
|
}.bind(this)); |
||||||
|
}, |
||||||
|
|
||||||
|
getNode: function(rowId) { |
||||||
|
return (this.nodeMap[rowId] === undefined) |
||||||
|
? null |
||||||
|
: this.nodeMap[rowId]; |
||||||
|
}, |
||||||
|
|
||||||
|
getRowId: function(node) { |
||||||
|
return node.rowId; |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the nodes in dfs order |
||||||
|
*/ |
||||||
|
toArray: function() { |
||||||
|
const nodes = []; |
||||||
|
this.root.children.each(function(node) { |
||||||
|
this._getArrayOfNodes(node, nodes); |
||||||
|
}.bind(this)); |
||||||
|
return nodes; |
||||||
|
}, |
||||||
|
|
||||||
|
_getArrayOfNodes: function(node, array) { |
||||||
|
array.push(node); |
||||||
|
node.children.each(function(child) { |
||||||
|
this._getArrayOfNodes(child, array); |
||||||
|
}.bind(this)); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
const FileNode = new Class({ |
||||||
|
name: "", |
||||||
|
rowId: null, |
||||||
|
size: 0, |
||||||
|
checked: TriState.Unchecked, |
||||||
|
remaining: 0, |
||||||
|
progress: 0, |
||||||
|
priority: FilePriority.Normal, |
||||||
|
availability: 0, |
||||||
|
depth: 0, |
||||||
|
root: null, |
||||||
|
data: null, |
||||||
|
isFolder: false, |
||||||
|
children: [], |
||||||
|
}); |
||||||
|
|
||||||
|
const FolderNode = new Class({ |
||||||
|
Extends: FileNode, |
||||||
|
|
||||||
|
initialize: function() { |
||||||
|
this.isFolder = true; |
||||||
|
}, |
||||||
|
|
||||||
|
addChild(node) { |
||||||
|
this.children.push(node); |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* Recursively calculate size of node and its children |
||||||
|
*/ |
||||||
|
calculateSize: function() { |
||||||
|
let size = 0; |
||||||
|
let remaining = 0; |
||||||
|
let progress = 0; |
||||||
|
let availability = 0; |
||||||
|
let checked = TriState.Unchecked; |
||||||
|
let priority = FilePriority.Normal; |
||||||
|
|
||||||
|
let isFirstFile = true; |
||||||
|
|
||||||
|
this.children.each(function(node) { |
||||||
|
if (node.isFolder) |
||||||
|
node.calculateSize(); |
||||||
|
|
||||||
|
size += node.size; |
||||||
|
|
||||||
|
if (isFirstFile) { |
||||||
|
priority = node.priority; |
||||||
|
checked = node.checked; |
||||||
|
isFirstFile = false; |
||||||
|
} |
||||||
|
else { |
||||||
|
if (priority !== node.priority) |
||||||
|
priority = FilePriority.Mixed; |
||||||
|
if (checked !== node.checked) |
||||||
|
checked = TriState.Partial; |
||||||
|
} |
||||||
|
|
||||||
|
const isIgnored = (node.priority === FilePriority.Ignored); |
||||||
|
if (!isIgnored) { |
||||||
|
remaining += node.remaining; |
||||||
|
progress += (node.progress * node.size); |
||||||
|
availability += (node.availability * node.size); |
||||||
|
} |
||||||
|
}.bind(this)); |
||||||
|
|
||||||
|
this.size = size; |
||||||
|
this.remaining = remaining; |
||||||
|
this.checked = checked; |
||||||
|
this.progress = (progress / size); |
||||||
|
this.priority = priority; |
||||||
|
this.availability = (availability / size); |
||||||
|
} |
||||||
|
}); |
@ -0,0 +1,61 @@ |
|||||||
|
/* |
||||||
|
* Bittorrent Client using Qt and libtorrent. |
||||||
|
* Copyright (C) 2019 Thomas Piccirello <thomas.piccirello@gmail.com> |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or |
||||||
|
* modify it under the terms of the GNU General Public License |
||||||
|
* as published by the Free Software Foundation; either version 2 |
||||||
|
* of the License, or (at your option) any later version. |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program; if not, write to the Free Software |
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
* |
||||||
|
* In addition, as a special exception, the copyright holders give permission to |
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with |
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library), |
||||||
|
* and distribute the linked executables. 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), 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. |
||||||
|
*/ |
||||||
|
|
||||||
|
'use strict'; |
||||||
|
|
||||||
|
// This file is the JavaScript implementation of base/utils/fs.cpp
|
||||||
|
|
||||||
|
const QB_EXT = '.!qB'; |
||||||
|
const PathSeparator = '/'; |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the file extension part of a file name. |
||||||
|
*/ |
||||||
|
function fileExtension(filename) { |
||||||
|
const name = filename.endsWith(QB_EXT) |
||||||
|
? filename.substring(0, filename.length - QB_EXT.length) |
||||||
|
: filename; |
||||||
|
const pointIndex = name.lastIndexOf('.'); |
||||||
|
if (pointIndex === -1) |
||||||
|
return ''; |
||||||
|
return name.substring(pointIndex + 1); |
||||||
|
} |
||||||
|
|
||||||
|
function fileName(filepath) { |
||||||
|
const slashIndex = filepath.lastIndexOf(PathSeparator); |
||||||
|
if (slashIndex === -1) |
||||||
|
return filepath; |
||||||
|
return filepath.substring(slashIndex + 1); |
||||||
|
} |
||||||
|
|
||||||
|
function folderName(filepath) { |
||||||
|
const slashIndex = filepath.lastIndexOf(PathSeparator); |
||||||
|
if (slashIndex === -1) |
||||||
|
return filepath; |
||||||
|
return filepath.substring(0, slashIndex); |
||||||
|
} |
Loading…
Reference in new issue