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:
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;