#include "TosClientV2.h"
using namespace VolcengineTos;
std::string region = "Your Region";
std::string accessKey = std::getenv("TOS_ACCESS_KEY");
std::string secretKey = std::getenv("TOS_SECRET_KEY");
std::string bucketName = "destbucket";
std::string objectName = "destdir/exampleobject.txt";
std::string srcBucketName = "srcbucket";
std::string srcObjectName = "srcdir/exampleobject.txt";
TosClientV2 client(region, accessKey, secretKey);
CreateMultipartUploadInput input_part_create(bucketName, objectName);
auto upload = client.createMultipartUpload(input_part_create);
if (!upload.isSuccess()) {
std::cout << "createMultipartUpload error: " << upload.error().String() << std::endl;
HeadObjectV2Input headInput(srcBucketName, srcObjectName);
auto headOutput = client.headObject(headInput);
if (!headOutput.isSuccess()) {
std::cout << "head object error: " << headOutput.error().String() << std::endl;
int64_t objectSize = headOutput.result().getContentLength();
int partSize = 5 * 1024 * 1024;
int partCount = (int)(objectSize / partSize);
std::vector<UploadedPartV2> copyParts;
if (objectSize % partSize != 0) {
int64_t copySourceRangeEnd_ = 0;
for (int i = 1; i <= partCount; i++) {
auto offset = partSize * (i - 1);
auto size = (partSize < objectSize - offset) ? partSize : (objectSize - offset);
UploadPartCopyV2Input input(bucketName, objectName, srcBucketName, srcObjectName, i,upload.result().getUploadId());
input.setCopySourceRangeStart(offset);
input.setCopySourceRangeEnd(offset + size - 1);
auto output = client.uploadPartCopy(input);
if (!output.isSuccess()) {
std::cout << "upload part " << i << "failed, error is: " << output.error().String() << std::endl;
UploadedPartV2 temp(output.result().getPartNumber(), output.result().getETag());
copyParts.push_back(temp);
CompleteMultipartUploadV2Input input(bucketName, objectName, upload.result().getUploadId(), copyParts);
auto complete = client.completeMultipartUpload(input);
if (!complete.isSuccess()) {
std::cout << "CompleteMultipartUpload error: " << complete.error().String() << std::endl;