diff --git a/common_test.go b/common_test.go index f67fb4812..0f3795d5b 100644 --- a/common_test.go +++ b/common_test.go @@ -13,6 +13,9 @@ type TestModel struct { name string offset int64 size int + hash []byte + flags uint32 + options []Option closedCh chan bool } @@ -28,11 +31,14 @@ func (t *TestModel) Index(deviceID DeviceID, folder string, files []FileInfo) { func (t *TestModel) IndexUpdate(deviceID DeviceID, folder string, files []FileInfo) { } -func (t *TestModel) Request(deviceID DeviceID, folder, name string, offset int64, size int) ([]byte, error) { +func (t *TestModel) Request(deviceID DeviceID, folder, name string, offset int64, size int, hash []byte, flags uint32, options []Option) ([]byte, error) { t.folder = folder t.name = name t.offset = offset t.size = size + t.hash = hash + t.flags = flags + t.options = options return t.data, nil } diff --git a/nativemodel_darwin.go b/nativemodel_darwin.go index 5b4b9be67..6001af694 100644 --- a/nativemodel_darwin.go +++ b/nativemodel_darwin.go @@ -26,9 +26,9 @@ func (m nativeModel) IndexUpdate(deviceID DeviceID, folder string, files []FileI m.next.IndexUpdate(deviceID, folder, files) } -func (m nativeModel) Request(deviceID DeviceID, folder string, name string, offset int64, size int) ([]byte, error) { +func (m nativeModel) Request(deviceID DeviceID, folder string, name string, offset int64, size int, hash []byte, flags uint32, options []Option) ([]byte, error) { name = norm.NFD.String(name) - return m.next.Request(deviceID, folder, name, offset, size) + return m.next.Request(deviceID, folder, name, offset, size, hash, flags, options) } func (m nativeModel) ClusterConfig(deviceID DeviceID, config ClusterConfigMessage) { diff --git a/nativemodel_unix.go b/nativemodel_unix.go index 2fb1654c7..5f7b2e2c4 100644 --- a/nativemodel_unix.go +++ b/nativemodel_unix.go @@ -18,8 +18,8 @@ func (m nativeModel) IndexUpdate(deviceID DeviceID, folder string, files []FileI m.next.IndexUpdate(deviceID, folder, files) } -func (m nativeModel) Request(deviceID DeviceID, folder string, name string, offset int64, size int) ([]byte, error) { - return m.next.Request(deviceID, folder, name, offset, size) +func (m nativeModel) Request(deviceID DeviceID, folder string, name string, offset int64, size int, hash []byte, flags uint32, options []Option) ([]byte, error) { + return m.next.Request(deviceID, folder, name, offset, size, hash, flags, options) } func (m nativeModel) ClusterConfig(deviceID DeviceID, config ClusterConfigMessage) { diff --git a/nativemodel_windows.go b/nativemodel_windows.go index d4feea326..4859cbaab 100644 --- a/nativemodel_windows.go +++ b/nativemodel_windows.go @@ -56,9 +56,9 @@ func (m nativeModel) IndexUpdate(deviceID DeviceID, folder string, files []FileI m.next.IndexUpdate(deviceID, folder, files) } -func (m nativeModel) Request(deviceID DeviceID, folder string, name string, offset int64, size int) ([]byte, error) { +func (m nativeModel) Request(deviceID DeviceID, folder string, name string, offset int64, size int, hash []byte, flags uint32, options []Option) ([]byte, error) { name = filepath.FromSlash(name) - return m.next.Request(deviceID, folder, name, offset, size) + return m.next.Request(deviceID, folder, name, offset, size, hash, flags, options) } func (m nativeModel) ClusterConfig(deviceID DeviceID, config ClusterConfigMessage) { diff --git a/protocol.go b/protocol.go index e7b6fe275..7e2658775 100644 --- a/protocol.go +++ b/protocol.go @@ -70,7 +70,7 @@ type Model interface { // An index update was received from the peer device IndexUpdate(deviceID DeviceID, folder string, files []FileInfo) // A request was made by the peer device - Request(deviceID DeviceID, folder string, name string, offset int64, size int) ([]byte, error) + Request(deviceID DeviceID, folder string, name string, offset int64, size int, hash []byte, flags uint32, options []Option) ([]byte, error) // A cluster configuration message was received ClusterConfig(deviceID DeviceID, config ClusterConfigMessage) // The peer device closed the connection @@ -82,7 +82,7 @@ type Connection interface { Name() string Index(folder string, files []FileInfo) error IndexUpdate(folder string, files []FileInfo) error - Request(folder string, name string, offset int64, size int) ([]byte, error) + Request(folder string, name string, offset int64, size int, hash []byte, flags uint32, options []Option) ([]byte, error) ClusterConfig(config ClusterConfigMessage) Statistics() Statistics } @@ -201,7 +201,7 @@ func (c *rawConnection) IndexUpdate(folder string, idx []FileInfo) error { } // Request returns the bytes for the specified block after fetching them from the connected peer. -func (c *rawConnection) Request(folder string, name string, offset int64, size int) ([]byte, error) { +func (c *rawConnection) Request(folder string, name string, offset int64, size int, hash []byte, flags uint32, options []Option) ([]byte, error) { var id int select { case id = <-c.nextID: @@ -218,10 +218,13 @@ func (c *rawConnection) Request(folder string, name string, offset int64, size i c.awaitingMut.Unlock() ok := c.send(id, messageTypeRequest, RequestMessage{ - Folder: folder, - Name: name, - Offset: offset, - Size: int32(size), + Folder: folder, + Name: name, + Offset: offset, + Size: int32(size), + Hash: hash, + Flags: flags, + Options: options, }) if !ok { return nil, ErrClosed @@ -499,7 +502,7 @@ func filterIndexMessageFiles(fs []FileInfo) []FileInfo { } func (c *rawConnection) handleRequest(msgID int, req RequestMessage) { - data, _ := c.receiver.Request(c.id, req.Folder, req.Name, int64(req.Offset), int(req.Size)) + data, _ := c.receiver.Request(c.id, req.Folder, req.Name, int64(req.Offset), int(req.Size), req.Hash, req.Flags, req.Options) c.send(msgID, messageTypeResponse, ResponseMessage{ Data: data, diff --git a/protocol_test.go b/protocol_test.go index c1048cdcf..c660ba327 100644 --- a/protocol_test.go +++ b/protocol_test.go @@ -232,7 +232,7 @@ func TestClose(t *testing.T) { c0.Index("default", nil) c0.Index("default", nil) - if _, err := c0.Request("default", "foo", 0, 0); err == nil { + if _, err := c0.Request("default", "foo", 0, 0, nil, 0, nil); err == nil { t.Error("Request should return an error") } } diff --git a/wireformat.go b/wireformat.go index 4eab3d37e..23d347e1b 100644 --- a/wireformat.go +++ b/wireformat.go @@ -42,9 +42,9 @@ func (c wireFormatConnection) IndexUpdate(folder string, fs []FileInfo) error { return c.next.IndexUpdate(folder, myFs) } -func (c wireFormatConnection) Request(folder, name string, offset int64, size int) ([]byte, error) { +func (c wireFormatConnection) Request(folder, name string, offset int64, size int, hash []byte, flags uint32, options []Option) ([]byte, error) { name = norm.NFC.String(filepath.ToSlash(name)) - return c.next.Request(folder, name, offset, size) + return c.next.Request(folder, name, offset, size, hash, flags, options) } func (c wireFormatConnection) ClusterConfig(config ClusterConfigMessage) {