mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 13:20:06 +00:00 
			
		
		
		
	Only emit download progress updates every 100ms
This commit is contained in:
		
							parent
							
								
									3ab05a1654
								
							
						
					
					
						commit
						6448826d60
					
				
					 1 changed files with 53 additions and 30 deletions
				
			
		|  | @ -105,21 +105,47 @@ void DownloadManager::Download( | ||||||
|             return; |             return; | ||||||
|          } |          } | ||||||
| 
 | 
 | ||||||
|  |          std::chrono::system_clock::time_point lastUpdated {}; | ||||||
|  |          cpr::cpr_off_t                        lastDownloadNow {}; | ||||||
|  |          cpr::cpr_off_t                        lastDownloadTotal {}; | ||||||
|  | 
 | ||||||
|          // Download file
 |          // Download file
 | ||||||
|          cpr::Response response = cpr::Get( |          cpr::Response response = | ||||||
|             cpr::Url {request->url()}, |             cpr::Get(cpr::Url {request->url()}, | ||||||
|                      cpr::ProgressCallback( |                      cpr::ProgressCallback( | ||||||
|                [=](cpr::cpr_off_t downloadTotal, |                         [&](cpr::cpr_off_t downloadTotal, | ||||||
|                             cpr::cpr_off_t downloadNow, |                             cpr::cpr_off_t downloadNow, | ||||||
|                             cpr::cpr_off_t /* uploadTotal */, |                             cpr::cpr_off_t /* uploadTotal */, | ||||||
|                             cpr::cpr_off_t /* uploadNow */, |                             cpr::cpr_off_t /* uploadNow */, | ||||||
|                             std::intptr_t /* userdata */) |                             std::intptr_t /* userdata */) | ||||||
|                         { |                         { | ||||||
|                   Q_EMIT request->ProgressUpdated(downloadNow, downloadTotal); |                            using namespace std::chrono_literals; | ||||||
|  | 
 | ||||||
|  |                            std::chrono::system_clock::time_point now = | ||||||
|  |                               std::chrono::system_clock::now(); | ||||||
|  | 
 | ||||||
|  |                            // Only emit an update every 100ms
 | ||||||
|  |                            if ((now > lastUpdated + 100ms || | ||||||
|  |                                 downloadNow == downloadTotal) && | ||||||
|  |                                (downloadNow != lastDownloadNow || | ||||||
|  |                                 downloadTotal != lastDownloadTotal)) | ||||||
|  |                            { | ||||||
|  |                               logger_->trace("Downloaded: {} / {}", | ||||||
|  |                                              downloadNow, | ||||||
|  |                                              downloadTotal); | ||||||
|  | 
 | ||||||
|  |                               Q_EMIT request->ProgressUpdated(downloadNow, | ||||||
|  |                                                               downloadTotal); | ||||||
|  | 
 | ||||||
|  |                               lastUpdated       = now; | ||||||
|  |                               lastDownloadNow   = downloadNow; | ||||||
|  |                               lastDownloadTotal = downloadTotal; | ||||||
|  |                            } | ||||||
|  | 
 | ||||||
|                            return !request->IsCanceled(); |                            return !request->IsCanceled(); | ||||||
|                         }), |                         }), | ||||||
|                      cpr::WriteCallback( |                      cpr::WriteCallback( | ||||||
|                [=, &ofs](std::string data, std::intptr_t /* userdata */) |                         [&](std::string data, std::intptr_t /* userdata */) | ||||||
|                         { |                         { | ||||||
|                            // Write file
 |                            // Write file
 | ||||||
|                            ofs << data; |                            ofs << data; | ||||||
|  | @ -138,14 +164,13 @@ void DownloadManager::Download( | ||||||
| 
 | 
 | ||||||
|             if (request->IsCanceled()) |             if (request->IsCanceled()) | ||||||
|             { |             { | ||||||
|                logger_->info("Download request cancelled: \"{}\"", |                logger_->info("Download request cancelled: {}", request->url()); | ||||||
|                              request->url()); |  | ||||||
| 
 | 
 | ||||||
|                reason = request::DownloadRequest::CompleteReason::Canceled; |                reason = request::DownloadRequest::CompleteReason::Canceled; | ||||||
|             } |             } | ||||||
|             else if (response.error.code != cpr::ErrorCode::OK) |             else if (response.error.code != cpr::ErrorCode::OK) | ||||||
|             { |             { | ||||||
|                logger_->error("Error downloading file ({}): \"{}\"", |                logger_->error("Error downloading file ({}): {}", | ||||||
|                               response.error.message, |                               response.error.message, | ||||||
|                               request->url()); |                               request->url()); | ||||||
| 
 | 
 | ||||||
|  | @ -153,8 +178,7 @@ void DownloadManager::Download( | ||||||
|             } |             } | ||||||
|             else if (!ofsGood) |             else if (!ofsGood) | ||||||
|             { |             { | ||||||
|                logger_->error("File I/O error: \"{}\"", |                logger_->error("File I/O error: {}", destinationPath.string()); | ||||||
|                               destinationPath.string()); |  | ||||||
| 
 | 
 | ||||||
|                reason = request::DownloadRequest::CompleteReason::IOError; |                reason = request::DownloadRequest::CompleteReason::IOError; | ||||||
|             } |             } | ||||||
|  | @ -162,7 +186,7 @@ void DownloadManager::Download( | ||||||
|             std::error_code error; |             std::error_code error; | ||||||
|             if (!std::filesystem::remove(destinationPath, error)) |             if (!std::filesystem::remove(destinationPath, error)) | ||||||
|             { |             { | ||||||
|                logger_->error("Unable to remove destination file: \"{}\", {}", |                logger_->error("Unable to remove destination file: {}, {}", | ||||||
|                               destinationPath.string(), |                               destinationPath.string(), | ||||||
|                               error.message()); |                               error.message()); | ||||||
|             } |             } | ||||||
|  | @ -182,8 +206,7 @@ void DownloadManager::Download( | ||||||
|                               std::ios_base::in | std::ios_base::binary}; |                               std::ios_base::in | std::ios_base::binary}; | ||||||
|             if (!is.is_open() || !is.good()) |             if (!is.is_open() || !is.good()) | ||||||
|             { |             { | ||||||
|                logger_->error( |                logger_->error("Unable to open destination file for reading: {}", | ||||||
|                   "Unable to open destination file for reading: \"{}\"", |  | ||||||
|                               destinationPath.string()); |                               destinationPath.string()); | ||||||
| 
 | 
 | ||||||
|                Q_EMIT request->RequestComplete( |                Q_EMIT request->RequestComplete( | ||||||
|  | @ -196,7 +219,7 @@ void DownloadManager::Download( | ||||||
|             std::vector<std::uint8_t> digest {}; |             std::vector<std::uint8_t> digest {}; | ||||||
|             if (!util::ComputeDigest(EVP_md5(), is, digest)) |             if (!util::ComputeDigest(EVP_md5(), is, digest)) | ||||||
|             { |             { | ||||||
|                logger_->error("Failed to compute MD5: \"{}\"", |                logger_->error("Failed to compute MD5: {}", | ||||||
|                               destinationPath.string()); |                               destinationPath.string()); | ||||||
| 
 | 
 | ||||||
|                Q_EMIT request->RequestComplete( |                Q_EMIT request->RequestComplete( | ||||||
|  | @ -227,7 +250,7 @@ void DownloadManager::Download( | ||||||
|             } |             } | ||||||
|          } |          } | ||||||
| 
 | 
 | ||||||
|          logger_->info("Download complete: \"{}\"", request->url()); |          logger_->info("Download complete: {}", request->url()); | ||||||
|          Q_EMIT request->RequestComplete( |          Q_EMIT request->RequestComplete( | ||||||
|             request::DownloadRequest::CompleteReason::OK); |             request::DownloadRequest::CompleteReason::OK); | ||||||
|       }); |       }); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat