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::random_device rd;
|
||||||
std::mt19937 mt19937;
|
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;
|
curlFileTransfer & fileTransfer;
|
||||||
FileTransferRequest request;
|
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"
|
if (item->request.data && item->request.uri.scheme() != "http" && item->request.uri.scheme() != "https"
|
||||||
&& item->request.uri.scheme() != "s3")
|
&& item->request.uri.scheme() != "s3")
|
||||||
|
|
@ -864,19 +864,20 @@ struct curlFileTransfer : public FileTransfer
|
||||||
#ifndef _WIN32 // TODO need graceful async exit support on Windows?
|
#ifndef _WIN32 // TODO need graceful async exit support on Windows?
|
||||||
writeFull(wakeupPipe.writeSide.get(), " ");
|
writeFull(wakeupPipe.writeSide.get(), " ");
|
||||||
#endif
|
#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 */
|
/* Handle s3:// URIs by converting to HTTPS and optionally adding auth */
|
||||||
if (request.uri.scheme() == "s3") {
|
if (request.uri.scheme() == "s3") {
|
||||||
auto modifiedRequest = request;
|
auto modifiedRequest = request;
|
||||||
modifiedRequest.setupForS3();
|
modifiedRequest.setupForS3();
|
||||||
enqueueItem(make_ref<TransferItem>(*this, std::move(modifiedRequest), std::move(callback)));
|
return enqueueItem(make_ref<TransferItem>(*this, std::move(modifiedRequest), std::move(callback)));
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
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() {}
|
virtual ~FileTransfer() {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -233,7 +253,8 @@ struct FileTransfer
|
||||||
* the download. The future may throw a FileTransferError
|
* the download. The future may throw a FileTransferError
|
||||||
* exception.
|
* 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);
|
std::future<FileTransferResult> enqueueFileTransfer(const FileTransferRequest & request);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue