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 }