int ResumableCopier::getPartsToUploadCopy()

in sdk/src/resumable/ResumableCopier.cc [334:389]


int ResumableCopier::getPartsToUploadCopy(OssError &err, PartList &partsCopied, PartList &partsToUploadCopy) 
{
    std::set<uint64_t> partNumbersUploaded;

    if (hasRecord_) {
        uint32_t marker = 0;
        auto listPartsRequest = ListPartsRequest(request_.Bucket(), request_.Key(), uploadID_);
        if (!request_.EncodingType().empty()) {
            listPartsRequest.setEncodingType(request_.EncodingType());
        }
        if (request_.RequestPayer() == RequestPayer::Requester) {
            listPartsRequest.setRequestPayer(request_.RequestPayer());
        }
        while (true) {
            listPartsRequest.setPartNumberMarker(marker);
            auto outcome = client_->ListParts(listPartsRequest);
            if (!outcome.isSuccess()) {
                err = outcome.error();
                return -1;
            }

            auto parts = outcome.result().PartList();
            for (auto iter = parts.begin(); iter != parts.end(); iter++) {
                partNumbersUploaded.insert(iter->PartNumber());
                partsCopied.emplace_back(*iter);
                consumedSize_ += iter->Size();
            }

            if (outcome.result().IsTruncated()) {
                marker = outcome.result().NextPartNumberMarker();
            }
            else {
                break;
            }
        }
    }

    int32_t partCount = (int32_t)((objectSize_ - 1) / partSize_ + 1);
    for (int32_t i = 0; i < partCount; i++) {
        Part part;
        part.partNumber_ = i + 1;
        if (i == partCount - 1) {
            part.size_ = objectSize_ - partSize_ * (partCount - 1);
        }
        else {
            part.size_ = partSize_;
        }

        auto iterNum = partNumbersUploaded.find(part.PartNumber());
        if (iterNum == partNumbersUploaded.end()) {
            partsToUploadCopy.push_back(part);
        }
    }

    return 0;
}