diff options
Diffstat (limited to 'indra/viewer_components')
| -rw-r--r-- | indra/viewer_components/updater/llupdatedownloader.cpp | 44 | ||||
| -rw-r--r-- | indra/viewer_components/updater/llupdaterservice.h | 3 | 
2 files changed, 46 insertions, 1 deletions
| diff --git a/indra/viewer_components/updater/llupdatedownloader.cpp b/indra/viewer_components/updater/llupdatedownloader.cpp index c17a50e242..7b0f960ce4 100644 --- a/indra/viewer_components/updater/llupdatedownloader.cpp +++ b/indra/viewer_components/updater/llupdatedownloader.cpp @@ -29,6 +29,7 @@  #include <boost/lexical_cast.hpp>  #include <curl/curl.h>  #include "lldir.h" +#include "llevents.h"  #include "llfile.h"  #include "llmd5.h"  #include "llsd.h" @@ -49,6 +50,7 @@ public:  	bool isDownloading(void);  	size_t onHeader(void * header, size_t size);  	size_t onBody(void * header, size_t size); +	int onProgress(double downloadSize, double bytesDownloaded);  	void resume(void);  private: @@ -57,6 +59,7 @@ private:  	CURL * mCurl;  	LLSD mDownloadData;  	llofstream mDownloadStream; +	unsigned char mDownloadPercent;  	std::string mDownloadRecordPath;  	curl_slist * mHeaderList; @@ -149,6 +152,17 @@ namespace {  		size_t bytes = blockSize * blocks;  		return reinterpret_cast<LLUpdateDownloader::Implementation *>(downloader)->onHeader(data, bytes);  	} + + +	int progress_callback(void * downloader, +						  double dowloadTotal, +						  double downloadNow, +						  double uploadTotal, +						  double uploadNow) +	{ +		return reinterpret_cast<LLUpdateDownloader::Implementation *>(downloader)-> +			onProgress(dowloadTotal, downloadNow); +	}  } @@ -157,6 +171,7 @@ LLUpdateDownloader::Implementation::Implementation(LLUpdateDownloader::Client &  	mCancelled(false),  	mClient(client),  	mCurl(0), +	mDownloadPercent(0),  	mHeaderList(0)  {  	CURLcode code = curl_global_init(CURL_GLOBAL_ALL); // Just in case. @@ -290,6 +305,30 @@ size_t LLUpdateDownloader::Implementation::onBody(void * buffer, size_t size)  } +int LLUpdateDownloader::Implementation::onProgress(double downloadSize, double bytesDownloaded) +{ +	int downloadPercent = static_cast<int>(100. * (bytesDownloaded / downloadSize)); +	if(downloadPercent > mDownloadPercent) { +		mDownloadPercent = downloadPercent; +		 +		LLSD event; +		event["pump"] = LLUpdaterService::pumpName(); +		LLSD payload; +		payload["type"] = LLSD(LLUpdaterService::PROGRESS); +		payload["download_size"] = downloadSize; +		payload["bytes_downloaded"] = bytesDownloaded; +		event["payload"] = payload; +		LLEventPumps::instance().obtain("mainlooprepeater").post(event); +		 +		LL_INFOS("UpdateDownload") << "progress event " << payload << LL_ENDL; +	} else { +		; // Keep events to a reasonalbe number. +	} +	 +	return 0; +} + +  void LLUpdateDownloader::Implementation::run(void)  {  	CURLcode code = curl_easy_perform(mCurl); @@ -343,6 +382,11 @@ void LLUpdateDownloader::Implementation::initializeCurlGet(std::string const & u  	}  	throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_HTTPGET, true));  	throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_URL, url.c_str())); +	throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_PROGRESSFUNCTION, &progress_callback)); +	throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_PROGRESSDATA, this)); +	throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_NOPROGRESS, false)); +	 +	mDownloadPercent = 0;  } diff --git a/indra/viewer_components/updater/llupdaterservice.h b/indra/viewer_components/updater/llupdaterservice.h index 752a6f834b..1266bcae08 100644 --- a/indra/viewer_components/updater/llupdaterservice.h +++ b/indra/viewer_components/updater/llupdaterservice.h @@ -48,7 +48,8 @@ public:  		INVALID,  		DOWNLOAD_COMPLETE,  		DOWNLOAD_ERROR, -		INSTALL_ERROR +		INSTALL_ERROR, +		PROGRESS  	};  	LLUpdaterService(); | 
