Compare commits
6 Commits
muwire-0.2
...
muwire-0.2
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8d808f0b8f | ||
![]() |
7833a83c87 | ||
![]() |
3160c1a8f3 | ||
![]() |
e295aa67d5 | ||
![]() |
a9f5625dc3 | ||
![]() |
cc0af5b9ed |
@@ -34,7 +34,7 @@ class Cli {
|
||||
|
||||
Core core
|
||||
try {
|
||||
core = new Core(props, home, "0.2.1")
|
||||
core = new Core(props, home, "0.2.2")
|
||||
} catch (Exception bad) {
|
||||
bad.printStackTrace(System.out)
|
||||
println "Failed to initialize core, exiting"
|
||||
|
@@ -53,7 +53,7 @@ class CliDownloader {
|
||||
|
||||
Core core
|
||||
try {
|
||||
core = new Core(props, home, "0.2.1")
|
||||
core = new Core(props, home, "0.2.2")
|
||||
} catch (Exception bad) {
|
||||
bad.printStackTrace(System.out)
|
||||
println "Failed to initialize core, exiting"
|
||||
|
@@ -268,7 +268,7 @@ public class Core {
|
||||
}
|
||||
}
|
||||
|
||||
Core core = new Core(props, home, "0.2.1")
|
||||
Core core = new Core(props, home, "0.2.2")
|
||||
core.startServices()
|
||||
|
||||
// ... at the end, sleep or execute script
|
||||
|
@@ -1,6 +1,7 @@
|
||||
package com.muwire.core.connection
|
||||
|
||||
import java.util.concurrent.atomic.AtomicBoolean
|
||||
import java.util.logging.Level
|
||||
|
||||
import groovy.util.logging.Log
|
||||
import net.i2p.data.Destination
|
||||
@@ -24,7 +25,7 @@ class Endpoint implements Closeable {
|
||||
@Override
|
||||
public void close() {
|
||||
if (!closed.compareAndSet(false, true)) {
|
||||
log.warning("Close loop detected for ${destination.toBase32()}", new Exception())
|
||||
log.log(Level.WARNING,"Close loop detected for ${destination.toBase32()}", new Exception())
|
||||
return
|
||||
}
|
||||
if (inputStream != null) {
|
||||
|
@@ -51,4 +51,23 @@ class ContentUploader extends Uploader {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return file.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized int getProgress() {
|
||||
if (mapped == null)
|
||||
return 0
|
||||
int position = mapped.position()
|
||||
int total = request.getRange().end - request.getRange().start
|
||||
(int)(position * 100.0 / total)
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDownloader() {
|
||||
request.downloader.getHumanReadableName()
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -6,6 +6,8 @@ import java.nio.charset.StandardCharsets
|
||||
import com.muwire.core.InfoHash
|
||||
import com.muwire.core.connection.Endpoint
|
||||
|
||||
import net.i2p.data.Base64
|
||||
|
||||
class HashListUploader extends Uploader {
|
||||
private final InfoHash infoHash
|
||||
private final HashListRequest request
|
||||
@@ -14,6 +16,7 @@ class HashListUploader extends Uploader {
|
||||
super(endpoint)
|
||||
this.infoHash = infoHash
|
||||
mapped = ByteBuffer.wrap(infoHash.getHashList())
|
||||
this.request = request
|
||||
}
|
||||
|
||||
void respond() {
|
||||
@@ -32,4 +35,21 @@ class HashListUploader extends Uploader {
|
||||
}
|
||||
endpoint.getOutputStream().flush()
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Hash list for " + Base64.encode(infoHash.getRoot());
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized int getProgress() {
|
||||
(int)(mapped.position() * 100.0 / mapped.capacity())
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDownloader() {
|
||||
request.downloader.getHumanReadableName()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@@ -23,4 +23,13 @@ abstract class Uploader {
|
||||
return -1
|
||||
mapped.position()
|
||||
}
|
||||
|
||||
abstract String getName();
|
||||
|
||||
/**
|
||||
* @return an integer between 0 and 100
|
||||
*/
|
||||
abstract int getProgress();
|
||||
|
||||
abstract String getDownloader();
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
group = com.muwire
|
||||
version = 0.2.1
|
||||
version = 0.2.2
|
||||
groovyVersion = 2.4.15
|
||||
slf4jVersion = 1.7.25
|
||||
spockVersion = 1.1-groovy-2.4
|
||||
|
@@ -62,7 +62,7 @@ class MainFrameController {
|
||||
|
||||
def searchEvent
|
||||
if (hashSearch) {
|
||||
searchEvent = new SearchEvent(searchHash : root, uuid : uuid)
|
||||
searchEvent = new SearchEvent(searchHash : root, uuid : uuid, oobInfohash: true)
|
||||
} else {
|
||||
// this can be improved a lot
|
||||
def replaced = search.toLowerCase().trim().replaceAll(Constants.SPLIT_PATTERN, " ")
|
||||
|
@@ -160,16 +160,13 @@ class MainFrameView {
|
||||
scrollPane (constraints : BorderLayout.CENTER) {
|
||||
table(id : "uploads-table") {
|
||||
tableModel(list : model.uploads) {
|
||||
closureColumn(header : "Name", type : String, read : {row -> row.file.getName() })
|
||||
closureColumn(header : "Name", type : String, read : {row -> row.getName() })
|
||||
closureColumn(header : "Progress", type : String, read : { row ->
|
||||
int position = row.getPosition()
|
||||
def range = row.request.getRange()
|
||||
int total = range.end - range.start
|
||||
int percent = (int)((position * 100.0) / total)
|
||||
int percent = row.getProgress()
|
||||
"$percent%"
|
||||
})
|
||||
closureColumn(header : "Downloader", type : String, read : { row ->
|
||||
row.request.downloader?.getHumanReadableName()
|
||||
row.getDownloader()
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -306,6 +303,19 @@ class MainFrameView {
|
||||
downloadsTable.rowSorter.addRowSorterListener({evt -> lastDownloadSortEvent = evt})
|
||||
downloadsTable.rowSorter.setSortsOnUpdates(true)
|
||||
|
||||
downloadsTable.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent e) {
|
||||
if (e.isPopupTrigger())
|
||||
showDownloadsMenu(e)
|
||||
}
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) {
|
||||
if (e.isPopupTrigger())
|
||||
showDownloadsMenu(e)
|
||||
}
|
||||
})
|
||||
|
||||
// shared files table
|
||||
def sharedFilesTable = builder.getVariable("shared-files-table")
|
||||
sharedFilesTable.columnModel.getColumn(1).setCellRenderer(new SizeRenderer())
|
||||
@@ -353,7 +363,7 @@ class MainFrameView {
|
||||
|
||||
}
|
||||
|
||||
def showPopupMenu(JPopupMenu menu, MouseEvent event) {
|
||||
private static void showPopupMenu(JPopupMenu menu, MouseEvent event) {
|
||||
menu.show(event.getComponent(), event.getX(), event.getY())
|
||||
}
|
||||
|
||||
@@ -386,6 +396,54 @@ class MainFrameView {
|
||||
selected
|
||||
}
|
||||
|
||||
def showDownloadsMenu(MouseEvent e) {
|
||||
int selected = selectedDownloaderRow()
|
||||
if (selected < 0)
|
||||
return
|
||||
boolean cancelEnabled = false
|
||||
boolean retryEnabled = false
|
||||
Downloader downloader = model.downloads[selected].downloader
|
||||
switch(downloader.currentState) {
|
||||
case Downloader.DownloadState.DOWNLOADING:
|
||||
case Downloader.DownloadState.HASHLIST:
|
||||
case Downloader.DownloadState.CONNECTING:
|
||||
cancelEnabled = true
|
||||
retryEnabled = false
|
||||
break
|
||||
case Downloader.DownloadState.FAILED:
|
||||
cancelEnabled = true
|
||||
retryEnabled = true
|
||||
break
|
||||
default :
|
||||
cancelEnabled = false
|
||||
retryEnabled = false
|
||||
}
|
||||
|
||||
JPopupMenu menu = new JPopupMenu()
|
||||
JMenuItem copyHashToClipboard = new JMenuItem("Copy hash to clipboard")
|
||||
copyHashToClipboard.addActionListener({
|
||||
String hash = Base64.encode(downloader.infoHash.getRoot())
|
||||
StringSelection selection = new StringSelection(hash)
|
||||
def clipboard = Toolkit.getDefaultToolkit().getSystemClipboard()
|
||||
clipboard.setContents(selection, null)
|
||||
})
|
||||
menu.add(copyHashToClipboard)
|
||||
|
||||
if (cancelEnabled) {
|
||||
JMenuItem cancel = new JMenuItem("Cancel")
|
||||
cancel.addActionListener({mvcGroup.controller.cancel()})
|
||||
menu.add(cancel)
|
||||
}
|
||||
|
||||
if (retryEnabled) {
|
||||
JMenuItem retry = new JMenuItem("Retry")
|
||||
retry.addActionListener({mvcGroup.controller.resume()})
|
||||
menu.add(retry)
|
||||
}
|
||||
|
||||
showPopupMenu(menu, e)
|
||||
}
|
||||
|
||||
def showSearchWindow = {
|
||||
def cardsPanel = builder.getVariable("cards-panel")
|
||||
cardsPanel.getLayout().show(cardsPanel, "search window")
|
||||
|
Reference in New Issue
Block a user