PCM: reuse download prrogress dialog
This commit is contained in:
parent
250de83bf2
commit
78aa76d0e6
|
@ -100,7 +100,10 @@ void DIALOG_MANAGE_REPOSITORIES::OnAddButtonClicked( wxCommandEvent& event )
|
|||
}
|
||||
else
|
||||
{
|
||||
if( m_pcm->FetchRepository( url, repository ) )
|
||||
std::unique_ptr<WX_PROGRESS_REPORTER> reporter(
|
||||
new WX_PROGRESS_REPORTER( this, wxT( "" ), 1 ) );
|
||||
|
||||
if( m_pcm->FetchRepository( url, repository, reporter.get() ) )
|
||||
{
|
||||
wxString name = repository.name;
|
||||
int increment = 1;
|
||||
|
|
|
@ -494,7 +494,10 @@ void PANEL_PACKAGES_VIEW::OnDownloadVersionClicked( wxCommandEvent& event )
|
|||
|
||||
std::ofstream output( path.ToUTF8(), std::ios_base::binary );
|
||||
|
||||
bool success = m_pcm->DownloadToStream( url, &output, _( "Downloading package" ), 0 );
|
||||
std::unique_ptr<WX_PROGRESS_REPORTER> reporter(
|
||||
new WX_PROGRESS_REPORTER( this, _( "Downloading package" ), 1 ) );
|
||||
|
||||
bool success = m_pcm->DownloadToStream( url, &output, reporter.get(), 0 );
|
||||
|
||||
output.close();
|
||||
|
||||
|
|
|
@ -30,7 +30,6 @@
|
|||
#include "pgm_base.h"
|
||||
#include "picosha2.h"
|
||||
#include "settings/settings_manager.h"
|
||||
#include "widgets/wx_progress_reporters.h"
|
||||
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
|
@ -186,14 +185,11 @@ PLUGIN_CONTENT_MANAGER::PLUGIN_CONTENT_MANAGER( wxWindow* aParent ) : m_dialog(
|
|||
|
||||
|
||||
bool PLUGIN_CONTENT_MANAGER::DownloadToStream( const wxString& aUrl, std::ostream* aOutput,
|
||||
const wxString& aDialogTitle,
|
||||
WX_PROGRESS_REPORTER* aReporter,
|
||||
const size_t aSizeLimit )
|
||||
{
|
||||
bool size_exceeded = false;
|
||||
|
||||
std::unique_ptr<WX_PROGRESS_REPORTER> reporter(
|
||||
new WX_PROGRESS_REPORTER( m_dialog, aDialogTitle, 1 ) );
|
||||
|
||||
TRANSFER_CALLBACK callback = [&]( size_t dltotal, size_t dlnow, size_t ultotal, size_t ulnow )
|
||||
{
|
||||
if( aSizeLimit > 0 && ( dltotal > aSizeLimit || dlnow > aSizeLimit ) )
|
||||
|
@ -206,16 +202,16 @@ bool PLUGIN_CONTENT_MANAGER::DownloadToStream( const wxString& aUrl, std::ostrea
|
|||
|
||||
if( dltotal > 1024 )
|
||||
{
|
||||
reporter->SetCurrentProgress( dlnow / (double) dltotal );
|
||||
reporter->Report( wxString::Format( _( "Downloading %lld/%lld Kb" ), dlnow / 1024,
|
||||
aReporter->SetCurrentProgress( dlnow / (double) dltotal );
|
||||
aReporter->Report( wxString::Format( _( "Downloading %lld/%lld Kb" ), dlnow / 1024,
|
||||
dltotal / 1024 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
reporter->SetCurrentProgress( 0.0 );
|
||||
aReporter->SetCurrentProgress( 0.0 );
|
||||
}
|
||||
|
||||
return !reporter->KeepRefreshing();
|
||||
return !aReporter->KeepRefreshing();
|
||||
};
|
||||
|
||||
KICAD_CURL_EASY curl;
|
||||
|
@ -226,8 +222,8 @@ bool PLUGIN_CONTENT_MANAGER::DownloadToStream( const wxString& aUrl, std::ostrea
|
|||
|
||||
int code = curl.Perform();
|
||||
|
||||
if( !reporter->IsCancelled() )
|
||||
reporter->SetCurrentProgress( 1.0 );
|
||||
if( !aReporter->IsCancelled() )
|
||||
aReporter->SetCurrentProgress( 1.0 );
|
||||
|
||||
if( code != CURLE_OK )
|
||||
{
|
||||
|
@ -243,10 +239,14 @@ bool PLUGIN_CONTENT_MANAGER::DownloadToStream( const wxString& aUrl, std::ostrea
|
|||
}
|
||||
|
||||
|
||||
bool PLUGIN_CONTENT_MANAGER::FetchRepository( const wxString& aUrl, PCM_REPOSITORY& aRepository )
|
||||
bool PLUGIN_CONTENT_MANAGER::FetchRepository( const wxString& aUrl, PCM_REPOSITORY& aRepository,
|
||||
WX_PROGRESS_REPORTER* aReporter )
|
||||
{
|
||||
std::stringstream repository_stream;
|
||||
if( !DownloadToStream( aUrl, &repository_stream, _( "Fetching repository" ), 20480 ) )
|
||||
|
||||
aReporter->SetTitle( _( "Fetching repository" ) );
|
||||
|
||||
if( !DownloadToStream( aUrl, &repository_stream, aReporter, 20480 ) )
|
||||
{
|
||||
wxLogError( _( "Unable to load repository url" ) );
|
||||
return false;
|
||||
|
@ -282,11 +282,14 @@ void PLUGIN_CONTENT_MANAGER::ValidateJson( const nlohmann::json& aJson,
|
|||
|
||||
bool PLUGIN_CONTENT_MANAGER::fetchPackages( const wxString& aUrl,
|
||||
const boost::optional<wxString>& aHash,
|
||||
std::vector<PCM_PACKAGE>& aPackages )
|
||||
std::vector<PCM_PACKAGE>& aPackages,
|
||||
WX_PROGRESS_REPORTER* aReporter )
|
||||
{
|
||||
std::stringstream packages_stream;
|
||||
|
||||
if( !DownloadToStream( aUrl, &packages_stream, _( "Fetching repository packages" ) ) )
|
||||
aReporter->SetTitle( _( "Fetching repository packages" ) );
|
||||
|
||||
if( !DownloadToStream( aUrl, &packages_stream, aReporter ) )
|
||||
{
|
||||
wxLogError( _( "Unable to load repository packages url." ) );
|
||||
return false;
|
||||
|
@ -305,10 +308,7 @@ bool PLUGIN_CONTENT_MANAGER::fetchPackages( const wxString& aUr
|
|||
nlohmann::json packages_json = nlohmann::json::parse( packages_stream.str() );
|
||||
ValidateJson( packages_json, nlohmann::json_uri( "#/definitions/PackageArray" ) );
|
||||
|
||||
for( nlohmann::json& package : packages_json["packages"] )
|
||||
{
|
||||
aPackages.push_back( package.get<PCM_PACKAGE>() );
|
||||
}
|
||||
aPackages = packages_json["packages"].get<std::vector<PCM_PACKAGE>>();
|
||||
}
|
||||
catch( std::exception& e )
|
||||
{
|
||||
|
@ -362,7 +362,10 @@ const bool PLUGIN_CONTENT_MANAGER::CacheRepository( const wxString& aRepositoryI
|
|||
nlohmann::json js;
|
||||
PCM_REPOSITORY current_repo;
|
||||
|
||||
if( !FetchRepository( url, current_repo ) )
|
||||
std::unique_ptr<WX_PROGRESS_REPORTER> reporter(
|
||||
new WX_PROGRESS_REPORTER( m_dialog, wxT( "" ), 1 ) );
|
||||
|
||||
if( !FetchRepository( url, current_repo, reporter.get() ) )
|
||||
return false;
|
||||
|
||||
bool packages_cache_exists = false;
|
||||
|
@ -409,7 +412,7 @@ const bool PLUGIN_CONTENT_MANAGER::CacheRepository( const wxString& aRepositoryI
|
|||
{
|
||||
// Cache doesn't exist or is out of date
|
||||
if( !fetchPackages( current_repo.packages.url, current_repo.packages.sha256,
|
||||
current_repo.package_list ) )
|
||||
current_repo.package_list, reporter.get() ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -447,9 +450,11 @@ const bool PLUGIN_CONTENT_MANAGER::CacheRepository( const wxString& aRepositoryI
|
|||
std::ofstream resources_stream( resource_file.GetFullPath().ToUTF8(),
|
||||
std::ios_base::binary );
|
||||
|
||||
reporter->SetTitle( _( "Downloading resources" ) );
|
||||
|
||||
// 100 Mb resource file limit
|
||||
bool success = DownloadToStream( resources.url, &resources_stream,
|
||||
_( "Downloading resources" ), 100 * 1024 * 1024 );
|
||||
bool success = DownloadToStream( resources.url, &resources_stream, reporter.get(),
|
||||
100 * 1024 * 1024 );
|
||||
|
||||
resources_stream.close();
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
|
||||
#include "core/wx_stl_compat.h"
|
||||
#include "pcm_data.h"
|
||||
#include "widgets/wx_progress_reporters.h"
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <nlohmann/json-schema.hpp>
|
||||
|
@ -98,12 +99,14 @@ public:
|
|||
/**
|
||||
* @brief Fetches repository metadata from given url
|
||||
*
|
||||
* @param url URL of the repository
|
||||
* @param repository fetched repository metadata
|
||||
* @param aUrl URL of the repository
|
||||
* @param aRepository fetched repository metadata
|
||||
* @param aReporter progress reporter dialog to use for download
|
||||
* @return true if successful
|
||||
* @return false if URL could not be downloaded or result could not be parsed
|
||||
*/
|
||||
bool FetchRepository( const wxString& aUrl, PCM_REPOSITORY& aRepository );
|
||||
bool FetchRepository( const wxString& aUrl, PCM_REPOSITORY& aRepository,
|
||||
WX_PROGRESS_REPORTER* aReporter );
|
||||
|
||||
/**
|
||||
* @brief Validates json against a specific definition in the PCM schema
|
||||
|
@ -226,13 +229,13 @@ public:
|
|||
*
|
||||
* @param aUrl URL to download
|
||||
* @param aOutput output stream
|
||||
* @param aDialogTitle title of the spawned WX_PROGRESS_REPORTER dialog
|
||||
* @param aReporter progress dialog to use
|
||||
* @param aSizeLimit maximum download size, 0 for unlimited
|
||||
* @return true if download was successful
|
||||
* @return false if download failed or was too large
|
||||
*/
|
||||
bool DownloadToStream( const wxString& aUrl, std::ostream* aOutput,
|
||||
const wxString& aDialogTitle,
|
||||
WX_PROGRESS_REPORTER* aReporter,
|
||||
const size_t aSizeLimit = DEFAULT_DOWNLOAD_MEM_LIMIT );
|
||||
|
||||
/**
|
||||
|
@ -275,10 +278,11 @@ private:
|
|||
* @param aUrl URL of the packages metadata
|
||||
* @param aHash optional sha256 hash
|
||||
* @param aPackages resulting packages metadata list
|
||||
* @param aReporter progress dialog to use for download
|
||||
* @return true if packages were successfully downloaded, verified and parsed
|
||||
*/
|
||||
bool fetchPackages( const wxString& aUrl, const boost::optional<wxString>& aHash,
|
||||
std::vector<PCM_PACKAGE>& aPackages );
|
||||
std::vector<PCM_PACKAGE>& aPackages, WX_PROGRESS_REPORTER* aReporter );
|
||||
|
||||
/**
|
||||
* @brief Get the cached repository metadata
|
||||
|
|
Loading…
Reference in New Issue