progress.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package utils
  2. // ProgressEventType defines transfer progress event type
  3. type ProgressEventType int
  4. const (
  5. // TransferStartedEvent transfer started, set TotalBytes
  6. TransferStartedEvent ProgressEventType = 1 + iota
  7. // TransferDataEvent transfer data, set ConsumedBytes anmd TotalBytes
  8. TransferDataEvent
  9. // TransferCompletedEvent transfer completed
  10. TransferCompletedEvent
  11. // TransferFailedEvent transfer encounters an error
  12. TransferFailedEvent
  13. )
  14. // ProgressEvent defines progress event
  15. type ProgressEvent struct {
  16. ConsumedBytes int64
  17. TotalBytes int64
  18. RwBytes int64
  19. EventType ProgressEventType
  20. }
  21. // ProgressListener listens progress change
  22. type ProgressListener interface {
  23. ProgressChanged(event *ProgressEvent)
  24. }
  25. // -------------------- Private --------------------
  26. func NewProgressEvent(eventType ProgressEventType, consumed, total int64, rwBytes int64) *ProgressEvent {
  27. return &ProgressEvent{
  28. ConsumedBytes: consumed,
  29. TotalBytes: total,
  30. RwBytes: rwBytes,
  31. EventType: eventType}
  32. }
  33. // publishProgress
  34. func PublishProgress(listener ProgressListener, event *ProgressEvent) {
  35. if listener != nil && event != nil {
  36. listener.ProgressChanged(event)
  37. }
  38. }
  39. func GetProgressListener(obj interface{}) ProgressListener {
  40. if obj == nil {
  41. return nil
  42. }
  43. listener, ok := obj.(ProgressListener)
  44. if !ok {
  45. return nil
  46. }
  47. return listener
  48. }
  49. type ReaderTracker struct {
  50. CompletedBytes int64
  51. }