(ctx interface{}, t *Transfer, cb ProgressCallback, authOkFunc func())
| 257 | } |
| 258 | |
| 259 | func (a *customAdapter) DoTransfer(ctx interface{}, t *Transfer, cb ProgressCallback, authOkFunc func()) error { |
| 260 | if ctx == nil { |
| 261 | return errors.New(tr.Tr.Get("custom transfer %q was not properly initialized, see previous errors", a.name)) |
| 262 | } |
| 263 | |
| 264 | customCtx, ok := ctx.(*customAdapterWorkerContext) |
| 265 | if !ok { |
| 266 | return errors.New(tr.Tr.Get("context object for custom transfer %q was of the wrong type", a.name)) |
| 267 | } |
| 268 | var authCalled bool |
| 269 | |
| 270 | rel, err := t.Rel(a.getOperationName()) |
| 271 | if err != nil { |
| 272 | return err |
| 273 | } |
| 274 | if rel == nil && !a.standalone { |
| 275 | return errors.New(tr.Tr.Get("Object %s not found on the server.", t.Oid)) |
| 276 | } |
| 277 | var req *customAdapterTransferRequest |
| 278 | if a.direction == Upload { |
| 279 | req = NewCustomAdapterUploadRequest(t.Oid, t.Size, t.Path, rel) |
| 280 | } else { |
| 281 | req = NewCustomAdapterDownloadRequest(t.Oid, t.Size, rel) |
| 282 | } |
| 283 | if err = a.sendMessage(customCtx, req); err != nil { |
| 284 | return err |
| 285 | } |
| 286 | |
| 287 | // 1..N replies (including progress & one of download / upload) |
| 288 | var complete bool |
| 289 | for !complete { |
| 290 | resp, err := a.readResponse(customCtx) |
| 291 | if err != nil { |
| 292 | return err |
| 293 | } |
| 294 | var wasAuthOk bool |
| 295 | switch resp.Event { |
| 296 | case "progress": |
| 297 | // Progress |
| 298 | if resp.Oid != t.Oid { |
| 299 | return errors.New(tr.Tr.Get("unexpected OID %q in response, expecting %q", resp.Oid, t.Oid)) |
| 300 | } |
| 301 | if cb != nil { |
| 302 | cb(t.Name, t.Size, resp.BytesSoFar, resp.BytesSinceLast) |
| 303 | } |
| 304 | wasAuthOk = resp.BytesSoFar > 0 |
| 305 | case "complete": |
| 306 | // Download/Upload complete |
| 307 | if resp.Oid != t.Oid { |
| 308 | return errors.New(tr.Tr.Get("unexpected OID %q in response, expecting %q", resp.Oid, t.Oid)) |
| 309 | } |
| 310 | if resp.Error != nil { |
| 311 | return errors.New(tr.Tr.Get("error transferring %q: %v", t.Oid, resp.Error)) |
| 312 | } |
| 313 | if a.direction == Download { |
| 314 | // So we don't have to blindly trust external providers, check SHA |
| 315 | if err = tools.VerifyFileHash(t.Oid, resp.Path); err != nil { |
| 316 | return errors.New(tr.Tr.Get("downloaded file failed checks: %v", err)) |
nothing calls this directly
no test coverage detected