reapack

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

commit 015a50dc0c4ec96acd1f87c69693521dc28c08c5
parent 26bfba123b83717c841178d658a63c51c6afe2b1
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Sat, 13 Feb 2016 02:35:22 -0500

keep track of the download progress and abort downloads almost immediately

Diffstat:
Msrc/download.cpp | 39+++++++++++++++++++++++++++++++++++++++
Msrc/download.hpp | 4++++
Msrc/import.cpp | 13++-----------
Msrc/import.hpp | 1-
Msrc/resource.hpp | 1-
Msrc/resource.rc | 2+-
6 files changed, 46 insertions(+), 14 deletions(-)

diff --git a/src/download.cpp b/src/download.cpp @@ -56,6 +56,7 @@ void Download::reset() m_state = Idle; m_aborted = false; m_contents.clear(); + m_progress = 0; } void Download::wait() @@ -115,8 +116,11 @@ DWORD WINAPI Download::Worker(void *ptr) curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5); curl_easy_setopt(curl, CURLOPT_HEADER, true); + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &contents); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteData); + curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, download); + curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, UpdateProgress); const CURLcode res = curl_easy_perform(curl); @@ -171,6 +175,27 @@ size_t Download::WriteData(char *ptr, size_t rawsize, size_t nmemb, void *data) return size; } +int Download::UpdateProgress(void *ptr, const double dltotal, const double dlnow, + const double ultotal, const double ulnow) +{ + Download *dl = static_cast<Download *>(ptr); + + if(dl->isAborted()) + return 1; + + short progress; + const double total = ultotal + dltotal; + + if(total > 0) + progress = (short)(ulnow + dlnow / total) * 100; + else + progress = 10; + + dl->setProgress(min(progress, (short)100)); + + return 0; +} + void Download::RegisterStart() { WDL_MutexLock lock(&s_mutex); @@ -206,6 +231,13 @@ Download *Download::NextFinished() return dl; } +void Download::setProgress(const short percent) +{ + WDL_MutexLock lock(&m_mutex); + + m_progress = percent; +} + void Download::finish(const State state, const string &contents) { // called from the worker thread @@ -250,6 +282,13 @@ bool Download::isAborted() return m_aborted; } +short Download::progress() +{ + WDL_MutexLock lock(&m_mutex); + + return m_progress; +} + void Download::abort() { WDL_MutexLock lock(&m_mutex); diff --git a/src/download.hpp b/src/download.hpp @@ -53,6 +53,7 @@ public: State state(); const std::string &contents(); bool isAborted(); + short progress(); void onStart(const Callback &callback) { m_onStart.connect(callback); } void onFinish(const Callback &callback) { m_onFinish.connect(callback); } @@ -72,8 +73,10 @@ private: static void TimerTick(); static size_t WriteData(char *, size_t, size_t, void *); + static int UpdateProgress(void *, double, double, double, double); static DWORD WINAPI Worker(void *ptr); + void setProgress(short); void finish(const State state, const std::string &contents); void finishInMainThread(); void reset(); @@ -87,6 +90,7 @@ private: State m_state; bool m_aborted; std::string m_contents; + short m_progress; Signal m_onStart; Signal m_onFinish; diff --git a/src/import.cpp b/src/import.cpp @@ -53,10 +53,6 @@ void Import::onInit() m_ok = getControl(IDOK); hide(m_progress); - -#ifdef PBM_SETMARQUEE - SendMessage(m_progress, PBM_SETMARQUEE, 1, 0); -#endif } void Import::onCommand(const int id) @@ -79,10 +75,8 @@ void Import::onCommand(const int id) void Import::onTimer(int) { -#ifndef PBM_SETMARQUEE - m_fakePos = (m_fakePos + 1) % 100; - SendMessage(m_progress, PBM_SETPOS, m_fakePos, 0); -#endif + if(m_download) + SendMessage(m_progress, PBM_SETPOS, m_download->progress(), 0); } void Import::browseFile() @@ -192,13 +186,10 @@ void Import::setWaiting(const bool wait) setVisible(wait, m_progress); setEnabled(!wait, m_url); -#ifndef PBM_SETMARQUEE if(wait) startTimer(42, 1); else stopTimer(1); - m_fakePos = 0; SendMessage(m_progress, PBM_SETPOS, 0, 0); -#endif } diff --git a/src/import.hpp b/src/import.hpp @@ -48,7 +48,6 @@ private: ReaPack *m_reapack; Download *m_download; - short m_fakePos; HWND m_url; HWND m_file; diff --git a/src/resource.hpp b/src/resource.hpp @@ -25,7 +25,6 @@ #define PROGRESS_CLASS "msctls_progress32" #define WC_LISTVIEW "SysListView32" #define WC_TABCONTROL "SysTabControl32" -#define PBS_MARQUEE 0 #endif #define DIALOG_STYLE \ diff --git a/src/resource.rc b/src/resource.rc @@ -73,7 +73,7 @@ BEGIN RTEXT "From a file:", IDC_LABEL3, 5, 48, 50, 10 EDITTEXT IDC_FILE, 60, 44, 177, 14, ES_AUTOHSCROLL PUSHBUTTON "&Browse...", IDC_BROWSE, 240, 44, 40, 14 - CONTROL "", IDC_PROGRESS, PROGRESS_CLASS, PBS_MARQUEE, 10, 74, 150, 5 + CONTROL "", IDC_PROGRESS, PROGRESS_CLASS, 0x0, 10, 74, 150, 5 DEFPUSHBUTTON "&OK", IDOK, 200, 70, 40, 14 PUSHBUTTON "&Cancel", IDCANCEL, 244, 70, 40, 14 END