43#include <wx/translation.h>
44#include <wx/notifmsg.h>
69 wxString release_date;
71 wxString downloads_url;
77#define UPDATE_QUERY_ENDPOINT wxS( "https://downloads.kicad.org/api/v1/update" )
100 const size_t aSizeLimit )
102 bool size_exceeded =
false;
104 TRANSFER_CALLBACK callback = [&](
size_t dltotal,
size_t dlnow,
size_t ultotal,
size_t ulnow )
106 if( aSizeLimit > 0 && ( dltotal > aSizeLimit || dlnow > aSizeLimit ) )
108 size_exceeded =
true;
119 aReporter->
Report( wxString::Format(
_(
"Downloading %lld/%lld kB" ), dlnow / 1000,
135 curl.
SetHeader(
"Accept",
"application/json" );
136 curl.
SetHeader(
"Content-Type",
"application/json" );
139 curl.
SetURL( aUrl.ToUTF8().data() );
150 if( code != CURLE_OK )
154 if( code == CURLE_ABORTED_BY_CALLBACK && size_exceeded )
155 aReporter->
Report(
_(
"Download is too large." ) );
156 else if( code != CURLE_ABORTED_BY_CALLBACK )
174 auto update_check = [aNoticeParent,
this]() ->
void
178 std::stringstream update_json_stream;
179 std::stringstream request_json_stream;
183 reporter->Report(
_(
"Requesting update info" ) );
189#if defined( __WXMSW__ )
190 requestContent.
platform =
"windows";
192 #if defined( KICAD_BUILD_ARCH_X64 )
193 requestContent.
arch =
"amd64";
194 #elif defined( KICAD_BUILD_ARCH_X86 )
195 requestContent.
arch =
"i686";
196 #elif defined( KICAD_BUILD_ARCH_ARM )
197 requestContent.
arch =
"arm";
198 #elif defined( KICAD_BUILD_ARCH_ARM64 )
199 requestContent.
arch =
"arm64";
201#elif defined( __WXOSX__ )
203 requestContent.
arch =
"unified";
207 requestContent.
arch =
"";
210 verString.Replace(
"~",
"-" );
218 nlohmann::json requestJson = nlohmann::json( requestContent );
219 request_json_stream << requestJson;
221 int responseCode =
PostRequest( aUrl, request_json_stream.str(), &update_json_stream,
226 if( responseCode == 200 && !
Pgm().m_Quitting )
228 nlohmann::json update_json;
229 UPDATE_RESPONSE response;
233 update_json_stream >> update_json;
234 response = update_json.get<UPDATE_RESPONSE>();
238 aNoticeParent->CallAfter(
239 [aNoticeParent, response]()
241 if(
Pgm().m_Quitting )
246 response.details_url,
247 response.downloads_url );
249 int retCode = notice->ShowModal();
251 if( retCode != wxID_RETRY )
256 cfg->m_lastReceivedUpdate = response.version;
261 catch(
const std::exception& e )
263 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 SetTimeout(long aTimeoutSecs)
Set the total operation timeout in seconds.
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)
IbisParser parser & reporter
thread_pool & GetKiCadThreadPool()
Get a reference to the current thread pool.
BS::priority_thread_pool thread_pool
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(UPDATE_REQUEST, platform, arch, current_version, lang, last_check) struct UPDATE_RESPONSE
#define UPDATE_QUERY_ENDPOINT