AWS SDK for C++

AWS SDK for C++ Version 1.11.606

Loading...
Searching...
No Matches
TransferManager.h
1
6#pragma once
7
8#include <aws/transfer/TransferHandle.h>
9#include <aws/s3/S3Client.h>
10#include <aws/s3/model/PutObjectRequest.h>
11#include <aws/s3/model/GetObjectRequest.h>
12#include <aws/s3/model/HeadObjectRequest.h>
13#include <aws/s3/model/CreateMultipartUploadRequest.h>
14#include <aws/s3/model/UploadPartRequest.h>
15#include <aws/s3/model/CompletedPart.h>
16#include <aws/core/utils/threading/Executor.h>
17#include <aws/core/utils/memory/stl/AWSStreamFwd.h>
18#include <aws/core/utils/ResourceManager.h>
19#include <aws/core/client/AsyncCallerContext.h>
20
21#include <memory>
22
23namespace Aws
24{
25 namespace Transfer
26 {
27 class TransferManager;
28
29 typedef std::function<void(const TransferManager*, const std::shared_ptr<const TransferHandle>&)> UploadProgressCallback;
30 typedef std::function<void(const TransferManager*, const std::shared_ptr<const TransferHandle>&)> DownloadProgressCallback;
31 typedef std::function<void(const TransferManager*, const std::shared_ptr<const TransferHandle>&)> TransferStatusUpdatedCallback;
32 typedef std::function<void(const TransferManager*, const std::shared_ptr<const TransferHandle>&, const Aws::Client::AWSError<Aws::S3::S3Errors>&)> ErrorCallback;
33 typedef std::function<void(const TransferManager*, const std::shared_ptr<const TransferHandle>&)> TransferInitiatedCallback;
34
35 const uint64_t MB5 = 5 * 1024 * 1024;
36
41 {
43 : s3Client(nullptr),
44 transferExecutor(executor),
45 computeContentMD5(false),
48 {
49 }
53 std::shared_ptr<Aws::S3::S3Client> s3Client;
60
65 std::shared_ptr<Aws::Utils::Threading::Executor> spExecutor = nullptr;
66
70 std::function<std::shared_ptr<Utils::Threading::Executor>()> executorCreateFn;
71
76 bool computeContentMD5 = false;
112 uint64_t bufferSize = MB5;
113
141
146 Aws::S3::Model::ChecksumAlgorithm checksumAlgorithm = S3::Model::ChecksumAlgorithm::CRC64NVME;
147 };
148
155 class AWS_TRANSFER_API TransferManager : public std::enable_shared_from_this<TransferManager>
156 {
157 public:
161 static std::shared_ptr<TransferManager> Create(const TransferManagerConfiguration& config);
162
171 TransferStatus WaitUntilAllFinished(int64_t timeoutMs = std::numeric_limits<int64_t>::max());
172
177 void CancelAll();
178
180
188 std::shared_ptr<TransferHandle> UploadFile(const Aws::String& fileName, const Aws::String& bucketName,
189 const Aws::String& keyName, const Aws::String& contentType,
191 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr,
192 const Aws::String& precalculatedChecksum = {});
193
199 std::shared_ptr<TransferHandle> UploadFile(const std::shared_ptr<Aws::IOStream>& stream, const Aws::String& bucketName,
200 const Aws::String& keyName, const Aws::String& contentType,
202 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr,
203 const Aws::String& precalculatedChecksum = {});
204
208 std::shared_ptr<TransferHandle> DownloadFile(const Aws::String& bucketName,
209 const Aws::String& keyName,
210 const Aws::String& writeToFile,
211 const DownloadConfiguration& downloadConfig = DownloadConfiguration(),
212 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr);
216 std::shared_ptr<TransferHandle> DownloadFile(const Aws::String& bucketName,
217 const Aws::String& keyName,
218 CreateDownloadStreamCallback writeToStreamfn,
219 const DownloadConfiguration& downloadConfig = DownloadConfiguration(),
220 const Aws::String& writeToFile = "",
221 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr);
222
226 std::shared_ptr<TransferHandle> DownloadFile(const Aws::String& bucketName,
227 const Aws::String& keyName,
228 uint64_t fileOffset,
229 uint64_t downloadBytes,
230 CreateDownloadStreamCallback writeToStreamfn,
231 const DownloadConfiguration& downloadConfig = DownloadConfiguration(),
232 const Aws::String& writeToFile = "",
233 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr);
234
238 std::shared_ptr<TransferHandle> RetryDownload(const std::shared_ptr<TransferHandle>& retryHandle);
239
243 std::shared_ptr<TransferHandle> RetryUpload(const Aws::String& fileName, const std::shared_ptr<TransferHandle>& retryHandle);
247 std::shared_ptr<TransferHandle> RetryUpload(const std::shared_ptr<Aws::IOStream>& stream, const std::shared_ptr<TransferHandle>& retryHandle);
248
254 void AbortMultipartUpload(const std::shared_ptr<TransferHandle>& inProgressHandle);
255
265 void UploadDirectory(const Aws::String& directory, const Aws::String& bucketName, const Aws::String& prefix, const Aws::Map<Aws::String, Aws::String>& metadata);
266
276 void DownloadToDirectory(const Aws::String& directory, const Aws::String& bucketName, const Aws::String& prefix = Aws::String());
277
278 private:
283
288 std::shared_ptr<TransferHandle> CreateUploadFileHandle(Aws::IOStream* fileStream, const Aws::String& bucketName,
289 const Aws::String& keyName, const Aws::String& contentType,
291 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context,
292 const Aws::String& fileName = "", const Aws::String& checksum = "");
293
297 std::shared_ptr<TransferHandle> SubmitUpload(const std::shared_ptr<TransferHandle>& handle, const std::shared_ptr<Aws::IOStream>& fileStream = nullptr);
298
299 bool MultipartUploadSupported(uint64_t length) const;
300 bool InitializePartsForDownload(const std::shared_ptr<TransferHandle>& handle);
301
302 void DoMultiPartUpload(const std::shared_ptr<Aws::IOStream>& streamToPut, const std::shared_ptr<TransferHandle>& handle);
303 void DoSinglePartUpload(const std::shared_ptr<Aws::IOStream>& streamToPut, const std::shared_ptr<TransferHandle>& handle);
304
305 void DoMultiPartUpload(const std::shared_ptr<TransferHandle>& handle);
306 void DoSinglePartUpload(const std::shared_ptr<TransferHandle>& handle);
307
308 void DoDownload(const std::shared_ptr<TransferHandle>& handle);
309 void DoSinglePartDownload(const std::shared_ptr<TransferHandle>& handle);
310
311 void HandleGetObjectResponse(const Aws::S3::S3Client* client,
313 const Aws::S3::Model::GetObjectOutcome& outcome,
314 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context);
315
316 void WaitForCancellationAndAbortUpload(const std::shared_ptr<TransferHandle>& canceledHandle);
317 void HandleUploadPartResponse(const Aws::S3::S3Client*, const Aws::S3::Model::UploadPartRequest&, const Aws::S3::Model::UploadPartOutcome&, const std::shared_ptr<const Aws::Client::AsyncCallerContext>&);
318 void HandlePutObjectResponse(const Aws::S3::S3Client*, const Aws::S3::Model::PutObjectRequest&, const Aws::S3::Model::PutObjectOutcome&, const std::shared_ptr<const Aws::Client::AsyncCallerContext>&);
319 void HandleListObjectsResponse(const Aws::S3::S3Client*, const Aws::S3::Model::ListObjectsV2Request&, const Aws::S3::Model::ListObjectsV2Outcome&, const std::shared_ptr<const Aws::Client::AsyncCallerContext>&);
320
321 TransferStatus DetermineIfFailedOrCanceled(const TransferHandle&) const;
322 void TriggerUploadProgressCallback(const std::shared_ptr<const TransferHandle>&) const;
323 void TriggerDownloadProgressCallback(const std::shared_ptr<const TransferHandle>&) const;
324 void TriggerTransferStatusUpdatedCallback(const std::shared_ptr<const TransferHandle>&) const;
325 void TriggerErrorCallback(const std::shared_ptr<const TransferHandle>&, const Aws::Client::AWSError<Aws::S3::S3Errors>& error)const;
326
331 void AddTask(std::shared_ptr<TransferHandle> handle);
332 void RemoveTask(const std::shared_ptr<TransferHandle>& handle);
333
339 void SetChecksumForAlgorithm(const std::shared_ptr<PartState>& state, Aws::S3::Model::CompletedPart& part);
340
341 static Aws::String DetermineFilePath(const Aws::String& directory, const Aws::String& prefix, const Aws::String& keyName);
342
344 TransferManagerConfiguration m_transferConfig;
345
347 mutable std::condition_variable m_tasksSignal;
348 mutable std::mutex m_tasksMutex;
349
350 protected:
351 static bool IsWithinParentDirectory(Aws::String parentDirectory, Aws::String filePath);
352 };
353
354
355 }
356}
TransferStatus WaitUntilAllFinished(int64_t timeoutMs=std::numeric_limits< int64_t >::max())
std::shared_ptr< TransferHandle > DownloadFile(const Aws::String &bucketName, const Aws::String &keyName, const Aws::String &writeToFile, const DownloadConfiguration &downloadConfig=DownloadConfiguration(), const std::shared_ptr< const Aws::Client::AsyncCallerContext > &context=nullptr)
void UploadDirectory(const Aws::String &directory, const Aws::String &bucketName, const Aws::String &prefix, const Aws::Map< Aws::String, Aws::String > &metadata)
std::shared_ptr< TransferHandle > UploadFile(const Aws::String &fileName, const Aws::String &bucketName, const Aws::String &keyName, const Aws::String &contentType, const Aws::Map< Aws::String, Aws::String > &metadata, const std::shared_ptr< const Aws::Client::AsyncCallerContext > &context=nullptr, const Aws::String &precalculatedChecksum={})
std::shared_ptr< TransferHandle > DownloadFile(const Aws::String &bucketName, const Aws::String &keyName, uint64_t fileOffset, uint64_t downloadBytes, CreateDownloadStreamCallback writeToStreamfn, const DownloadConfiguration &downloadConfig=DownloadConfiguration(), const Aws::String &writeToFile="", const std::shared_ptr< const Aws::Client::AsyncCallerContext > &context=nullptr)
std::shared_ptr< TransferHandle > RetryUpload(const Aws::String &fileName, const std::shared_ptr< TransferHandle > &retryHandle)
std::shared_ptr< TransferHandle > DownloadFile(const Aws::String &bucketName, const Aws::String &keyName, CreateDownloadStreamCallback writeToStreamfn, const DownloadConfiguration &downloadConfig=DownloadConfiguration(), const Aws::String &writeToFile="", const std::shared_ptr< const Aws::Client::AsyncCallerContext > &context=nullptr)
std::shared_ptr< TransferHandle > RetryUpload(const std::shared_ptr< Aws::IOStream > &stream, const std::shared_ptr< TransferHandle > &retryHandle)
std::shared_ptr< TransferHandle > RetryDownload(const std::shared_ptr< TransferHandle > &retryHandle)
void AbortMultipartUpload(const std::shared_ptr< TransferHandle > &inProgressHandle)
static bool IsWithinParentDirectory(Aws::String parentDirectory, Aws::String filePath)
std::shared_ptr< TransferHandle > UploadFile(const std::shared_ptr< Aws::IOStream > &stream, const Aws::String &bucketName, const Aws::String &keyName, const Aws::String &contentType, const Aws::Map< Aws::String, Aws::String > &metadata, const std::shared_ptr< const Aws::Client::AsyncCallerContext > &context=nullptr, const Aws::String &precalculatedChecksum={})
static std::shared_ptr< TransferManager > Create(const TransferManagerConfiguration &config)
void DownloadToDirectory(const Aws::String &directory, const Aws::String &bucketName, const Aws::String &prefix=Aws::String())
std::function< void(const TransferManager *, const std::shared_ptr< const TransferHandle > &, const Aws::Client::AWSError< Aws::S3::S3Errors > &)> ErrorCallback
const uint64_t MB5
std::function< void(const TransferManager *, const std::shared_ptr< const TransferHandle > &)> TransferStatusUpdatedCallback
std::function< void(const TransferManager *, const std::shared_ptr< const TransferHandle > &)> DownloadProgressCallback
std::function< void(const TransferManager *, const std::shared_ptr< const TransferHandle > &)> UploadProgressCallback
std::function< void(const TransferManager *, const std::shared_ptr< const TransferHandle > &)> TransferInitiatedCallback
std::function< Aws::IOStream *(void)> CreateDownloadStreamCallback
std::map< K, V, std::less< K >, Aws::Allocator< std::pair< const K, V > > > Map
std::basic_iostream< char, std::char_traits< char > > IOStream
std::unordered_set< T, std::hash< T >, std::equal_to< T >, Aws::Allocator< T > > UnorderedSet
std::basic_string< char, std::char_traits< char >, Aws::Allocator< char > > String
Aws::S3::Model::CreateMultipartUploadRequest createMultipartUploadTemplate
Aws::Utils::Threading::Executor * transferExecutor
Aws::S3::Model::GetObjectRequest getObjectTemplate
std::shared_ptr< Aws::S3::S3Client > s3Client
DownloadProgressCallback downloadProgressCallback
TransferStatusUpdatedCallback transferStatusUpdatedCallback
Aws::S3::Model::ChecksumAlgorithm checksumAlgorithm
Aws::Map< Aws::String, Aws::String > customizedAccessLogTag
Aws::S3::Model::UploadPartRequest uploadPartTemplate
std::function< std::shared_ptr< Utils::Threading::Executor >()> executorCreateFn
std::shared_ptr< Aws::Utils::Threading::Executor > spExecutor
TransferInitiatedCallback transferInitiatedCallback
Aws::S3::Model::HeadObjectRequest headObjectTemplate
Aws::S3::Model::PutObjectRequest putObjectTemplate
TransferManagerConfiguration(Aws::Utils::Threading::Executor *executor)