mirror of
https://github.com/NixOS/nix.git
synced 2025-11-24 11:19:35 +01:00
libstore/filetransfer: Return an opaque handle from enqueueFileTransfer
This is necessary to make pausing/unpausing possible in a follow-up commit.
This commit is contained in:
parent
3f8474a62f
commit
ec0b270c6c
2 changed files with 29 additions and 7 deletions
|
|
@ -48,7 +48,7 @@ struct curlFileTransfer : public FileTransfer
|
|||
std::random_device rd;
|
||||
std::mt19937 mt19937;
|
||||
|
||||
struct TransferItem : public std::enable_shared_from_this<TransferItem>
|
||||
struct TransferItem : public std::enable_shared_from_this<TransferItem>, public FileTransfer::Item
|
||||
{
|
||||
curlFileTransfer & fileTransfer;
|
||||
FileTransferRequest request;
|
||||
|
|
@ -849,7 +849,7 @@ struct curlFileTransfer : public FileTransfer
|
|||
}
|
||||
}
|
||||
|
||||
void enqueueItem(ref<TransferItem> item)
|
||||
ItemHandle enqueueItem(ref<TransferItem> item)
|
||||
{
|
||||
if (item->request.data && item->request.uri.scheme() != "http" && item->request.uri.scheme() != "https"
|
||||
&& item->request.uri.scheme() != "s3")
|
||||
|
|
@ -864,19 +864,20 @@ struct curlFileTransfer : public FileTransfer
|
|||
#ifndef _WIN32 // TODO need graceful async exit support on Windows?
|
||||
writeFull(wakeupPipe.writeSide.get(), " ");
|
||||
#endif
|
||||
|
||||
return ItemHandle(static_cast<Item &>(*item));
|
||||
}
|
||||
|
||||
void enqueueFileTransfer(const FileTransferRequest & request, Callback<FileTransferResult> callback) override
|
||||
ItemHandle enqueueFileTransfer(const FileTransferRequest & request, Callback<FileTransferResult> callback) override
|
||||
{
|
||||
/* Handle s3:// URIs by converting to HTTPS and optionally adding auth */
|
||||
if (request.uri.scheme() == "s3") {
|
||||
auto modifiedRequest = request;
|
||||
modifiedRequest.setupForS3();
|
||||
enqueueItem(make_ref<TransferItem>(*this, std::move(modifiedRequest), std::move(callback)));
|
||||
return;
|
||||
return enqueueItem(make_ref<TransferItem>(*this, std::move(modifiedRequest), std::move(callback)));
|
||||
}
|
||||
|
||||
enqueueItem(make_ref<TransferItem>(*this, request, std::move(callback)));
|
||||
return enqueueItem(make_ref<TransferItem>(*this, request, std::move(callback)));
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -226,6 +226,26 @@ class Store;
|
|||
|
||||
struct FileTransfer
|
||||
{
|
||||
protected:
|
||||
class Item
|
||||
{};
|
||||
|
||||
public:
|
||||
/**
|
||||
* An opaque handle to the file transfer. Can be used to reference an in-flight transfer operations.
|
||||
*/
|
||||
class ItemHandle
|
||||
{
|
||||
std::reference_wrapper<Item> item;
|
||||
friend struct FileTransfer;
|
||||
|
||||
public:
|
||||
ItemHandle(Item & item)
|
||||
: item(item)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
virtual ~FileTransfer() {}
|
||||
|
||||
/**
|
||||
|
|
@ -233,7 +253,8 @@ struct FileTransfer
|
|||
* the download. The future may throw a FileTransferError
|
||||
* exception.
|
||||
*/
|
||||
virtual void enqueueFileTransfer(const FileTransferRequest & request, Callback<FileTransferResult> callback) = 0;
|
||||
virtual ItemHandle
|
||||
enqueueFileTransfer(const FileTransferRequest & request, Callback<FileTransferResult> callback) = 0;
|
||||
|
||||
std::future<FileTransferResult> enqueueFileTransfer(const FileTransferRequest & request);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue