80 lines
1.5 KiB
Go
80 lines
1.5 KiB
Go
package jobs
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"ddc/internal/fetch"
|
|
)
|
|
|
|
var errPaused = errors.New("download paused")
|
|
|
|
func (job *Job) SetTotal(total int64) {
|
|
job.bytesTotal.Store(total)
|
|
}
|
|
|
|
func (job *Job) SetDone(done int64) {
|
|
job.bytesDone.Store(done)
|
|
}
|
|
|
|
func (job *Job) Add(delta int64) {
|
|
job.bytesDone.Add(delta)
|
|
}
|
|
|
|
func (job *Job) SetFileName(name string) {
|
|
job.mutex.Lock()
|
|
defer job.mutex.Unlock()
|
|
job.fileName = name
|
|
}
|
|
|
|
func (job *Job) SetNotice(text string) {
|
|
job.mutex.Lock()
|
|
defer job.mutex.Unlock()
|
|
if !job.deleted && job.status == StatusDownloading {
|
|
job.message = text
|
|
}
|
|
}
|
|
|
|
func (job *Job) resetProgress() {
|
|
job.bytesDone.Store(0)
|
|
job.bytesTotal.Store(0)
|
|
}
|
|
|
|
func (job *Job) startRun() (context.Context, context.CancelCauseFunc) {
|
|
runContext, cancelRun := context.WithCancelCause(job.jobContext)
|
|
job.mutex.Lock()
|
|
defer job.mutex.Unlock()
|
|
job.cancelRun = cancelRun
|
|
return runContext, cancelRun
|
|
}
|
|
|
|
func (job *Job) pause() bool {
|
|
job.mutex.Lock()
|
|
defer job.mutex.Unlock()
|
|
if job.cancelRun == nil || (job.status != StatusQueued && job.status != StatusDownloading) {
|
|
return false
|
|
}
|
|
job.cancelRun(errPaused)
|
|
return true
|
|
}
|
|
|
|
func (job *Job) currentDownloadState() *fetch.State {
|
|
job.mutex.Lock()
|
|
defer job.mutex.Unlock()
|
|
return job.downloadState
|
|
}
|
|
|
|
func (job *Job) setDownloadState(state *fetch.State) {
|
|
job.mutex.Lock()
|
|
defer job.mutex.Unlock()
|
|
job.downloadState = state
|
|
}
|
|
|
|
func (job *Job) markDownloaded(fileName string) {
|
|
job.mutex.Lock()
|
|
defer job.mutex.Unlock()
|
|
job.downloaded = true
|
|
job.downloadState = nil
|
|
job.fileName = fileName
|
|
}
|