47#include <wx/translation.h> 
   48#include <wx/notifmsg.h> 
   73    wxString release_date;
 
   75    wxString downloads_url;
 
 
   81#define UPDATE_QUERY_ENDPOINT wxS( "https://downloads.kicad.org/api/v1/update" ) 
 
  104                                  const size_t aSizeLimit )
 
  106    bool size_exceeded = 
false;
 
  108    TRANSFER_CALLBACK callback = [&]( 
size_t dltotal, 
size_t dlnow, 
size_t ultotal, 
size_t ulnow )
 
  110        if( aSizeLimit > 0 && ( dltotal > aSizeLimit || dlnow > aSizeLimit ) )
 
  112            size_exceeded = 
true;
 
  123                aReporter->
Report( wxString::Format( 
_( 
"Downloading %lld/%lld kB" ), dlnow / 1000,
 
  139    curl.
SetHeader( 
"Accept", 
"application/json" );
 
  140    curl.
SetHeader( 
"Content-Type", 
"application/json" );
 
  143    curl.
SetURL( aUrl.ToUTF8().data() );
 
  153    if( code != CURLE_OK )
 
  157            if( code == CURLE_ABORTED_BY_CALLBACK && size_exceeded )
 
  158                aReporter->
Report( 
_( 
"Download is too large." ) );
 
  159            else if( code != CURLE_ABORTED_BY_CALLBACK )
 
 
  179    auto update_check = [aNoticeParent, 
this]() -> 
void 
  183        std::stringstream update_json_stream;
 
  184        std::stringstream request_json_stream;
 
  187        reporter->SetNumPhases( 1 );
 
  188        reporter->Report( 
_( 
"Requesting update info" ) );
 
  194#if defined( __WXMSW__ ) 
  195        requestContent.
platform = 
"windows";
 
  197    #if defined( KICAD_BUILD_ARCH_X64 ) 
  198        requestContent.
arch = 
"amd64";
 
  199    #elif defined( KICAD_BUILD_ARCH_X86 ) 
  200        requestContent.
arch = 
"i686";
 
  201    #elif defined( KICAD_BUILD_ARCH_ARM ) 
  202        requestContent.
arch = 
"arm";
 
  203    #elif defined( KICAD_BUILD_ARCH_ARM64 ) 
  204        requestContent.
arch = 
"arm64";
 
  206#elif defined( __WXOSX__ ) 
  208        requestContent.
arch = 
"unified";
 
  212        requestContent.
arch = 
"";
 
  215        verString.Replace( 
"~", 
"-" ); 
 
  223        nlohmann::json requestJson = nlohmann::json( requestContent );
 
  224        request_json_stream << requestJson;
 
  226        int responseCode = 
PostRequest( aUrl, request_json_stream.str(), &update_json_stream,
 
  227                                        reporter.get(), 20480 );
 
  231        if( responseCode == 200 )
 
  233            nlohmann::json  update_json;
 
  234            UPDATE_RESPONSE response;
 
  238                update_json_stream >> update_json;
 
  239                response = update_json.get<UPDATE_RESPONSE>();
 
  243                    aNoticeParent->CallAfter(
 
  244                            [aNoticeParent, response]()
 
  248                                                                        response.details_url,
 
  249                                                                        response.downloads_url );
 
  251                                int retCode = notice->ShowModal();
 
  253                                if( retCode != wxID_RETRY )
 
  258                                        cfg->m_lastReceivedUpdate = response.version;
 
  263            catch( 
const std::exception& e )
 
  265                wxLogError( wxString::Format( 
_( 
"Unable to parse update response: %s" ), e.what() ) );
 
 
wxString GetSemanticVersion()
Get the semantic version string for KiCad defined inside the KiCadVersion.cmake file in the variable ...
 
std::shared_ptr< BACKGROUND_JOB > Create(const wxString &aName)
Creates a background job with the given name.
 
void Remove(std::shared_ptr< BACKGROUND_JOB > job)
Removes the given background job from any lists and frees it.
 
int Perform()
Equivalent to curl_easy_perform.
 
bool SetPostFields(const std::vector< std::pair< std::string, std::string > > &aFields)
Set fields for application/x-www-form-urlencoded POST request.
 
int GetResponseStatusCode()
 
void SetHeader(const std::string &aName, const std::string &aValue)
Set an arbitrary header for the HTTP(s) request.
 
bool SetTransferCallback(const TRANSFER_CALLBACK &aCallback, size_t aInterval)
 
bool SetURL(const std::string &aURL)
Set the request URL.
 
bool SetFollowRedirects(bool aFollow)
Enable the following of HTTP(s) and other redirects, by default curl does not follow redirects.
 
bool SetOutputStream(const std::ostream *aOutput)
 
const std::string GetErrorText(int aCode)
Fetch CURL's "friendly" error string for a given error code.
 
wxString m_lastUpdateCheckTime
 
wxString m_lastReceivedUpdate
 
virtual BACKGROUND_JOBS_MONITOR & GetBackgroundJobMonitor() const
 
virtual wxString GetLanguageTag()
 
A progress reporter interface for use in multi-threaded environments.
 
virtual bool IsCancelled() const =0
 
virtual bool KeepRefreshing(bool aWait=false)=0
Update the UI (if any).
 
virtual void Report(const wxString &aMessage)=0
Display aMessage in the progress bar dialog.
 
virtual void SetCurrentProgress(double aProgress)=0
Set the progress value to aProgress (0..1).
 
std::shared_ptr< BACKGROUND_JOB > m_updateBackgroundJob
 
int PostRequest(const wxString &aUrl, std::string aRequestBody, std::ostream *aOutput, PROGRESS_REPORTER *aReporter, const size_t aSizeLimit)
 
void CheckForUpdate(wxWindow *aNoticeParent)
 
std::atomic< bool > m_working
 
std::future< void > m_updateTask
 
std::function< int(size_t, size_t, size_t, size_t)> TRANSFER_CALLBACK
Wrapper interface around the curl_easy API/.
 
PGM_BASE & Pgm()
The global program "get" accessor.
 
T * GetAppSettings(const char *aFilename)
 
thread_pool & GetKiCadThreadPool()
Get a reference to the current thread pool.
 
BS::thread_pool< 0 > thread_pool
 
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(UPDATE_REQUEST, platform, arch, current_version, lang, last_check) struct UPDATE_RESPONSE
 
#define UPDATE_QUERY_ENDPOINT