int ResumableCopier::prepare()

in sdk/src/resumable/ResumableCopier.cc [174:239]


int ResumableCopier::prepare(OssError& err) 
{
    determinePartSize();
    ObjectMetaData metaData(request_.MetaData());
    if (metaData.HttpMetaData().find("x-oss-metadata-directive") == metaData.HttpMetaData().end() ||
        (metaData.HttpMetaData().find("x-oss-metadata-directive") != metaData.HttpMetaData().end() && 
            metaData.HttpMetaData().at("x-oss-metadata-directive") == "COPY")) {
        HeadObjectRequest hRequest(request_.SrcBucket(), request_.SrcKey());
        if (request_.RequestPayer() == RequestPayer::Requester) {
            hRequest.setRequestPayer(request_.RequestPayer());
        }
        if (!request_.VersionId().empty()) {
            hRequest.setVersionId(request_.VersionId());
        }
        auto headObjectOutcome = client_->HeadObject(hRequest);
        if (!headObjectOutcome.isSuccess()) {
            err = headObjectOutcome.error();
            return -1;
        }
        auto& meta = metaData.UserMetaData();
        meta = headObjectOutcome.result().UserMetaData();
    }

    auto initMultipartUploadReq = InitiateMultipartUploadRequest(request_.Bucket(), request_.Key(), metaData);
    if (!request_.EncodingType().empty()) {
        initMultipartUploadReq.setEncodingType(request_.EncodingType());
    }
    if (request_.RequestPayer() == RequestPayer::Requester) {
        initMultipartUploadReq.setRequestPayer(request_.RequestPayer());
    }
    auto outcome = client_->InitiateMultipartUpload(initMultipartUploadReq);
    if (!outcome.isSuccess()) {
        err = outcome.error();
        return -1;
    }

    //init record_
    uploadID_ = outcome.result().UploadId();

    if (hasRecordPath()) {
        initRecord(uploadID_);

        Json::Value root;
        root["opType"] = record_.opType;
        root["uploadID"] = record_.uploadID;
        root["srcBucket"] = record_.srcBucket;
        root["srcKey"] = record_.srcKey;
        root["bucket"] = record_.bucket;
        root["key"] = record_.key;
        root["mtime"] = record_.mtime;
        root["size"] = record_.size;
        root["partSize"] = record_.partSize;

        std::stringstream ss;
        ss << root;
        std::string md5Sum = ComputeContentETag(ss);
        root["md5Sum"] = md5Sum;

        auto recordStream = GetFstreamByPath(recordPath_, recordPathW_, std::ios::out);
        if (recordStream->is_open()) {
            *recordStream << root;
            recordStream->close();
        }
    }
    return 0;
}