CopyObjectOutcome OssClientImpl::ResumableCopyObject()

in sdk/src/OssClientImpl.cc [1464:1502]


CopyObjectOutcome OssClientImpl::ResumableCopyObject(const MultiCopyObjectRequest& request) const 
{
    const auto& reqeustBase = static_cast<const OssResumableBaseRequest &>(request);
    int code = reqeustBase.validate();
    if (code != 0) {
        return CopyObjectOutcome(OssError("ValidateError", reqeustBase.validateMessage(code)));
    }

    auto getObjectMetaReq = GetObjectMetaRequest(request.SrcBucket(), request.SrcKey());
    if (request.RequestPayer() == RequestPayer::Requester) {
        getObjectMetaReq.setRequestPayer(request.RequestPayer());
    }
    if (!request.VersionId().empty()) {
        getObjectMetaReq.setVersionId(request.VersionId());
    }
    auto outcome = GetObjectMeta(getObjectMetaReq);
    if (!outcome.isSuccess()) {
        return CopyObjectOutcome(outcome.error());
    }

    auto objectSize = outcome.result().ContentLength();
    if (objectSize < (int64_t)request.PartSize()) {
        auto copyObjectReq = CopyObjectRequest(request.Bucket(), request.Key(), request.MetaData());
        copyObjectReq.setCopySource(request.SrcBucket(), request.SrcKey());
        if (request.RequestPayer() == RequestPayer::Requester) {
            copyObjectReq.setRequestPayer(request.RequestPayer());
        }
        if (request.TrafficLimit() != 0) {
            copyObjectReq.setTrafficLimit(request.TrafficLimit());
        }
        if (!request.VersionId().empty()) {
            copyObjectReq.setVersionId(request.VersionId());
        }
        return CopyObject(copyObjectReq);
    }

    ResumableCopier copier(request, this, objectSize);
    return copier.Copy();
}