Compare commits

...

3 Commits

Author SHA1 Message Date
Zlatin Balevsky
761bf0a177 Release 0.6.2 2019-11-10 18:31:30 +00:00
Zlatin Balevsky
bd873211c0 wip on file preview 2019-11-10 14:50:19 +00:00
Zlatin Balevsky
036971cfe5 wip on file preview 2019-11-10 13:59:01 +00:00
13 changed files with 197 additions and 3 deletions

View File

@@ -32,7 +32,7 @@ import com.muwire.core.UILoadedEvent
import com.muwire.core.files.AllFilesLoadedEvent
class CliLanterna {
private static final String MW_VERSION = "0.6.1"
private static final String MW_VERSION = "0.6.2"
private static volatile Core core

View File

@@ -406,7 +406,7 @@ public class Core {
}
}
Core core = new Core(props, home, "0.6.1")
Core core = new Core(props, home, "0.6.2")
core.startServices()
// ... at the end, sleep or execute script

View File

@@ -276,6 +276,57 @@ public class Downloader {
activeWorkers.put(d, newWorker)
executorService.submit(newWorker)
}
boolean isSequential() {
pieces.ratio == 0f
}
File generatePreview() {
int lastCompletePiece = pieces.firstIncomplete() - 1
if (lastCompletePiece == -1)
return null
if (lastCompletePiece < -1)
return file
long previewableLength = (lastCompletePiece + 1) * ((long)pieceSize)
// generate name
long now = System.currentTimeMillis()
File previewFile
File parentFile = file.getParentFile()
int lastDot = file.getName().lastIndexOf('.')
if (lastDot < 0)
previewFile = new File(parentFile, file.getName() + "." + String.valueOf(now) + ".mwpreview")
else {
String name = file.getName().substring(0, lastDot)
String extension = file.getName().substring(lastDot + 1)
String previewName = name + "." + String.valueOf(now) + ".mwpreview."+extension
previewFile = new File(parentFile, previewName)
}
// copy
InputStream is = null
OutputStream os = null
try {
is = new BufferedInputStream(new FileInputStream(incompleteFile))
os = new BufferedOutputStream(new FileOutputStream(previewFile))
byte [] tmp = new byte[0x1 << 13]
long totalCopied = 0
while(totalCopied < previewableLength) {
int read = is.read(tmp, 0, (int)Math.min(tmp.length, previewableLength - totalCopied))
if (read < 0)
throw new IOException("EOF?")
os.write(tmp, 0, read)
totalCopied += read
}
return previewFile
} catch (IOException bad) {
log.log(Level.WARNING,"Preview failed",bad)
return null
} finally {
try {is?.close() } catch (IOException ignore) {}
try {os?.close() } catch (IOException ignore) {}
}
}
class DownloadWorker implements Runnable {
private final Destination destination

View File

@@ -108,6 +108,10 @@ class Pieces {
partials.clear()
}
synchronized int firstIncomplete() {
done.nextClearBit(0)
}
synchronized void write(PrintWriter writer) {
for (int i = done.nextSetBit(0); i >= 0; i = done.nextSetBit(i+1)) {
writer.println(i)

View File

@@ -1,5 +1,5 @@
group = com.muwire
version = 0.6.1
version = 0.6.2
i2pVersion = 0.9.43
groovyVersion = 2.4.15
slf4jVersion = 1.7.25

View File

@@ -106,4 +106,9 @@ mvcGroups {
view = 'com.muwire.gui.SharedFileView'
controller = 'com.muwire.gui.SharedFileController'
}
'download-preview' {
model = "com.muwire.gui.DownloadPreviewModel"
view = "com.muwire.gui.DownloadPreviewView"
controller = "com.muwire.gui.DownloadPreviewController"
}
}

View File

@@ -0,0 +1,13 @@
package com.muwire.gui
import griffon.core.artifact.GriffonController
import griffon.core.controller.ControllerAction
import griffon.inject.MVCMember
import griffon.metadata.ArtifactProviderFor
import javax.annotation.Nonnull
@ArtifactProviderFor(GriffonController)
class DownloadPreviewController {
@MVCMember @Nonnull
DownloadPreviewModel model
}

View File

@@ -204,6 +204,14 @@ class MainFrameController {
downloader.pause()
core.eventBus.publish(new UIDownloadPausedEvent())
}
@ControllerAction
void preview() {
def downloader = model.downloads[selectedDownload()].downloader
def params = [:]
params['downloader'] = downloader
mvcGroup.createMVCGroup("download-preview", params)
}
@ControllerAction
void clear() {

View File

@@ -0,0 +1,12 @@
package com.muwire.gui
import com.muwire.core.download.Downloader
import griffon.core.artifact.GriffonModel
import griffon.transform.Observable
import griffon.metadata.ArtifactProviderFor
@ArtifactProviderFor(GriffonModel)
class DownloadPreviewModel {
Downloader downloader
}

View File

@@ -100,6 +100,7 @@ class MainFrameModel {
@Observable boolean retryButtonEnabled
@Observable boolean pauseButtonEnabled
@Observable boolean clearButtonEnabled
@Observable boolean previewButtonEnabled
@Observable String resumeButtonText
@Observable boolean addCommentButtonEnabled
@Observable boolean subscribeButtonEnabled

View File

@@ -0,0 +1,61 @@
package com.muwire.gui
import griffon.core.artifact.GriffonView
import griffon.inject.MVCMember
import griffon.metadata.ArtifactProviderFor
import javax.swing.Box
import javax.swing.JDialog
import javax.swing.JOptionPane
import javax.swing.SwingConstants
import java.awt.event.WindowAdapter
import java.awt.event.WindowEvent
import javax.annotation.Nonnull
@ArtifactProviderFor(GriffonView)
class DownloadPreviewView {
@MVCMember @Nonnull
FactoryBuilderSupport builder
@MVCMember @Nonnull
DownloadPreviewModel model
def mainFrame
def dialog
def panel
void initUI() {
mainFrame = application.windowManager.findWindow("main-frame")
dialog = new JDialog(mainFrame, "Generating Preview", true)
panel = builder.panel {
vbox {
label(text : "Generating preview for "+model.downloader.file.getName())
Box.createVerticalGlue()
progressBar(indeterminate : true)
}
}
dialog.getContentPane().add(panel)
dialog.pack()
dialog.setResizable(false)
dialog.setLocationRelativeTo(mainFrame)
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE)
dialog.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e) {
mainFrame.setVisible(false)
mvcGroup.destroy()
}
})
}
void mvcGroupInit(Map<String, String> args) {
if (!model.downloader.isSequential())
JOptionPane.showMessageDialog(mainFrame, "This download is not sequential, there may not be much to preview")
DownloadPreviewer previewer = new DownloadPreviewer(model.downloader, this)
previewer.execute()
dialog.show()
}
}

View File

@@ -216,6 +216,7 @@ class MainFrameView {
button(text: "Pause", enabled : bind {model.pauseButtonEnabled}, pauseAction)
button(text: bind { model.resumeButtonText }, enabled : bind {model.retryButtonEnabled}, resumeAction)
button(text: "Cancel", enabled : bind {model.cancelButtonEnabled }, cancelAction)
button(text: "Preview", enabled : bind {model.previewButtonEnabled}, previewAction)
button(text: "Clear Done", enabled : bind {model.clearButtonEnabled}, clearAction)
}
}
@@ -536,6 +537,7 @@ class MainFrameView {
model.cancelButtonEnabled = false
model.retryButtonEnabled = false
model.pauseButtonEnabled = false
model.previewButtonEnabled = false
model.downloader = null
downloadDetailsPanel.getLayout().show(downloadDetailsPanel,"select-download")
return
@@ -544,6 +546,7 @@ class MainFrameView {
if (downloader == null)
return
model.downloader = downloader
model.previewButtonEnabled = true
downloadDetailsPanel.getLayout().show(downloadDetailsPanel,"download-selected")
switch(downloader.getCurrentState()) {
case Downloader.DownloadState.CONNECTING :

View File

@@ -0,0 +1,36 @@
package com.muwire.gui
import java.awt.Desktop
import javax.swing.JDialog
import javax.swing.JOptionPane
import javax.swing.SwingWorker
import com.muwire.core.download.Downloader
class DownloadPreviewer extends SwingWorker {
private final Downloader downloader
private final DownloadPreviewView view
DownloadPreviewer(Downloader downloader, DownloadPreviewView view) {
this.downloader = downloader
this.view = view
}
@Override
protected Object doInBackground() throws Exception {
downloader.generatePreview()
}
@Override
public void done() {
File previewFile = get()
view.dialog.setVisible(false)
view.mvcGroup.destroy()
if (previewFile == null)
JOptionPane.showMessageDialog(null, "Generating preview file failed", "Preview Failed", JOptionPane.ERROR_MESSAGE)
else
Desktop.getDesktop().open(previewFile)
}
}