Add file transfer progress
This commit is contained in:
parent
db8f03dee7
commit
60a0daa82e
@ -12,6 +12,7 @@ type File struct {
|
||||
fs *FS
|
||||
path string
|
||||
offset uint32
|
||||
offsetCh chan uint32
|
||||
length uint32
|
||||
amtLeft uint32
|
||||
amtTferd uint32
|
||||
@ -22,7 +23,7 @@ type File struct {
|
||||
|
||||
// Open opens a file and returns it as an fs.File to
|
||||
// satisfy the fs.FS interface
|
||||
func (blefs *FS) Open(path string) (fs.File, error) {
|
||||
func (blefs *FS) Open(path string) (*File, error) {
|
||||
// Make a read file request. This opens the file for reading.
|
||||
err := blefs.request(
|
||||
FSCmdReadFile,
|
||||
@ -40,6 +41,7 @@ func (blefs *FS) Open(path string) (fs.File, error) {
|
||||
path: path,
|
||||
length: 0,
|
||||
offset: 0,
|
||||
offsetCh: make(chan uint32, 5),
|
||||
isReadOnly: true,
|
||||
isWriteOnly: false,
|
||||
}, nil
|
||||
@ -66,11 +68,23 @@ func (blefs *FS) Create(path string, size uint32) (*File, error) {
|
||||
length: size,
|
||||
amtLeft: size,
|
||||
offset: 0,
|
||||
offsetCh: make(chan uint32, 5),
|
||||
isReadOnly: false,
|
||||
isWriteOnly: true,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Size returns the total size of the opened file
|
||||
func (file *File) Size() uint32 {
|
||||
return file.length
|
||||
}
|
||||
|
||||
// Progress returns a channel that receives the amount
|
||||
// of bytes sent as they are sent
|
||||
func (file *File) Progress() <-chan uint32 {
|
||||
return file.offsetCh
|
||||
}
|
||||
|
||||
// Read reads data from a file into b
|
||||
func (fl *File) Read(b []byte) (n int, err error) {
|
||||
// If file is write only (opened by FS.Create())
|
||||
@ -149,6 +163,7 @@ func (fl *File) Read(b []byte) (n int, err error) {
|
||||
fl.length = resp.length
|
||||
// Add returned chunk length to offset and amount transferred
|
||||
fl.offset += resp.chunkLen
|
||||
fl.offsetCh <- fl.offset
|
||||
fl.amtTferd += resp.chunkLen
|
||||
|
||||
// Calculate amount of bytes to be sent in next request
|
||||
@ -168,6 +183,7 @@ func (fl *File) Read(b []byte) (n int, err error) {
|
||||
chunkLen,
|
||||
)
|
||||
}
|
||||
close(fl.offsetCh)
|
||||
// Copy buffer contents to b
|
||||
copied := copy(b, buf)
|
||||
// Return amount of bytes copied with EOF error
|
||||
@ -262,8 +278,11 @@ func (fl *File) Write(b []byte) (n int, err error) {
|
||||
)
|
||||
// Add chunk length to offset and amount transferred
|
||||
fl.offset += chunkLen
|
||||
fl.offsetCh <- fl.offset
|
||||
fl.amtTferd += chunkLen
|
||||
}
|
||||
|
||||
close(fl.offsetCh)
|
||||
return int(fl.offset), nil
|
||||
}
|
||||
|
||||
|
15
blefs/iofs.go
Normal file
15
blefs/iofs.go
Normal file
@ -0,0 +1,15 @@
|
||||
package blefs
|
||||
|
||||
import "io/fs"
|
||||
|
||||
type goFS struct {
|
||||
*FS
|
||||
}
|
||||
|
||||
func (iofs goFS) Open(path string) (fs.File, error) {
|
||||
return iofs.FS.Open(path)
|
||||
}
|
||||
|
||||
func (blefs *FS) GoFS() fs.FS {
|
||||
return goFS{blefs}
|
||||
}
|
1
go.mod
1
go.mod
@ -6,4 +6,5 @@ require (
|
||||
github.com/fxamacker/cbor/v2 v2.3.0
|
||||
github.com/godbus/dbus/v5 v5.0.3
|
||||
github.com/muka/go-bluetooth v0.0.0-20211122080231-b99792bbe62a
|
||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 // indirect
|
||||
)
|
||||
|
5
go.sum
5
go.sum
@ -3,8 +3,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
|
||||
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
|
||||
github.com/fxamacker/cbor v1.5.1 h1:XjQWBgdmQyqimslUh5r4tUGmoqzHmBFQOImkWGi2awg=
|
||||
github.com/fxamacker/cbor v1.5.1/go.mod h1:3aPGItF174ni7dDzd6JZ206H8cmr4GDNBGpPa971zsU=
|
||||
github.com/fxamacker/cbor/v2 v2.3.0 h1:aM45YGMctNakddNNAezPxDUpv38j44Abh+hifNuqXik=
|
||||
github.com/fxamacker/cbor/v2 v2.3.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
|
||||
github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME=
|
||||
@ -44,8 +42,9 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 h1:sIky/MyNRSHTrdxfsiUSS4WIAMvInbeXljJz+jDjeYE=
|
||||
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 h1:F5Gozwx4I1xtr/sr/8CFbb57iKi3297KFs0QDbGN60A=
|
||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20200925191224-5d1fdd8fa346/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
|
||||
|
Reference in New Issue
Block a user