GetObjectOutcome OssClientImpl::ResumableDownloadObject()

in sdk/src/OssClientImpl.cc [1504:1562]


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

    auto getObjectMetaReq = GetObjectMetaRequest(request.Bucket(), request.Key());
    if (request.RequestPayer() == RequestPayer::Requester) {
        getObjectMetaReq.setRequestPayer(request.RequestPayer());
    }
    if (!request.VersionId().empty()) {
        getObjectMetaReq.setVersionId(request.VersionId());
    }
    auto hOutcome = GetObjectMeta(getObjectMetaReq);
    if (!hOutcome.isSuccess()) {
        return GetObjectOutcome(hOutcome.error());
    }

    auto objectSize = hOutcome.result().ContentLength();
    if (objectSize < (int64_t)request.PartSize()) {
        auto getObjectReq = GetObjectRequest(request.Bucket(), request.Key(), request.ModifiedSinceConstraint(), request.UnmodifiedSinceConstraint(),request.MatchingETagsConstraint(), request.NonmatchingETagsConstraint(), request.ResponseHeaderParameters());
        if (request.RangeIsSet()) {
            getObjectReq.setRange(request.RangeStart(), request.RangeEnd());
        }
        if (request.TransferProgress().Handler) {
            getObjectReq.setTransferProgress(request.TransferProgress());
        }
        if (request.RequestPayer() == RequestPayer::Requester) {
            getObjectReq.setRequestPayer(request.RequestPayer());
        }
        if (request.TrafficLimit() != 0) {
            getObjectReq.setTrafficLimit(request.TrafficLimit());
        }
        if (!request.VersionId().empty()) {
            getObjectReq.setVersionId(request.VersionId());
        }
        getObjectReq.setResponseStreamFactory([=]() {
            return GetFstreamByPath(request.FilePath(), request.FilePathW(),
                std::ios_base::out | std::ios_base::in | std::ios_base::trunc | std::ios_base::binary);
        });
        auto outcome = this->GetObject(getObjectReq);
        std::shared_ptr<std::iostream> content = nullptr;
        outcome.result().setContent(content);
        if (IsFileExist(request.TempFilePath())) {
            RemoveFile(request.TempFilePath());
        }
#ifdef _WIN32
        else if (IsFileExist(request.TempFilePathW())) {
            RemoveFile(request.TempFilePathW());
        }
#endif
        return outcome;
    }

    ResumableDownloader downloader(request, this, objectSize);
    return downloader.Download();
}