CacheFullAndWriter save all data into tmpFile or memory. It's not thread-safe!
(up *model.UpdateProgress, writer io.Writer)
| 63 | // CacheFullAndWriter save all data into tmpFile or memory. |
| 64 | // It's not thread-safe! |
| 65 | func (f *FileStream) CacheFullAndWriter(up *model.UpdateProgress, writer io.Writer) (model.File, error) { |
| 66 | if cache := f.GetFile(); cache != nil { |
| 67 | _, err := cache.Seek(0, io.SeekStart) |
| 68 | if err != nil { |
| 69 | return nil, err |
| 70 | } |
| 71 | if writer == nil { |
| 72 | return cache, nil |
| 73 | } |
| 74 | reader := f.Reader |
| 75 | if up != nil { |
| 76 | cacheProgress := model.UpdateProgressWithRange(*up, 0, 50) |
| 77 | *up = model.UpdateProgressWithRange(*up, 50, 100) |
| 78 | reader = &ReaderUpdatingProgress{ |
| 79 | Reader: &SimpleReaderWithSize{ |
| 80 | Reader: reader, |
| 81 | Size: f.GetSize(), |
| 82 | }, |
| 83 | UpdateProgress: cacheProgress, |
| 84 | } |
| 85 | } |
| 86 | _, err = utils.CopyWithBuffer(writer, reader) |
| 87 | if err == nil { |
| 88 | _, err = cache.Seek(0, io.SeekStart) |
| 89 | } |
| 90 | if err != nil { |
| 91 | return nil, err |
| 92 | } |
| 93 | return cache, nil |
| 94 | } |
| 95 | |
| 96 | reader := f.Reader |
| 97 | if f.peek != nil { |
| 98 | f.peek.Seek(0, io.SeekStart) |
| 99 | if writer != nil { |
| 100 | _, err := utils.CopyWithBuffer(writer, f.peek) |
| 101 | if err != nil { |
| 102 | return nil, err |
| 103 | } |
| 104 | f.peek.Seek(0, io.SeekStart) |
| 105 | } |
| 106 | reader = f.oriReader |
| 107 | } |
| 108 | if writer != nil { |
| 109 | reader = io.TeeReader(reader, writer) |
| 110 | } |
| 111 | |
| 112 | // 如果文件大小未知,直接缓存到磁盘 |
| 113 | if f.GetSize() < 0 { |
| 114 | // 检查是否有数据 |
| 115 | buf := []byte{0} |
| 116 | n, err := io.ReadFull(reader, buf) |
| 117 | br := bytes.NewReader(buf[:n]) |
| 118 | if err == io.ErrUnexpectedEOF || err == io.EOF { |
| 119 | f.size = br.Size() |
| 120 | f.Reader = br |
| 121 | return br, nil |
| 122 | } else if err != nil { |
nothing calls this directly
no test coverage detected