1 /*
2  * Copyright 2009-2017 Alibaba Cloud All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <alibabacloud/oss/model/MultiCopyObjectRequest.h>
18 #include <alibabacloud/oss/Const.h>
19 #include <sstream>
20 #include "../utils/FileSystemUtils.h"
21 #include "utils/Utils.h"
22 #include "../model/ModelError.h"
23 
24 using namespace AlibabaCloud::OSS;
25 static const std::string strEmpty = "";
26 
MultiCopyObjectRequest(const std::string & bucket,const std::string & key,const std::string & srcBucket,const std::string & srcKey)27 MultiCopyObjectRequest::MultiCopyObjectRequest(const std::string &bucket, const std::string &key,
28     const std::string &srcBucket, const std::string &srcKey) :
29     MultiCopyObjectRequest(bucket, key, srcBucket, srcKey, "", DefaultPartSize, DefaultResumableThreadNum)
30 {}
31 
MultiCopyObjectRequest(const std::string & bucket,const std::string & key,const std::string & srcBucket,const std::string & srcKey,const std::string & checkpointDir)32 MultiCopyObjectRequest::MultiCopyObjectRequest(const std::string &bucket, const std::string &key,
33     const std::string &srcBucket, const std::string &srcKey,
34     const std::string &checkpointDir) :
35     MultiCopyObjectRequest(bucket, key, srcBucket, srcKey, checkpointDir, DefaultPartSize, DefaultResumableThreadNum)
36 {}
37 
MultiCopyObjectRequest(const std::string & bucket,const std::string & key,const std::string & srcBucket,const std::string & srcKey,const std::string & checkpointDir,const ObjectMetaData & meta)38 MultiCopyObjectRequest::MultiCopyObjectRequest(const std::string &bucket, const std::string &key,
39     const std::string &srcBucket, const std::string &srcKey,
40     const std::string &checkpointDir, const ObjectMetaData& meta):
41     MultiCopyObjectRequest(bucket, key, srcBucket, srcKey, checkpointDir, DefaultPartSize, DefaultResumableThreadNum, meta)
42 {}
43 
MultiCopyObjectRequest(const std::string & bucket,const std::string & key,const std::string & srcBucket,const std::string & srcKey,const std::string & checkpointDir,uint64_t partSize,uint32_t threadNum,const ObjectMetaData & meta)44 MultiCopyObjectRequest::MultiCopyObjectRequest(const std::string &bucket, const std::string &key,
45     const std::string &srcBucket, const std::string &srcKey,
46     const std::string &checkpointDir, uint64_t partSize, uint32_t threadNum, const ObjectMetaData& meta):
47     MultiCopyObjectRequest(bucket, key, srcBucket, srcKey, checkpointDir, partSize, threadNum)
48 {
49     metaData_ = meta;
50 }
51 
MultiCopyObjectRequest(const std::string & bucket,const std::string & key,const std::string & srcBucket,const std::string & srcKey,const std::string & checkpointDir,uint64_t partSize,uint32_t threadNum)52 MultiCopyObjectRequest::MultiCopyObjectRequest(const std::string &bucket, const std::string &key,
53     const std::string &srcBucket, const std::string &srcKey,
54     const std::string &checkpointDir, uint64_t partSize, uint32_t threadNum) :
55     OssResumableBaseRequest(bucket, key, checkpointDir, partSize, threadNum),
56     srcBucket_(srcBucket),
57     srcKey_(srcKey)
58 {
59     setCopySource(srcBucket, srcKey);
60 }
61 
62 //wstring
MultiCopyObjectRequest(const std::string & bucket,const std::string & key,const std::string & srcBucket,const std::string & srcKey,const std::wstring & checkpointDir)63 MultiCopyObjectRequest::MultiCopyObjectRequest(const std::string &bucket, const std::string &key,
64     const std::string &srcBucket, const std::string &srcKey,
65     const std::wstring &checkpointDir) :
66     MultiCopyObjectRequest(bucket, key, srcBucket, srcKey, checkpointDir, DefaultPartSize, DefaultResumableThreadNum)
67 {}
68 
MultiCopyObjectRequest(const std::string & bucket,const std::string & key,const std::string & srcBucket,const std::string & srcKey,const std::wstring & checkpointDir,const ObjectMetaData & meta)69 MultiCopyObjectRequest::MultiCopyObjectRequest(const std::string &bucket, const std::string &key,
70     const std::string &srcBucket, const std::string &srcKey,
71     const std::wstring &checkpointDir, const ObjectMetaData& meta) :
72     MultiCopyObjectRequest(bucket, key, srcBucket, srcKey, checkpointDir, DefaultPartSize, DefaultResumableThreadNum, meta)
73 {}
74 
MultiCopyObjectRequest(const std::string & bucket,const std::string & key,const std::string & srcBucket,const std::string & srcKey,const std::wstring & checkpointDir,uint64_t partSize,uint32_t threadNum,const ObjectMetaData & meta)75 MultiCopyObjectRequest::MultiCopyObjectRequest(const std::string &bucket, const std::string &key,
76     const std::string &srcBucket, const std::string &srcKey,
77     const std::wstring &checkpointDir, uint64_t partSize, uint32_t threadNum, const ObjectMetaData& meta) :
78     MultiCopyObjectRequest(bucket, key, srcBucket, srcKey, checkpointDir, partSize, threadNum)
79 {
80     metaData_ = meta;
81 }
82 
MultiCopyObjectRequest(const std::string & bucket,const std::string & key,const std::string & srcBucket,const std::string & srcKey,const std::wstring & checkpointDir,uint64_t partSize,uint32_t threadNum)83 MultiCopyObjectRequest::MultiCopyObjectRequest(const std::string &bucket, const std::string &key,
84     const std::string &srcBucket, const std::string &srcKey,
85     const std::wstring &checkpointDir, uint64_t partSize, uint32_t threadNum) :
86     OssResumableBaseRequest(bucket, key, checkpointDir, partSize, threadNum),
87     srcBucket_(srcBucket),
88     srcKey_(srcKey)
89 {
90     setCopySource(srcBucket, srcKey);
91 }
92 
setCopySource(const std::string & srcBucket,const std::string & srcObject)93 void MultiCopyObjectRequest::setCopySource(const std::string& srcBucket, const std::string& srcObject)
94 {
95     std::stringstream ssDesc;
96     ssDesc << "/" << srcBucket << "/" << srcObject;
97     std::string value = ssDesc.str();
98     metaData_.addHeader("x-oss-copy-source", value);
99 }
100 
setSourceIfMatchEtag(const std::string & value)101 void MultiCopyObjectRequest::setSourceIfMatchEtag(const std::string& value)
102 {
103     metaData_.addHeader("x-oss-copy-source-if-match", value);
104 }
105 
SourceIfMatchEtag() const106 const std::string& MultiCopyObjectRequest::SourceIfMatchEtag() const
107 {
108     if (metaData_.HttpMetaData().find("x-oss-copy-source-if-match") != metaData_.HttpMetaData().end()) {
109         return metaData_.HttpMetaData().at("x-oss-copy-source-if-match");
110     }
111     return strEmpty;
112 }
113 
setSourceIfNotMatchEtag(const std::string & value)114 void MultiCopyObjectRequest::setSourceIfNotMatchEtag(const std::string& value)
115 {
116     metaData_.addHeader("x-oss-copy-source-if-none-match", value);
117 }
118 
SourceIfNotMatchEtag() const119 const std::string& MultiCopyObjectRequest::SourceIfNotMatchEtag() const
120 {
121     if (metaData_.HttpMetaData().find("x-oss-copy-source-if-none-match") != metaData_.HttpMetaData().end()) {
122         return metaData_.HttpMetaData().at("x-oss-copy-source-if-none-match");
123     }
124     return strEmpty;
125 }
126 
setSourceIfUnModifiedSince(const std::string & value)127 void MultiCopyObjectRequest::setSourceIfUnModifiedSince(const std::string& value)
128 {
129     metaData_.addHeader("x-oss-copy-source-if-unmodified-since", value);
130 }
131 
SourceIfUnModifiedSince() const132 const std::string& MultiCopyObjectRequest::SourceIfUnModifiedSince() const
133 {
134     if (metaData_.HttpMetaData().find("x-oss-copy-source-if-unmodified-since") != metaData_.HttpMetaData().end()) {
135         return metaData_.HttpMetaData().at("x-oss-copy-source-if-unmodified-since");
136     }
137     return strEmpty;
138 }
139 
setSourceIfModifiedSince(const std::string & value)140 void MultiCopyObjectRequest::setSourceIfModifiedSince(const std::string& value)
141 {
142     metaData_.addHeader("x-oss-copy-source-if-modified-since", value);
143 }
144 
SourceIfModifiedSince() const145 const std::string& MultiCopyObjectRequest::SourceIfModifiedSince() const
146 {
147     if (metaData_.HttpMetaData().find("x-oss-copy-source-if-modified-since") != metaData_.HttpMetaData().end()) {
148         return metaData_.HttpMetaData().at("x-oss-copy-source-if-modified-since");
149     }
150     return strEmpty;
151 }
152 
setMetadataDirective(const CopyActionList & action)153 void MultiCopyObjectRequest::setMetadataDirective(const CopyActionList& action)
154 {
155     metaData_.addHeader("x-oss-metadata-directive", ToCopyActionName(action));
156 }
157 
setAcl(const CannedAccessControlList & acl)158 void MultiCopyObjectRequest::setAcl(const CannedAccessControlList& acl)
159 {
160     metaData_.addHeader("x-oss-object-acl", ToAclName(acl));
161 }
162 
validate() const163 int MultiCopyObjectRequest::validate() const
164 {
165     auto ret = OssResumableBaseRequest::validate();
166     if (ret != 0) {
167         return ret;
168     }
169 
170     return 0;
171 }
172