mirror of
https://github.com/Xpl0itU/WiiUDownloader.git
synced 2025-05-19 01:35:23 -04:00
Improve cancellation
This commit is contained in:
parent
624c96b7e8
commit
f927c43c1b
3 changed files with 15 additions and 9 deletions
|
@ -121,6 +121,7 @@ func createProgressWindow(parent *gtk.ApplicationWindow) (*ProgressWindow, error
|
||||||
win.SetTitle("WiiUDownloader - Downloading")
|
win.SetTitle("WiiUDownloader - Downloading")
|
||||||
|
|
||||||
win.SetTransientFor(parent)
|
win.SetTransientFor(parent)
|
||||||
|
win.SetDeletable(false)
|
||||||
|
|
||||||
box, err := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
|
box, err := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -50,7 +50,7 @@ func downloadFile(ctx context.Context, progressReporter ProgressReporter, client
|
||||||
updateProgress := func(downloaded *int64) {
|
updateProgress := func(downloaded *int64) {
|
||||||
for range ticker.C {
|
for range ticker.C {
|
||||||
if progressReporter.Cancelled() {
|
if progressReporter.Cancelled() {
|
||||||
break
|
return
|
||||||
}
|
}
|
||||||
progressReporter.UpdateDownloadProgress(*downloaded, calculateDownloadSpeed(*downloaded, startTime, time.Now()), filePath)
|
progressReporter.UpdateDownloadProgress(*downloaded, calculateDownloadSpeed(*downloaded, startTime, time.Now()), filePath)
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ func downloadFile(ctx context.Context, progressReporter ProgressReporter, client
|
||||||
|
|
||||||
go updateProgress(&downloaded)
|
go updateProgress(&downloaded)
|
||||||
|
|
||||||
customBufferedWriter, err := NewFileWriterWithProgress(file, &downloaded)
|
customBufferedWriter, err := NewFileWriterWithProgress(file, &downloaded, progressReporter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
resp.CloseBodyStream()
|
resp.CloseBodyStream()
|
||||||
file.Close()
|
file.Close()
|
||||||
|
|
19
utils.go
19
utils.go
|
@ -32,22 +32,27 @@ func doDeleteEncryptedContents(path string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
type BufferedWriter struct {
|
type BufferedWriter struct {
|
||||||
file *os.File
|
file *os.File
|
||||||
downloaded *int64
|
downloaded *int64
|
||||||
buffer []byte
|
progressReporter ProgressReporter
|
||||||
|
buffer []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewFileWriterWithProgress(file *os.File, downloaded *int64) (*BufferedWriter, error) {
|
func NewFileWriterWithProgress(file *os.File, downloaded *int64, progressReporter ProgressReporter) (*BufferedWriter, error) {
|
||||||
return &BufferedWriter{
|
return &BufferedWriter{
|
||||||
file: file,
|
file: file,
|
||||||
downloaded: downloaded,
|
downloaded: downloaded,
|
||||||
buffer: make([]byte, bufferSize),
|
progressReporter: progressReporter,
|
||||||
|
buffer: make([]byte, bufferSize),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bw *BufferedWriter) Write(data []byte) (int, error) {
|
func (bw *BufferedWriter) Write(data []byte) (int, error) {
|
||||||
written := 0
|
written := 0
|
||||||
for written < len(data) {
|
for written < len(data) {
|
||||||
|
if bw.progressReporter.Cancelled() {
|
||||||
|
return written, nil
|
||||||
|
}
|
||||||
remaining := len(data) - written
|
remaining := len(data) - written
|
||||||
toWrite := min(bufferSize, uint64(remaining))
|
toWrite := min(bufferSize, uint64(remaining))
|
||||||
copy(bw.buffer, data[written:written+int(toWrite)])
|
copy(bw.buffer, data[written:written+int(toWrite)])
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue