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