Improve cancellation

This commit is contained in:
Xpl0itU 2024-04-03 19:41:46 +02:00
parent 624c96b7e8
commit f927c43c1b
3 changed files with 15 additions and 9 deletions

View file

@ -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 {

View file

@ -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()

View file

@ -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)])