Browse Source

Add file transfer progress

master
Arsen Musayelyan 5 months ago
parent
commit
382b1d9556
  1. 21
      blefs/file.go
  2. 15
      blefs/iofs.go
  3. 1
      go.mod
  4. 5
      go.sum

21
blefs/file.go

@ -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

@ -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

@ -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

@ -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=

Loading…
Cancel
Save