reapack

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

commit 66e4371564af3b7afae1f32b8799621a8cd5b4f9
parent 54246f5cafdb86a9c7f0c414f817286e71b8c09a
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Tue,  1 Dec 2015 19:55:50 -0500

refactor the download queue code

Diffstat:
Msrc/download.cpp | 30++++++++++++++++++++++++++++++
Msrc/download.hpp | 13++++++++++++-
Msrc/reapack.cpp | 31+------------------------------
Msrc/reapack.hpp | 6+-----
4 files changed, 44 insertions(+), 36 deletions(-)

diff --git a/src/download.cpp b/src/download.cpp @@ -205,3 +205,33 @@ void Download::abort() m_aborted = true; } + +DownloadQueue::~DownloadQueue() +{ + while(!m_queue.empty()) { + Download *download = m_queue.front(); + download->stop(); + // delete called in the stop callback + + m_queue.pop(); + } +} + +void DownloadQueue::push(const char *url, DownloadCallback cb) +{ + Download *download = new Download(url); + download->addCallback(cb); + + download->addCallback([=](const int, const string &) { + m_queue.pop(); + delete download; + + if(!m_queue.empty()) + m_queue.front()->start(); + }); + + m_queue.push(download); + + if(m_queue.size() == 1) + download->start(); +} diff --git a/src/download.hpp b/src/download.hpp @@ -2,8 +2,9 @@ #define REAPACK_DOWNLOAD_HPP #include <functional> -#include <vector> +#include <queue> #include <string> +#include <vector> #include <WDL/mutex.h> @@ -56,4 +57,14 @@ private: WDL_Mutex m_mutex; }; +class DownloadQueue { +public: + ~DownloadQueue(); + + void push(const char *, DownloadCallback); + +private: + std::queue<Download *> m_queue; +}; + #endif diff --git a/src/reapack.cpp b/src/reapack.cpp @@ -16,17 +16,6 @@ void ReaPack::init(REAPER_PLUGIN_HINSTANCE instance, reaper_plugin_info_t *rec) m_resourcePath = GetResourcePath(); } -ReaPack::~ReaPack() -{ - while(!m_downloadQueue.empty()) { - Download *download = m_downloadQueue.front(); - download->stop(); - // delete in the stop callback - - m_downloadQueue.pop(); - } -} - void ReaPack::setupAction(const char *name, const char *desc, gaccel_register_t *action, ActionCallback callback) { @@ -65,7 +54,7 @@ void ReaPack::installPackage(PackagePtr pkg) { const char *url = pkg->lastVersion()->source(0)->url().c_str(); - queuedDownload(url, [=](const int status, const string &contents) { + m_downloadQueue.push(url, [=](const int status, const string &contents) { if(status != 200) { ShowMessageBox(contents.c_str(), "Download failure (debug)", 0); return; @@ -86,21 +75,3 @@ void ReaPack::installPackage(PackagePtr pkg) file.close(); }); } - -void ReaPack::queuedDownload(const char *url, DownloadCallback cb) -{ - Download *download = new Download(url); - download->addCallback(cb); - download->addCallback([=](const int, const string &) { - m_downloadQueue.pop(); - delete download; - - if(!m_downloadQueue.empty()) - m_downloadQueue.front()->start(); - }); - - m_downloadQueue.push(download); - - if(m_downloadQueue.size() == 1) - download->start(); -} diff --git a/src/reapack.hpp b/src/reapack.hpp @@ -3,7 +3,6 @@ #include <functional> #include <map> -#include <queue> #include "database.hpp" #include "download.hpp" @@ -14,8 +13,6 @@ typedef std::function<void()> ActionCallback; class ReaPack { public: - ~ReaPack(); - gaccel_register_t action; void init(REAPER_PLUGIN_HINSTANCE, reaper_plugin_info_t *); @@ -26,12 +23,11 @@ public: void synchronize(); void installPackage(PackagePtr pkg); - void queuedDownload(const char *url, DownloadCallback cb); private: std::map<int, ActionCallback> m_actions; DatabasePtr m_database; - std::queue<Download *> m_downloadQueue; + DownloadQueue m_downloadQueue; REAPER_PLUGIN_HINSTANCE m_instance; reaper_plugin_info_t *m_rec;