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 #pragma once
18 
19 #include <alibabacloud/oss/Export.h>
20 #include <alibabacloud/oss/client/ClientConfiguration.h>
21 #include <alibabacloud/oss/auth/CredentialsProvider.h>
22 #include <alibabacloud/oss/OssFwd.h>
23 #include <alibabacloud/oss/client/AsyncCallerContext.h>
24 #include <future>
25 #include <ctime>
26 
27 namespace AlibabaCloud
28 {
29 namespace OSS
30 {
31     /*Global Init/Deinit*/
32     void ALIBABACLOUD_OSS_EXPORT InitializeSdk();
33     bool ALIBABACLOUD_OSS_EXPORT IsSdkInitialized();
34     void ALIBABACLOUD_OSS_EXPORT ShutdownSdk();
35 
36     /*Log*/
37     void ALIBABACLOUD_OSS_EXPORT SetLogLevel(LogLevel level);
38     void ALIBABACLOUD_OSS_EXPORT SetLogCallback(LogCallback callback);
39 
40     /*Utils*/
41     std::string ALIBABACLOUD_OSS_EXPORT ComputeContentMD5(const char *data, size_t size);
42     std::string ALIBABACLOUD_OSS_EXPORT ComputeContentMD5(std::istream& stream);
43     std::string ALIBABACLOUD_OSS_EXPORT ComputeContentETag(const char* data, size_t size);
44     std::string ALIBABACLOUD_OSS_EXPORT ComputeContentETag(std::istream& stream);
45     std::string ALIBABACLOUD_OSS_EXPORT UrlEncode(const std::string& src);
46     std::string ALIBABACLOUD_OSS_EXPORT UrlDecode(const std::string& src);
47     std::string ALIBABACLOUD_OSS_EXPORT Base64Encode(const std::string& src);
48     std::string ALIBABACLOUD_OSS_EXPORT Base64Encode(const char* src, int len);
49     std::string ALIBABACLOUD_OSS_EXPORT Base64EncodeUrlSafe(const std::string& src);
50     std::string ALIBABACLOUD_OSS_EXPORT Base64EncodeUrlSafe(const char* src, int len);
51     std::string ALIBABACLOUD_OSS_EXPORT ToGmtTime(std::time_t& t);
52     std::string ALIBABACLOUD_OSS_EXPORT ToUtcTime(std::time_t& t);
53     std::time_t ALIBABACLOUD_OSS_EXPORT UtcToUnixTime(const std::string& t);
54     uint64_t    ALIBABACLOUD_OSS_EXPORT ComputeCRC64(uint64_t crc, void* buf, size_t len);
55     uint64_t    ALIBABACLOUD_OSS_EXPORT CombineCRC64(uint64_t crc1, uint64_t crc2, uintmax_t len2);
56 
57     /*Aysnc APIs*/
58     class OssClient;
59     using ListObjectAsyncHandler = std::function<void(const AlibabaCloud::OSS::OssClient*, const ListObjectsRequest&, const ListObjectOutcome&, const std::shared_ptr<const AsyncCallerContext>&)>;
60     using GetObjectAsyncHandler  = std::function<void(const AlibabaCloud::OSS::OssClient*, const GetObjectRequest&, const GetObjectOutcome&, const std::shared_ptr<const AsyncCallerContext>&)>;
61     using PutObjectAsyncHandler = std::function<void(const AlibabaCloud::OSS::OssClient*, const PutObjectRequest&, const PutObjectOutcome&, const std::shared_ptr<const AsyncCallerContext>&)>;
62     using UploadPartAsyncHandler = std::function<void(const AlibabaCloud::OSS::OssClient*, const UploadPartRequest&, const PutObjectOutcome&, const std::shared_ptr<const AsyncCallerContext>&)>;
63     using UploadPartCopyAsyncHandler = std::function<void(const AlibabaCloud::OSS::OssClient*, const UploadPartCopyRequest&, const UploadPartCopyOutcome&, const std::shared_ptr<const AsyncCallerContext>&)>;
64 
65     /*Callable*/
66     using ListObjectOutcomeCallable = std::future<ListObjectOutcome>;
67     using GetObjectOutcomeCallable  = std::future<GetObjectOutcome>;
68     using PutObjectOutcomeCallable  = std::future<PutObjectOutcome>;
69     using UploadPartCopyOutcomeCallable = std::future<UploadPartCopyOutcome>;
70 
71     class OssClientImpl;
72     class ALIBABACLOUD_OSS_EXPORT OssClient
73     {
74     public:
75 
76         OssClient(const std::string& endpoint, const std::string& accessKeyId, const std::string& accessKeySecret,
77                                 const ClientConfiguration& configuration);
78         OssClient(const std::string& endpoint, const std::string& accessKeyId, const std::string& accessKeySecret, const std::string& securityToken,
79                                 const ClientConfiguration& configuration);
80         OssClient(const std::string& endpoint, const Credentials& credentials, const ClientConfiguration& configuration);
81         OssClient(const std::string& endpoint, const std::shared_ptr<CredentialsProvider>& credentialsProvider, const ClientConfiguration& configuration);
82         virtual ~OssClient();
83 
84 #if !defined(OSS_DISABLE_BUCKET)
85         /*Service*/
86         ListBucketsOutcome ListBuckets() const;
87         ListBucketsOutcome ListBuckets(const ListBucketsRequest& request) const;
88 
89         /*Bucket*/
90         CreateBucketOutcome CreateBucket(const std::string& bucket, StorageClass storageClass = StorageClass::Standard) const;
91         CreateBucketOutcome CreateBucket(const std::string& bucket, StorageClass storageClass, CannedAccessControlList acl) const;
92         CreateBucketOutcome CreateBucket(const CreateBucketRequest& request) const;
93 
94         ListBucketInventoryConfigurationsOutcome ListBucketInventoryConfigurations(const ListBucketInventoryConfigurationsRequest& request) const;
95 
96         VoidOutcome SetBucketAcl(const std::string& bucket, CannedAccessControlList acl) const;
97         VoidOutcome SetBucketAcl(const SetBucketAclRequest& request) const;
98         VoidOutcome SetBucketLogging(const std::string& bucket, const std::string& targetBucket, const std::string& targetPrefix) const;
99         VoidOutcome SetBucketLogging(const SetBucketLoggingRequest& request) const;
100         VoidOutcome SetBucketWebsite(const std::string& bucket, const std::string& indexDocument) const;
101         VoidOutcome SetBucketWebsite(const std::string& bucket, const std::string& indexDocument, const std::string& errorDocument) const;
102         VoidOutcome SetBucketWebsite(const SetBucketWebsiteRequest& request) const;
103         VoidOutcome SetBucketReferer(const std::string& bucket, const RefererList& refererList, bool allowEmptyReferer) const;
104         VoidOutcome SetBucketReferer(const SetBucketRefererRequest& request) const;
105         VoidOutcome SetBucketLifecycle(const SetBucketLifecycleRequest& request) const;
106         VoidOutcome SetBucketCors(const std::string& bucket, const CORSRuleList& rules) const;
107         VoidOutcome SetBucketCors(const SetBucketCorsRequest& request) const;
108         VoidOutcome SetBucketStorageCapacity(const std::string& bucket, int64_t storageCapacity) const;
109         VoidOutcome SetBucketStorageCapacity(const SetBucketStorageCapacityRequest& request) const;
110         VoidOutcome SetBucketPolicy(const SetBucketPolicyRequest& request) const;
111         VoidOutcome SetBucketRequestPayment(const SetBucketRequestPaymentRequest& request) const;
112         VoidOutcome SetBucketEncryption(const SetBucketEncryptionRequest& request) const;
113         VoidOutcome SetBucketTagging(const SetBucketTaggingRequest& request) const;
114         VoidOutcome SetBucketQosInfo(const SetBucketQosInfoRequest& request) const;
115         VoidOutcome SetBucketVersioning(const SetBucketVersioningRequest& request) const;
116         VoidOutcome SetBucketInventoryConfiguration(const SetBucketInventoryConfigurationRequest& request) const;
117 
118         VoidOutcome DeleteBucket(const std::string& bucket) const;
119         VoidOutcome DeleteBucket(const DeleteBucketRequest& request) const;
120         VoidOutcome DeleteBucketLogging(const std::string& bucket) const;
121         VoidOutcome DeleteBucketLogging(const DeleteBucketLoggingRequest& request) const;
122         VoidOutcome DeleteBucketPolicy(const DeleteBucketPolicyRequest& request) const;
123         VoidOutcome DeleteBucketWebsite(const std::string& bucket) const;
124         VoidOutcome DeleteBucketWebsite(const DeleteBucketWebsiteRequest& request) const;
125         VoidOutcome DeleteBucketLifecycle(const std::string& bucket) const;
126         VoidOutcome DeleteBucketLifecycle(const DeleteBucketLifecycleRequest& request) const;
127         VoidOutcome DeleteBucketCors(const std::string& bucket) const;
128         VoidOutcome DeleteBucketCors(const DeleteBucketCorsRequest& request) const;
129         VoidOutcome DeleteBucketEncryption(const DeleteBucketEncryptionRequest& request) const;
130         VoidOutcome DeleteBucketTagging(const DeleteBucketTaggingRequest& request) const;
131         VoidOutcome DeleteBucketQosInfo(const DeleteBucketQosInfoRequest& request) const;
132         VoidOutcome DeleteBucketInventoryConfiguration(const DeleteBucketInventoryConfigurationRequest& request) const;
133 
134         GetBucketAclOutcome GetBucketAcl(const std::string& bucket) const;
135         GetBucketAclOutcome GetBucketAcl(const GetBucketAclRequest& request) const;
136         GetBucketLocationOutcome GetBucketLocation(const std::string& bucket) const;
137         GetBucketLocationOutcome GetBucketLocation(const GetBucketLocationRequest& request) const;
138         GetBucketInfoOutcome  GetBucketInfo(const std::string& bucket) const;
139         GetBucketInfoOutcome  GetBucketInfo(const GetBucketInfoRequest& request) const;
140         GetBucketLoggingOutcome GetBucketLogging(const std::string& bucket) const;
141         GetBucketLoggingOutcome GetBucketLogging(const GetBucketLoggingRequest& request) const;
142         GetBucketWebsiteOutcome GetBucketWebsite(const std::string& bucket) const;
143         GetBucketWebsiteOutcome GetBucketWebsite(const GetBucketWebsiteRequest& request) const;
144         GetBucketRefererOutcome GetBucketReferer(const std::string& bucket) const;
145         GetBucketRefererOutcome GetBucketReferer(const GetBucketRefererRequest& request) const;
146         GetBucketLifecycleOutcome GetBucketLifecycle(const std::string& bucket) const;
147         GetBucketLifecycleOutcome GetBucketLifecycle(const GetBucketLifecycleRequest& request) const;
148         GetBucketStatOutcome GetBucketStat(const std::string& bucket) const;
149         GetBucketStatOutcome GetBucketStat(const GetBucketStatRequest& request) const;
150         GetBucketCorsOutcome GetBucketCors(const std::string& bucket) const;
151         GetBucketCorsOutcome GetBucketCors(const GetBucketCorsRequest& request) const;
152         GetBucketStorageCapacityOutcome GetBucketStorageCapacity(const std::string& bucket) const;
153         GetBucketStorageCapacityOutcome GetBucketStorageCapacity(const GetBucketStorageCapacityRequest& request) const;
154         GetBucketPolicyOutcome GetBucketPolicy(const GetBucketPolicyRequest& request) const;
155         GetBucketPaymentOutcome GetBucketRequestPayment(const GetBucketRequestPaymentRequest& request) const;
156         GetBucketEncryptionOutcome GetBucketEncryption(const GetBucketEncryptionRequest& request) const;
157         GetBucketTaggingOutcome GetBucketTagging(const GetBucketTaggingRequest& request) const;
158         GetBucketQosInfoOutcome GetBucketQosInfo(const GetBucketQosInfoRequest& request) const;
159         GetUserQosInfoOutcome GetUserQosInfo(const GetUserQosInfoRequest& request) const;
160         GetBucketVersioningOutcome GetBucketVersioning(const GetBucketVersioningRequest& request) const;
161         GetBucketInventoryConfigurationOutcome GetBucketInventoryConfiguration(const GetBucketInventoryConfigurationRequest& request) const;
162 #endif
163 
164         /*Object*/
165         ListObjectOutcome ListObjects(const std::string& bucket) const;
166         ListObjectOutcome ListObjects(const std::string& bucket, const std::string& prefix) const;
167         ListObjectOutcome ListObjects(const ListObjectsRequest& request) const;
168         ListObjectVersionsOutcome ListObjectVersions(const std::string& bucket) const;
169         ListObjectVersionsOutcome ListObjectVersions(const std::string& bucket, const std::string& prefix) const;
170         ListObjectVersionsOutcome ListObjectVersions(const ListObjectVersionsRequest& request) const;
171 
172         GetObjectOutcome GetObject(const std::string& bucket, const std::string& key) const;
173         GetObjectOutcome GetObject(const std::string& bucket, const std::string& key, const std::shared_ptr<std::iostream>& content) const;
174         GetObjectOutcome GetObject(const std::string& bucket, const std::string& key, const std::string& fileToSave) const;
175         GetObjectOutcome GetObject(const GetObjectRequest& request) const;
176         PutObjectOutcome PutObject(const std::string& bucket, const std::string& key, const std::shared_ptr<std::iostream>& content) const;
177         PutObjectOutcome PutObject(const std::string& bucket, const std::string& key, const std::string& fileToUpload) const;
178         PutObjectOutcome PutObject(const std::string& bucket, const std::string& key, const std::shared_ptr<std::iostream>& content, const ObjectMetaData& meta) const;
179         PutObjectOutcome PutObject(const std::string& bucket, const std::string& key, const std::string& fileToUpload, const ObjectMetaData& meta) const;
180         PutObjectOutcome PutObject(const PutObjectRequest& request) const;
181         DeleteObjectOutcome DeleteObject(const std::string& bucket, const std::string& key) const;
182         DeleteObjectOutcome DeleteObject(const DeleteObjectRequest& request) const;
183         DeleteObjecstOutcome DeleteObjects(const std::string bucket, const DeletedKeyList &keyList) const;
184         DeleteObjecstOutcome DeleteObjects(const DeleteObjectsRequest& request) const;
185         DeleteObjecVersionstOutcome DeleteObjectVersions(const std::string bucket, const ObjectIdentifierList &objectList) const;
186         DeleteObjecVersionstOutcome DeleteObjectVersions(const DeleteObjectVersionsRequest& request) const;
187         ObjectMetaDataOutcome HeadObject(const std::string& bucket, const std::string& key) const;
188         ObjectMetaDataOutcome HeadObject(const HeadObjectRequest& request) const;
189         ObjectMetaDataOutcome GetObjectMeta(const std::string& bucket, const std::string& key) const;
190         ObjectMetaDataOutcome GetObjectMeta(const GetObjectMetaRequest& request) const;
191         AppendObjectOutcome AppendObject(const AppendObjectRequest& request) const;
192         CopyObjectOutcome CopyObject(const CopyObjectRequest& request) const;
193         RestoreObjectOutcome RestoreObject(const std::string& bucket, const std::string& key) const;
194         RestoreObjectOutcome RestoreObject(const RestoreObjectRequest& request) const;
195         SetObjectAclOutcome SetObjectAcl(const SetObjectAclRequest& request) const;
196         GetObjectAclOutcome GetObjectAcl(const GetObjectAclRequest& request) const;
197         CreateSymlinkOutcome CreateSymlink(const CreateSymlinkRequest& request) const;
198         GetSymlinkOutcome GetSymlink(const GetSymlinkRequest& request) const;
199         GetObjectOutcome ProcessObject(const ProcessObjectRequest& request) const;
200 
201         GetObjectOutcome SelectObject(const SelectObjectRequest& request) const;
202         CreateSelectObjectMetaOutcome CreateSelectObjectMeta(const CreateSelectObjectMetaRequest& request) const;
203 
204         SetObjectTaggingOutcome SetObjectTagging(const SetObjectTaggingRequest& request) const;
205         DeleteObjectTaggingOutcome DeleteObjectTagging(const DeleteObjectTaggingRequest& request) const;
206         GetObjectTaggingOutcome GetObjectTagging(const GetObjectTaggingRequest& request) const;
207 
208         /*MultipartUpload*/
209         InitiateMultipartUploadOutcome InitiateMultipartUpload(const InitiateMultipartUploadRequest& request) const;
210         PutObjectOutcome UploadPart(const UploadPartRequest& request) const;
211         UploadPartCopyOutcome UploadPartCopy(const UploadPartCopyRequest& request) const;
212         CompleteMultipartUploadOutcome CompleteMultipartUpload(const CompleteMultipartUploadRequest& request) const;
213         VoidOutcome AbortMultipartUpload(const AbortMultipartUploadRequest& request) const;
214         ListMultipartUploadsOutcome ListMultipartUploads(const ListMultipartUploadsRequest& request) const;
215         ListPartsOutcome ListParts(const ListPartsRequest& request) const;
216 
217         /*Generate URL*/
218         StringOutcome GeneratePresignedUrl(const GeneratePresignedUrlRequest& request) const;
219         StringOutcome GeneratePresignedUrl(const std::string& bucket, const std::string& key) const;
220         StringOutcome GeneratePresignedUrl(const std::string& bucket, const std::string& key, int64_t expires) const;
221         StringOutcome GeneratePresignedUrl(const std::string& bucket, const std::string& key, int64_t expires, Http::Method method) const;
222         GetObjectOutcome GetObjectByUrl(const GetObjectByUrlRequest& request) const;
223         GetObjectOutcome GetObjectByUrl(const std::string& url) const;
224         GetObjectOutcome GetObjectByUrl(const std::string& url, const std::string& file) const;
225         PutObjectOutcome PutObjectByUrl(const PutObjectByUrlRequest& request) const;
226         PutObjectOutcome PutObjectByUrl(const std::string& url, const std::string& file) const;
227         PutObjectOutcome PutObjectByUrl(const std::string& url, const std::string& file, const ObjectMetaData& metaData) const;
228         PutObjectOutcome PutObjectByUrl(const std::string& url, const std::shared_ptr<std::iostream>& content) const;
229         PutObjectOutcome PutObjectByUrl(const std::string& url, const std::shared_ptr<std::iostream>& content, const ObjectMetaData& metaData) const;
230 
231         /*Generate Post Policy*/
232 
233         /*Resumable Operation*/
234 #if !defined(OSS_DISABLE_RESUAMABLE)
235         PutObjectOutcome ResumableUploadObject(const UploadObjectRequest& request) const;
236         CopyObjectOutcome ResumableCopyObject(const MultiCopyObjectRequest& request) const;
237         GetObjectOutcome ResumableDownloadObject(const DownloadObjectRequest& request) const;
238 #endif
239 
240 #if !defined(OSS_DISABLE_LIVECHANNEL)
241         /*Live Channel*/
242         VoidOutcome PutLiveChannelStatus(const PutLiveChannelStatusRequest& request) const;
243         PutLiveChannelOutcome PutLiveChannel(const PutLiveChannelRequest& request) const;
244         VoidOutcome PostVodPlaylist(const PostVodPlaylistRequest& request) const;
245         GetVodPlaylistOutcome GetVodPlaylist(const GetVodPlaylistRequest& request) const;
246         GetLiveChannelStatOutcome GetLiveChannelStat(const GetLiveChannelStatRequest& request) const;
247         GetLiveChannelInfoOutcome GetLiveChannelInfo(const GetLiveChannelInfoRequest& request) const;
248         GetLiveChannelHistoryOutcome GetLiveChannelHistory(const GetLiveChannelHistoryRequest& request) const;
249         ListLiveChannelOutcome ListLiveChannel(const ListLiveChannelRequest& request) const;
250         VoidOutcome DeleteLiveChannel(const DeleteLiveChannelRequest& request) const;
251         StringOutcome GenerateRTMPSignedUrl(const GenerateRTMPSignedUrlRequest& request) const;
252 #endif
253 
254         /*Aysnc APIs*/
255         void ListObjectsAsync(const ListObjectsRequest& request, const ListObjectAsyncHandler& handler, const std::shared_ptr<const AsyncCallerContext>& context = nullptr) const;
256         void GetObjectAsync(const GetObjectRequest& request, const GetObjectAsyncHandler& handler, const std::shared_ptr<const AsyncCallerContext>& context = nullptr) const;
257         void PutObjectAsync(const PutObjectRequest& request, const PutObjectAsyncHandler& handler, const std::shared_ptr<const AsyncCallerContext>& context = nullptr) const;
258         void UploadPartAsync(const UploadPartRequest& request, const UploadPartAsyncHandler& handler, const std::shared_ptr<const AsyncCallerContext>& context = nullptr) const;
259         void UploadPartCopyAsync(const UploadPartCopyRequest& request, const UploadPartCopyAsyncHandler& handler, const std::shared_ptr<const AsyncCallerContext>& context = nullptr) const;
260 
261         /*Callable APIs*/
262         ListObjectOutcomeCallable ListObjectsCallable(const ListObjectsRequest& request) const;
263         GetObjectOutcomeCallable GetObjectCallable(const GetObjectRequest& request) const;
264         PutObjectOutcomeCallable PutObjectCallable(const PutObjectRequest& request) const;
265         PutObjectOutcomeCallable UploadPartCallable(const UploadPartRequest& request) const;
266         UploadPartCopyOutcomeCallable UploadPartCopyCallable(const UploadPartCopyRequest& request) const;
267 
268         /*Extended APIs*/
269 #if !defined(OSS_DISABLE_BUCKET)
270         bool DoesBucketExist(const std::string& bucket) const;
271 #endif
272         bool DoesObjectExist(const std::string& bucket, const std::string& key) const;
273         CopyObjectOutcome ModifyObjectMeta(const std::string& bucket, const std::string& key, const ObjectMetaData& meta);
274 
275         /*Requests control*/
276         void DisableRequest();
277         void EnableRequest();
278     protected:
279         std::shared_ptr<OssClientImpl> client_;
280     };
281 }
282 }
283