reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

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:
Msrc/archive.cpp | 4++--
Msrc/archive.hpp | 4++--
Msrc/download.cpp | 24++++++++++++------------
Msrc/download.hpp | 6++++--
Msrc/thread.cpp | 8++++++--
Msrc/thread.hpp | 4+---
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);