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.SetTransientFor(parent)
win.SetDeletable(false)
box, err := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
if err != nil {

View file

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

View file

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