AWS SDK for C++

AWS SDK for C++ Version 1.11.748

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
153 bool validateChecksums = true;
154 };
155
162 class AWS_TRANSFER_API TransferManager : public std::enable_shared_from_this<TransferManager>
163 {
164 public:
168 static std::shared_ptr<TransferManager> Create(const TransferManagerConfiguration& config);
169
178 TransferStatus WaitUntilAllFinished(int64_t timeoutMs = std::numeric_limits<int64_t>::max());
179
184 void CancelAll();
185
187
195 std::shared_ptr<TransferHandle> UploadFile(const Aws::String& fileName, const Aws::String& bucketName,
196 const Aws::String& keyName, const Aws::String& contentType,
198 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr,
199 const Aws::String& precalculatedChecksum = {});
200
206 std::shared_ptr<TransferHandle> UploadFile(const std::shared_ptr<Aws::IOStream>& stream, const Aws::String& bucketName,
207 const Aws::String& keyName, const Aws::String& contentType,
209 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr,
210 const Aws::String& precalculatedChecksum = {});
211
215 std::shared_ptr<TransferHandle> DownloadFile(const Aws::String& bucketName,
216 const Aws::String& keyName,
217 const Aws::String& writeToFile,
218 const DownloadConfiguration& downloadConfig = DownloadConfiguration(),
219 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr);
223 std::shared_ptr<TransferHandle> DownloadFile(const Aws::String& bucketName,
224 const Aws::String& keyName,
225 CreateDownloadStreamCallback writeToStreamfn,
226 const DownloadConfiguration& downloadConfig = DownloadConfiguration(),
227 const Aws::String& writeToFile = "",
228 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr);
229
233 std::shared_ptr<TransferHandle> DownloadFile(const Aws::String& bucketName,
234 const Aws::String& keyName,
235 uint64_t fileOffset,
236 uint64_t downloadBytes,
237 CreateDownloadStreamCallback writeToStreamfn,
238 const DownloadConfiguration& downloadConfig = DownloadConfiguration(),
239 const Aws::String& writeToFile = "",
240 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr);
241
245 std::shared_ptr<TransferHandle> RetryDownload(const std::shared_ptr<TransferHandle>& retryHandle);
246
250 std::shared_ptr<TransferHandle> RetryUpload(const Aws::String& fileName, const std::shared_ptr<TransferHandle>& retryHandle);
254 std::shared_ptr<TransferHandle> RetryUpload(const std::shared_ptr<Aws::IOStream>& stream, const std::shared_ptr<TransferHandle>& retryHandle);
255
261 void AbortMultipartUpload(const std::shared_ptr<TransferHandle>& inProgressHandle);
262
272 void UploadDirectory(const Aws::String& directory, const Aws::String& bucketName, const Aws::String& prefix, const Aws::Map<Aws::String, Aws::String>& metadata);
273
283 void DownloadToDirectory(const Aws::String& directory, const Aws::String& bucketName, const Aws::String& prefix = Aws::String());
284
285 private:
290
295 std::shared_ptr<TransferHandle> CreateUploadFileHandle(Aws::IOStream* fileStream, const Aws::String& bucketName,
296 const Aws::String& keyName, const Aws::String& contentType,
298 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context,
299 const Aws::String& fileName = "", const Aws::String& checksum = "");
300
304 std::shared_ptr<TransferHandle> SubmitUpload(const std::shared_ptr<TransferHandle>& handle, const std::shared_ptr<Aws::IOStream>& fileStream = nullptr);
305
306 bool MultipartUploadSupported(uint64_t length) const;
307 bool InitializePartsForDownload(const std::shared_ptr<TransferHandle>& handle);
308
309 void DoMultiPartUpload(const std::shared_ptr<Aws::IOStream>& streamToPut, const std::shared_ptr<TransferHandle>& handle);
310 void DoSinglePartUpload(const std::shared_ptr<Aws::IOStream>& streamToPut, const std::shared_ptr<TransferHandle>& handle);
311
312 void DoMultiPartUpload(const std::shared_ptr<TransferHandle>& handle);
313 void DoSinglePartUpload(const std::shared_ptr<TransferHandle>& handle);
314
315 void DoDownload(const std::shared_ptr<TransferHandle>& handle);
316 void DoSinglePartDownload(const std::shared_ptr<TransferHandle>& handle);
317
318 void HandleGetObjectResponse(const Aws::S3::S3Client* client,
320 const Aws::S3::Model::GetObjectOutcome& outcome,
321 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context);
322
323 void WaitForCancellationAndAbortUpload(const std::shared_ptr<TransferHandle>& canceledHandle);
324 void HandleUploadPartResponse(const Aws::S3::S3Client*, const Aws::S3::Model::UploadPartRequest&, const Aws::S3::Model::UploadPartOutcome&, const std::shared_ptr<const Aws::Client::AsyncCallerContext>&);
325 void HandlePutObjectResponse(const Aws::S3::S3Client*, const Aws::S3::Model::PutObjectRequest&, const Aws::S3::Model::PutObjectOutcome&, const std::shared_ptr<const Aws::Client::AsyncCallerContext>&);
326 void HandleListObjectsResponse(const Aws::S3::S3Client*, const Aws::S3::Model::ListObjectsV2Request&, const Aws::S3::Model::ListObjectsV2Outcome&, const std::shared_ptr<const Aws::Client::AsyncCallerContext>&);
327
328 TransferStatus DetermineIfFailedOrCanceled(const TransferHandle&) const;
329 void TriggerUploadProgressCallback(const std::shared_ptr<const TransferHandle>&) const;
330 void TriggerDownloadProgressCallback(const std::shared_ptr<const TransferHandle>&) const;
331 void TriggerTransferStatusUpdatedCallback(const std::shared_ptr<const TransferHandle>&) const;
332 void TriggerErrorCallback(const std::shared_ptr<const TransferHandle>&, const Aws::Client::AWSError<Aws::S3::S3Errors>& error)const;
333
338 void AddTask(std::shared_ptr<TransferHandle> handle);
339 void RemoveTask(const std::shared_ptr<TransferHandle>& handle);
340
346 void SetChecksumForAlgorithm(const std::shared_ptr<PartState>& state, Aws::S3::Model::CompletedPart& part);
347
348 static Aws::String DetermineFilePath(const Aws::String& directory, const Aws::String& prefix, const Aws::String& keyName);
349
351 TransferManagerConfiguration m_transferConfig;
352
354 mutable std::condition_variable m_tasksSignal;
355 mutable std::mutex m_tasksMutex;
356
357 protected:
358 static bool IsWithinParentDirectory(Aws::String parentDirectory, Aws::String filePath);
359 };
360
361
362 }
363}
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)