commit 4950bb6b83fc18ebb4eb882244988c3de643ca29
parent 5dbbd6a82f89e5f1e6e72f097e63db6746c5b5d3
Author: cfillion <cfillion@users.noreply.github.com>
Date: Sat, 3 Jun 2017 23:26:59 -0400
task: only give the curl context to download tasks (refactoring)
Diffstat:
6 files changed, 27 insertions(+), 23 deletions(-)
diff --git a/src/archive.cpp b/src/archive.cpp
@@ -220,7 +220,7 @@ FileExtractor::FileExtractor(const Path &target, const ArchiveReaderPtr &reader)
setSummary("Extracting %s: " + target.join());
}
-void FileExtractor::run(DownloadContext *)
+void FileExtractor::run()
{
if(aborted()) {
finish(Aborted, {"cancelled", m_path.target().join()});
@@ -362,7 +362,7 @@ FileCompressor::FileCompressor(const Path &target, const ArchiveWriterPtr &write
setSummary("Compressing %s: " + target.join());
}
-void FileCompressor::run(DownloadContext *)
+void FileCompressor::run()
{
if(aborted()) {
finish(Aborted, {"cancelled", m_path.join()});
diff --git a/src/archive.hpp b/src/archive.hpp
@@ -65,7 +65,7 @@ public:
const TempPath &path() const { return m_path; }
bool concurrent() const override { return false; }
- void run(DownloadContext *) override;
+ void run() override;
private:
TempPath m_path;
@@ -77,7 +77,7 @@ public:
FileCompressor(const Path &target, const ArchiveWriterPtr &);
bool concurrent() const override { return false; }
- void run(DownloadContext *) override;
+ void run() override;
private:
Path m_path;
diff --git a/src/download.cpp b/src/download.cpp
@@ -104,7 +104,7 @@ int Download::UpdateProgress(void *ptr, const double, const double,
}
Download::Download(const string &url, const NetworkOpts &opts, const int flags)
- : m_url(url), m_opts(opts), m_flags(flags)
+ : m_url(url), m_opts(opts), m_flags(flags), m_ctx(nullptr)
{
}
@@ -120,7 +120,7 @@ void Download::start()
onFinish([thread] { delete thread; });
}
-void Download::run(DownloadContext *ctx)
+void Download::run()
{
if(aborted()) {
finish(Aborted, {"cancelled", m_url});
@@ -133,25 +133,25 @@ void Download::run(DownloadContext *ctx)
if(!stream)
return;
- curl_easy_setopt(ctx->m_curl, CURLOPT_URL, m_url.c_str());
- curl_easy_setopt(ctx->m_curl, CURLOPT_PROXY, m_opts.proxy.c_str());
- curl_easy_setopt(ctx->m_curl, CURLOPT_SSL_VERIFYPEER, m_opts.verifyPeer);
+ curl_easy_setopt(m_ctx->m_curl, CURLOPT_URL, m_url.c_str());
+ curl_easy_setopt(m_ctx->m_curl, CURLOPT_PROXY, m_opts.proxy.c_str());
+ curl_easy_setopt(m_ctx->m_curl, CURLOPT_SSL_VERIFYPEER, m_opts.verifyPeer);
- curl_easy_setopt(ctx->m_curl, CURLOPT_PROGRESSFUNCTION, UpdateProgress);
- curl_easy_setopt(ctx->m_curl, CURLOPT_PROGRESSDATA, this);
+ curl_easy_setopt(m_ctx->m_curl, CURLOPT_PROGRESSFUNCTION, UpdateProgress);
+ curl_easy_setopt(m_ctx->m_curl, CURLOPT_PROGRESSDATA, this);
- curl_easy_setopt(ctx->m_curl, CURLOPT_WRITEFUNCTION, WriteData);
- curl_easy_setopt(ctx->m_curl, CURLOPT_WRITEDATA, stream);
+ curl_easy_setopt(m_ctx->m_curl, CURLOPT_WRITEFUNCTION, WriteData);
+ curl_easy_setopt(m_ctx->m_curl, CURLOPT_WRITEDATA, stream);
curl_slist *headers = nullptr;
if(has(Download::NoCacheFlag))
headers = curl_slist_append(headers, "Cache-Control: no-cache");
- curl_easy_setopt(ctx->m_curl, CURLOPT_HTTPHEADER, headers);
+ curl_easy_setopt(m_ctx->m_curl, CURLOPT_HTTPHEADER, headers);
char errbuf[CURL_ERROR_SIZE] = "No error message";
- curl_easy_setopt(ctx->m_curl, CURLOPT_ERRORBUFFER, errbuf);
+ curl_easy_setopt(m_ctx->m_curl, CURLOPT_ERRORBUFFER, errbuf);
- const CURLcode res = curl_easy_perform(ctx->m_curl);
+ const CURLcode res = curl_easy_perform(m_ctx->m_curl);
closeStream();
if(aborted())
diff --git a/src/download.hpp b/src/download.hpp
@@ -47,12 +47,13 @@ public:
void setName(const std::string &);
const std::string &url() const { return m_url; }
+ void setContext(DownloadContext *ctx) { m_ctx = ctx; }
void start();
bool concurrent() const override { return true; }
- void run(DownloadContext *) override;
+ void run() override;
-private:
+protected:
virtual std::ostream *openStream() = 0;
virtual void closeStream() {}
@@ -64,6 +65,7 @@ private:
std::string m_url;
NetworkOpts m_opts;
int m_flags;
+ DownloadContext *m_ctx;
};
class MemoryDownload : public Download {
diff --git a/src/thread.cpp b/src/thread.cpp
@@ -86,8 +86,12 @@ DWORD WINAPI WorkerThread::run(void *ptr)
DownloadContext context;
while(!thread->m_exit) {
- while(ThreadTask *task = thread->nextTask())
- task->run(&context);
+ while(ThreadTask *task = thread->nextTask()) {
+ if(auto dl = dynamic_cast<Download *>(task))
+ dl->setContext(&context);
+
+ task->run();
+ }
ResetEvent(thread->m_wake);
WaitForSingleObject(thread->m_wake, INFINITE);
diff --git a/src/thread.hpp b/src/thread.hpp
@@ -35,8 +35,6 @@
#include <swell-types.h>
#endif
-struct DownloadContext;
-
class ThreadTask {
public:
enum State {
@@ -54,7 +52,7 @@ public:
virtual ~ThreadTask();
virtual bool concurrent() const = 0;
- virtual void run(DownloadContext *) = 0;
+ virtual void run() = 0;
const std::string &summary() const { return m_summary; }
void setState(State);