diff --git a/cmd/WiiUDownloader/progressWindow.go b/cmd/WiiUDownloader/progressWindow.go index 4a93564..0714edd 100644 --- a/cmd/WiiUDownloader/progressWindow.go +++ b/cmd/WiiUDownloader/progressWindow.go @@ -121,6 +121,7 @@ func createProgressWindow(parent *gtk.ApplicationWindow) (*ProgressWindow, error win.SetTitle("WiiUDownloader - Downloading") win.SetTransientFor(parent) + win.SetDeletable(false) box, err := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5) if err != nil { diff --git a/downloader.go b/downloader.go index 7a6b334..8bd1dd9 100644 --- a/downloader.go +++ b/downloader.go @@ -50,7 +50,7 @@ func downloadFile(ctx context.Context, progressReporter ProgressReporter, client updateProgress := func(downloaded *int64) { for range ticker.C { if progressReporter.Cancelled() { - break + return } progressReporter.UpdateDownloadProgress(*downloaded, calculateDownloadSpeed(*downloaded, startTime, time.Now()), filePath) } @@ -100,7 +100,7 @@ func downloadFile(ctx context.Context, progressReporter ProgressReporter, client go updateProgress(&downloaded) - customBufferedWriter, err := NewFileWriterWithProgress(file, &downloaded) + customBufferedWriter, err := NewFileWriterWithProgress(file, &downloaded, progressReporter) if err != nil { resp.CloseBodyStream() file.Close() diff --git a/utils.go b/utils.go index 12c80c9..cd9e276 100644 --- a/utils.go +++ b/utils.go @@ -32,22 +32,27 @@ func doDeleteEncryptedContents(path string) error { } type BufferedWriter struct { - file *os.File - downloaded *int64 - buffer []byte + file *os.File + downloaded *int64 + 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{ - file: file, - downloaded: downloaded, - buffer: make([]byte, bufferSize), + file: file, + downloaded: downloaded, + progressReporter: progressReporter, + buffer: make([]byte, bufferSize), }, nil } func (bw *BufferedWriter) Write(data []byte) (int, error) { written := 0 for written < len(data) { + if bw.progressReporter.Cancelled() { + return written, nil + } remaining := len(data) - written toWrite := min(bufferSize, uint64(remaining)) copy(bw.buffer, data[written:written+int(toWrite)])