int ResumableUploader::getPartsToUpload()

in sdk/src/resumable/ResumableUploader.cc [325:381]


int ResumableUploader::getPartsToUpload(OssError &err, PartList &partsUploaded, PartList &partsToUpload)
{
    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 = ListPartsWrap(listPartsRequest);
            if(!outcome.isSuccess()){
                err = outcome.error();
                return -1;
            }

            auto parts = outcome.result().PartList();
            for(auto iter = parts.begin(); iter != parts.end(); iter++){
                if (iter->Size() != static_cast<int64_t>(partSize_)) {
                    continue;
                }
                partNumbersUploaded.insert(iter->PartNumber());
                partsUploaded.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()){
            partsToUpload.push_back(part);
        }
    }

    return 0;
}