Skip to content

Commit

Permalink
added download progress and download rate updates to status bar
Browse files Browse the repository at this point in the history
  • Loading branch information
paolo-projects committed Feb 15, 2022
1 parent 836d998 commit f1f82b0
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 16 deletions.
4 changes: 2 additions & 2 deletions include/network.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,14 @@ class Network
public:
Network();
~Network();
void setProgressCallback(std::function<void(float)> progressCallback);
void setProgressCallback(std::function<void(double, double, double, double)> progressCallback);
void curlDownload(const std::string& url, const std::string& fileName);
std::string curlGet(const std::string& url);
private:
static constexpr double mBytesProgressUpdateDelta = 0.1; // 0.1 MB
static constexpr long long updatePeriodMs = 200; // update every 100ms

std::function<void(float)> progressCallback = nullptr;
std::function<void(double, double, double, double)> progressCallback = nullptr;

NetworkProgress networkProgress = {};
static size_t write_data_file(char* ptr, size_t size, size_t nmemb, void* stream);
Expand Down
2 changes: 1 addition & 1 deletion include/unlocker_win.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

#include <stdio.h>

bool downloadTools(fs::path path, std::function<void(float)> progressCallback = nullptr);
bool downloadTools(fs::path path, std::function<void(double, double, double, double)> progressCallback = nullptr);
void copyTools(fs::path toolspath, fs::path copyTo);

void preparePatchWin(fs::path backupPath, fs::path vmInstallPath);
Expand Down
11 changes: 10 additions & 1 deletion include/win32/downloadtoolstask.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
#include <Windows.h>
#include <string>
#include <functional>
#include <chrono>

#include "win32/task.h"
#include "win32/patchresult.h"
#include "logging/streamlogstrategy.h"
Expand All @@ -24,12 +26,19 @@ class DownloadToolsTask : public Task<void, float, PatchResult>
PatchResult doInBackground(void* arg) override;
void onPostExecute(PatchResult result) override;
private:
static constexpr int PROG_PERIOD_MS = 200;

MainWindow& mainWindow;

std::function<void(PatchResult)> onCompleteCallback = nullptr;
std::function<void(float)> onProgressCallback = nullptr;

void downloadProgress(float progress);
void downloadProgress(double dltotal, double dlnow, double ultotal, double ulnow);

std::chrono::milliseconds lastProgressUpdate = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch()
);
double lastDlNow = 0.0;
};

#endif
11 changes: 10 additions & 1 deletion include/win32/patchertask.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
#include <Windows.h>
#include <string>
#include <functional>
#include <chrono>

#include "win32/task.h"
#include "win32/patchresult.h"
#include "logging/streamlogstrategy.h"
Expand All @@ -24,12 +26,19 @@ class PatcherTask : public Task<void, float, PatchResult>
PatchResult doInBackground(void* arg) override;
void onPostExecute(PatchResult result) override;
private:
static constexpr int PROG_PERIOD_MS = 200;

MainWindow& mainWindow;

std::function<void(PatchResult)> onCompleteCallback = nullptr;
std::function<void(float)> onProgressCallback = nullptr;

void downloadProgress(float progress);
std::chrono::milliseconds lastProgressUpdate = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch()
);
double lastDlNow = 0.0;

void downloadProgress(double dltotal, double dlnow, double ultotal, double ulnow);
};

#endif
4 changes: 2 additions & 2 deletions src/network.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Network::~Network() {
curl_global_cleanup();
}

void Network::setProgressCallback(std::function<void(float)> progressCallback)
void Network::setProgressCallback(std::function<void(double, double, double, double)> progressCallback)
{
this->progressCallback = progressCallback;
}
Expand Down Expand Up @@ -63,7 +63,7 @@ int Network::progress_callback(void* clientp, double dltotal, double dlnow, doub
int Network::progress_callback_external(void* clientp, double dltotal, double dlnow, double ultotal, double ulnow)
{
Network* instance = reinterpret_cast<Network*>(clientp);
instance->progressCallback(dlnow / dltotal);
instance->progressCallback(dltotal, dlnow, ultotal, ulnow);
return 0;
}

Expand Down
2 changes: 1 addition & 1 deletion src/unlocker_win.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ void copyTools(fs::path toolspath, fs::path copyTo)
}

// Download tools into "path"
bool downloadTools(fs::path path, std::function<void(float)> progressCallback)
bool downloadTools(fs::path path, std::function<void(double, double, double, double)> progressCallback)
{
Network network;

Expand Down
28 changes: 24 additions & 4 deletions src/win32/downloadtoolstask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,24 @@ void DownloadToolsTask::onProgressUpdate(float progress)
}
}

void DownloadToolsTask::downloadProgress(float progress)
void DownloadToolsTask::downloadProgress(double dltotal, double dlnow, double ultotal, double ulnow)
{
if (progress > 0.f && progress < 1.f) {
postProgress(progress);
static char statusBarProgress[1024];

using namespace std::chrono;
milliseconds tTime = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
long long tDelta = (tTime - lastProgressUpdate).count();

if (dltotal > 0 && tDelta > PROG_PERIOD_MS) {
double dlDelta = dlnow - lastDlNow;
float downloadPercent = dlnow / dltotal;

postProgress(downloadPercent);

sprintf(statusBarProgress, "Downloading: %.0f %%, %.3f MB/s", downloadPercent * 100, (dlDelta * 1000) / (tDelta * 1024 * 1024));
mainWindow.statusBar->setText(statusBarProgress);
lastProgressUpdate = tTime;
lastDlNow = dlnow;
}
}

Expand Down Expand Up @@ -59,8 +73,14 @@ PatchResult DownloadToolsTask::doInBackground(void* arg)
try {
postProgress(0.f);

lastProgressUpdate = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch()
);
lastDlNow = 0.0;

fs::path toolsdirectory = fs::path(mainWindow.toolsPathEditBox->getText());
downloadTools(toolsdirectory, std::bind(&DownloadToolsTask::downloadProgress, this, std::placeholders::_1));
downloadTools(toolsdirectory, std::bind(&DownloadToolsTask::downloadProgress, this, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3, std::placeholders::_4));

postProgress(1.f);

Expand Down
28 changes: 24 additions & 4 deletions src/win32/patchertask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,24 @@ void PatcherTask::onProgressUpdate(float progress)
}
}

void PatcherTask::downloadProgress(float progress)
void PatcherTask::downloadProgress(double dltotal, double dlnow, double ultotal, double ulnow)
{
if (progress > 0.f && progress < 1.f) {
postProgress(0.2 + progress * 0.6);
static char statusBarProgress[1024];

using namespace std::chrono;
milliseconds tTime = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
long long tDelta = (tTime - lastProgressUpdate).count();

if (dltotal > 0 && tDelta > PROG_PERIOD_MS) {
double dlDelta = dlnow - lastDlNow;
float downloadPercent = dlnow / dltotal;

postProgress(0.2f + downloadPercent * 0.6f);

sprintf(statusBarProgress, "Downloading: %.0f %%, %.3f MB/s", downloadPercent*100, (dlDelta*1000)/(tDelta*1024*1024));
mainWindow.statusBar->setText(statusBarProgress);
lastProgressUpdate = tTime;
lastDlNow = dlnow;
}
}

Expand Down Expand Up @@ -93,10 +107,16 @@ PatchResult PatcherTask::doInBackground(void* arg)
// Default output path is ./tools/
fs::path toolsdirectory = fs::path(".") / TOOLS_DOWNLOAD_FOLDER;

lastProgressUpdate = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch()
);
lastDlNow = 0.0;

if (mainWindow.downloadToolsChk->isChecked())
{
Logger::info("Downloading tools into \"" + toolsdirectory.string() + "\" directory...");
downloadTools(toolsdirectory, std::bind(&PatcherTask::downloadProgress, this, std::placeholders::_1));
downloadTools(toolsdirectory, std::bind(&PatcherTask::downloadProgress, this, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3, std::placeholders::_4));
}
else {
toolsdirectory = fs::path(mainWindow.toolsPathEditBox->getText());
Expand Down

0 comments on commit f1f82b0

Please sign in to comment.