diff --git a/bindings/fileTransfer.go b/bindings/fileTransfer.go index 4dfd1d47c1407f20e756c5462ec5cd9d95d51d7a..e893dab252ff7cc8c6acc5caa582fcf3babe33d5 100644 --- a/bindings/fileTransfer.go +++ b/bindings/fileTransfer.go @@ -11,9 +11,8 @@ import ( "encoding/json" "time" - jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" "gitlab.com/elixxir/client/fileTransfer" + "gitlab.com/elixxir/client/fileTransfer/e2e" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/primitives/id" ) @@ -25,8 +24,7 @@ import ( // FileTransfer object is a bindings-layer struct which wraps a // fileTransfer.FileTransfer interface. type FileTransfer struct { - ft fileTransfer.FileTransfer - e2eCl *E2e + w *e2e.Wrapper } // ReceivedFile is a public struct that contains the metadata of a new file @@ -127,7 +125,7 @@ type FileTransferReceiveProgressCallback interface { // Parameters: // - e2eID - e2e object ID in the tracker // - paramsJSON - JSON marshalled fileTransfer.Params -func InitFileTransfer(e2eID int, paramsJSON []byte) (*FileTransfer, error) { +func InitFileTransfer(e2eID int, receiveFileCallback ReceiveFileCallback, e2eFileTransferParamsJson, fileTransferParamsJson []byte) (*FileTransfer, error) { // Get messenger from singleton messenger, err := e2eTrackerSingleton.get(e2eID) @@ -139,15 +137,37 @@ func InitFileTransfer(e2eID int, paramsJSON []byte) (*FileTransfer, error) { myID := messenger.api.GetReceptionIdentity().ID rng := messenger.api.GetRng() - params, err := parseFileTransferParams(paramsJSON) + e2eFileTransferParams, err := parseE2eFileTransferParams(e2eFileTransferParamsJson) + if err != nil { + return nil, err + } + + fileTransferParams, err := parseFileTransferParams(fileTransferParamsJson) if err != nil { return nil, err } // Create file transfer manager - m, err := fileTransfer.NewManager(params, myID, + m, err := fileTransfer.NewManager(fileTransferParams, myID, messenger.api.GetCmix(), messenger.api.GetStorage(), rng) + rcb := func(tid *ftCrypto.TransferID, fileName, fileType string, + sender *id.ID, size uint32, preview []byte) { + receiveFileCallback.Callback(json.Marshal(ReceivedFile{ + TransferID: tid.Bytes(), + SenderID: sender.Marshal(), + Preview: preview, + Name: fileName, + Type: fileType, + Size: int(size), + })) + } + + w, err := e2e.NewWrapper(rcb, e2eFileTransferParams, m, myID, messenger.api.GetE2E(), messenger.api.GetCmix()) + if err != nil { + return nil, err + } + // Add file transfer processes to client services tracking err = messenger.api.AddService(m.StartProcesses) if err != nil { @@ -155,7 +175,7 @@ func InitFileTransfer(e2eID int, paramsJSON []byte) (*FileTransfer, error) { } // Return wrapped manager - return &FileTransfer{ft: m, e2eCl: messenger}, nil + return &FileTransfer{w: w}, nil } // Send is the bindings-level function for sending a file. @@ -170,7 +190,7 @@ func InitFileTransfer(e2eID int, paramsJSON []byte) (*FileTransfer, error) { // // Returns: // - []byte - unique file transfer ID -func (f *FileTransfer) Send(payload, recipientID, paramsJSON []byte, retry float32, +func (f *FileTransfer) Send(payload, recipientID []byte, retry float32, callback FileTransferSentProgressCallback, period string) ([]byte, error) { // Unmarshal recipient ID recipient, err := id.Unmarshal(recipientID) @@ -201,17 +221,8 @@ func (f *FileTransfer) Send(payload, recipientID, paramsJSON []byte, retry float return nil, err } - sendNew := func(transferInfo []byte) error { - resp, err := f.e2eCl.SendE2E(int(catalog.NewFileTransfer), recipientID, transferInfo, paramsJSON) - if err != nil { - return err - } - jww.INFO.Printf("New file transfer message sent: %s", resp) - return nil - } - // Send file - ftID, err := f.ft.Send(recipient, fs.Name, fs.Type, fs.Contents, retry, fs.Preview, cb, p, sendNew) + ftID, err := f.w.Send(recipient, fs.Name, fs.Type, fs.Contents, retry, fs.Preview, cb, p) if err != nil { return nil, err } @@ -232,7 +243,7 @@ func (f *FileTransfer) Send(payload, recipientID, paramsJSON []byte, retry float // - tidBytes - file transfer ID func (f *FileTransfer) Receive(tidBytes []byte) ([]byte, error) { tid := ftCrypto.UnmarshalTransferID(tidBytes) - return f.ft.Receive(&tid) + return f.w.Receive(&tid) } // CloseSend deletes a file from the internal storage once a transfer has @@ -246,7 +257,7 @@ func (f *FileTransfer) Receive(tidBytes []byte) ([]byte, error) { // - tidBytes - file transfer ID func (f *FileTransfer) CloseSend(tidBytes []byte) error { tid := ftCrypto.UnmarshalTransferID(tidBytes) - return f.ft.CloseSend(&tid) + return f.w.CloseSend(&tid) } //////////////////////////////////////////////////////////////////////////////// @@ -282,7 +293,7 @@ func (f *FileTransfer) RegisterSentProgressCallback(tidBytes []byte, } tid := ftCrypto.UnmarshalTransferID(tidBytes) - return f.ft.RegisterSentProgressCallback(&tid, cb, p) + return f.w.RegisterSentProgressCallback(&tid, cb, p) } // RegisterReceivedProgressCallback allows for the registration of a callback to @@ -312,7 +323,7 @@ func (f *FileTransfer) RegisterReceivedProgressCallback(tidBytes []byte, return err } tid := ftCrypto.UnmarshalTransferID(tidBytes) - return f.ft.RegisterReceivedProgressCallback(&tid, cb, p) + return f.w.RegisterReceivedProgressCallback(&tid, cb, p) } //////////////////////////////////////////////////////////////////////////////// @@ -321,22 +332,22 @@ func (f *FileTransfer) RegisterReceivedProgressCallback(tidBytes []byte, // MaxFileNameLen returns the max number of bytes allowed for a file name. func (f *FileTransfer) MaxFileNameLen() int { - return f.ft.MaxFileNameLen() + return f.w.MaxFileNameLen() } // MaxFileTypeLen returns the max number of bytes allowed for a file type. func (f *FileTransfer) MaxFileTypeLen() int { - return f.ft.MaxFileTypeLen() + return f.w.MaxFileTypeLen() } // MaxFileSize returns the max number of bytes allowed for a file. func (f *FileTransfer) MaxFileSize() int { - return f.ft.MaxFileSize() + return f.w.MaxFileSize() } // MaxPreviewSize returns the max number of bytes allowed for a file preview. func (f *FileTransfer) MaxPreviewSize() int { - return f.ft.MaxPreviewSize() + return f.w.MaxPreviewSize() } //////////////////////////////////////////////////////////////////////////////// diff --git a/bindings/params.go b/bindings/params.go index 50da624ea6a944ae6fff08214aea2c44f17c58da..2b0cdd18c82d16c2a7a3f0b5570532d26bf87b23 100644 --- a/bindings/params.go +++ b/bindings/params.go @@ -12,6 +12,7 @@ package bindings import ( jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/fileTransfer" + e2eFileTransfer "gitlab.com/elixxir/client/fileTransfer/e2e" "gitlab.com/elixxir/client/single" "gitlab.com/elixxir/client/xxdk" ) @@ -64,6 +65,23 @@ func GetDefaultSingleUseParams() []byte { return data } +// GetDefaultE2eFileTransferParams returns a JSON serialized object with all the +// e2e file transfer parameters and their default values. Call this function and modify +// the JSON to change single use settings. +func GetDefaultE2eFileTransferParams() []byte { + defaultParams := e2eFileTransfer.DefaultParams() + data, err := defaultParams.MarshalJSON() + if err != nil { + jww.FATAL.Panicf("Failed to JSON marshal e2e file transfer params: %+v", err) + } + return data +} + +func parseE2eFileTransferParams(data []byte) (e2eFileTransfer.Params, error) { + p := &e2eFileTransfer.Params{} + return *p, p.UnmarshalJSON(data) +} + func parseSingleUseParams(data []byte) (single.RequestParams, error) { p := &single.RequestParams{} return *p, p.UnmarshalJSON(data)