61 lines
1.4 KiB
Go
61 lines
1.4 KiB
Go
|
package utils
|
||
|
|
||
|
// ProgressEventType defines transfer progress event type
|
||
|
type ProgressEventType int
|
||
|
|
||
|
const (
|
||
|
// TransferStartedEvent transfer started, set TotalBytes
|
||
|
TransferStartedEvent ProgressEventType = 1 + iota
|
||
|
// TransferDataEvent transfer data, set ConsumedBytes anmd TotalBytes
|
||
|
TransferDataEvent
|
||
|
// TransferCompletedEvent transfer completed
|
||
|
TransferCompletedEvent
|
||
|
// TransferFailedEvent transfer encounters an error
|
||
|
TransferFailedEvent
|
||
|
)
|
||
|
|
||
|
// ProgressEvent defines progress event
|
||
|
type ProgressEvent struct {
|
||
|
ConsumedBytes int64
|
||
|
TotalBytes int64
|
||
|
RwBytes int64
|
||
|
EventType ProgressEventType
|
||
|
}
|
||
|
|
||
|
// ProgressListener listens progress change
|
||
|
type ProgressListener interface {
|
||
|
ProgressChanged(event *ProgressEvent)
|
||
|
}
|
||
|
|
||
|
// -------------------- Private --------------------
|
||
|
|
||
|
func NewProgressEvent(eventType ProgressEventType, consumed, total int64, rwBytes int64) *ProgressEvent {
|
||
|
return &ProgressEvent{
|
||
|
ConsumedBytes: consumed,
|
||
|
TotalBytes: total,
|
||
|
RwBytes: rwBytes,
|
||
|
EventType: eventType}
|
||
|
}
|
||
|
|
||
|
// publishProgress
|
||
|
func PublishProgress(listener ProgressListener, event *ProgressEvent) {
|
||
|
if listener != nil && event != nil {
|
||
|
listener.ProgressChanged(event)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func GetProgressListener(obj interface{}) ProgressListener {
|
||
|
if obj == nil {
|
||
|
return nil
|
||
|
}
|
||
|
listener, ok := obj.(ProgressListener)
|
||
|
if !ok {
|
||
|
return nil
|
||
|
}
|
||
|
return listener
|
||
|
}
|
||
|
|
||
|
type ReaderTracker struct {
|
||
|
CompletedBytes int64
|
||
|
}
|