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/UploadObjectRequest.h>
18 #include <alibabacloud/oss/http/HttpType.h>
19 #include <alibabacloud/oss/Const.h>
20 #include <fstream>
21 #include "utils/Utils.h"
22 #include "../utils/FileSystemUtils.h"
23 #include "../model/ModelError.h"
24 
25 using namespace AlibabaCloud::OSS;
26 
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::string & filePath,const std::string & checkpointDir,const uint64_t partSize,const uint32_t threadNum)27 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
28     const std::string &filePath, const std::string &checkpointDir,
29     const uint64_t partSize, const uint32_t threadNum):
30     OssResumableBaseRequest(bucket, key, checkpointDir, partSize, threadNum),
31     filePath_(filePath)
32 {
33     time_t lastMtime;
34     std::streamsize fileSize;
35     isFileExist_ = true;
36     if (!GetPathInfo(filePath_, lastMtime, fileSize)) {
37         //if fail, ignore the lastmodified time.
38         lastMtime = 0;
39         fileSize = 0;
40         isFileExist_ = false;
41     }
42     mtime_ = ToGmtTime(lastMtime);
43     objectSize_ = static_cast<uint64_t>(fileSize);
44 }
45 
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::string & filePath,const std::string & checkpointDir,const uint64_t partSize,const uint32_t threadNum,const ObjectMetaData & meta)46 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
47     const std::string &filePath, const std::string &checkpointDir,
48     const uint64_t partSize, const uint32_t threadNum, const ObjectMetaData& meta):
49     UploadObjectRequest(bucket, key, filePath, checkpointDir, partSize, threadNum)
50 {
51     metaData_ = meta;
52 }
53 
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::string & filePath,const std::string & checkpointDir,const ObjectMetaData & meta)54 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
55     const std::string &filePath, const std::string &checkpointDir, const ObjectMetaData& meta):
56     UploadObjectRequest(bucket, key, filePath, checkpointDir, DefaultPartSize, DefaultResumableThreadNum, meta)
57 {}
58 
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::string & filePath,const std::string & checkpointDir)59 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
60     const std::string &filePath, const std::string &checkpointDir) :
61     UploadObjectRequest(bucket, key, filePath, checkpointDir, DefaultPartSize, DefaultResumableThreadNum)
62 {}
63 
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::string & filePath)64 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
65     const std::string &filePath):
66     UploadObjectRequest(bucket, key, filePath, "", DefaultPartSize, DefaultResumableThreadNum)
67 {}
68 
69 //wstring
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::wstring & filePath,const std::wstring & checkpointDir,const uint64_t partSize,const uint32_t threadNum)70 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
71     const std::wstring &filePath, const std::wstring &checkpointDir,
72     const uint64_t partSize, const uint32_t threadNum) :
73     OssResumableBaseRequest(bucket, key, checkpointDir, partSize, threadNum),
74     filePathW_(filePath)
75 {
76 #ifdef _WIN32
77     time_t lastMtime;
78     std::streamsize fileSize;
79     isFileExist_ = true;
80     if (!GetPathInfo(filePathW_, lastMtime, fileSize)) {
81         //if fail, ignore the lastmodified time.
82         lastMtime = 0;
83         fileSize = 0;
84         isFileExist_ = false;
85     }
86     mtime_ = ToGmtTime(lastMtime);
87     objectSize_ = static_cast<uint64_t>(fileSize);
88 #else
89     objectSize_ = 0;
90     time_t lastMtime = 0;
91     mtime_ = ToGmtTime(lastMtime);
92     isFileExist_ = false;
93 #endif
94 }
95 
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::wstring & filePath,const std::wstring & checkpointDir,const uint64_t partSize,const uint32_t threadNum,const ObjectMetaData & meta)96 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
97     const std::wstring &filePath, const std::wstring &checkpointDir,
98     const uint64_t partSize, const uint32_t threadNum, const ObjectMetaData& meta) :
99     UploadObjectRequest(bucket, key, filePath, checkpointDir, partSize, threadNum)
100 {
101     metaData_ = meta;
102 }
103 
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::wstring & filePath,const std::wstring & checkpointDir,const ObjectMetaData & meta)104 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
105     const std::wstring &filePath, const std::wstring &checkpointDir, const ObjectMetaData& meta) :
106     UploadObjectRequest(bucket, key, filePath, checkpointDir, DefaultPartSize, DefaultResumableThreadNum, meta)
107 {}
108 
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::wstring & filePath,const std::wstring & checkpointDir)109 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
110     const std::wstring &filePath, const std::wstring &checkpointDir) :
111     UploadObjectRequest(bucket, key, filePath, checkpointDir, DefaultPartSize, DefaultResumableThreadNum)
112 {}
113 
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::wstring & filePath)114 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
115     const std::wstring &filePath) :
116     UploadObjectRequest(bucket, key, filePath, L"", DefaultPartSize, DefaultResumableThreadNum)
117 {}
118 
119 
setAcl(CannedAccessControlList & acl)120 void UploadObjectRequest::setAcl(CannedAccessControlList& acl)
121 {
122     metaData_.addHeader("x-oss-object-acl", ToAclName(acl));
123 }
124 
setCallback(const std::string & callback,const std::string & callbackVar)125 void UploadObjectRequest::setCallback(const std::string& callback, const std::string& callbackVar)
126 {
127     metaData_.removeHeader("x-oss-callback");
128     metaData_.removeHeader("x-oss-callback-var");
129 
130     if (!callback.empty()) {
131         metaData_.addHeader("x-oss-callback", callback);
132     }
133 
134     if (!callbackVar.empty()) {
135         metaData_.addHeader("x-oss-callback-var", callbackVar);
136     }
137 }
138 
setTagging(const std::string & value)139 void UploadObjectRequest::setTagging(const std::string& value)
140 {
141     metaData_.addHeader("x-oss-tagging", value);
142 }
143 
validate() const144 int UploadObjectRequest::validate() const
145 {
146     auto ret = OssResumableBaseRequest::validate();
147     if (ret != 0) {
148         return ret;
149     }
150 
151 #if !defined(_WIN32)
152     if (!filePathW_.empty()) {
153         return ARG_ERROR_PATH_NOT_SUPPORT_WSTRING_TYPE;
154     }
155 #endif
156 
157     //path and checkpoint must be same type.
158     if ((!filePath_.empty() && !checkpointDirW_.empty()) ||
159         (!filePathW_.empty() && !checkpointDir_.empty())) {
160         return ARG_ERROR_PATH_NOT_SAME_TYPE;
161     }
162 
163     if (!isFileExist_) {
164         return ARG_ERROR_OPEN_UPLOAD_FILE;
165     }
166 
167     return 0;
168 }
169