36bool validateSymbolPayload(
const std::vector<uint8_t>& aPayload,
const wxString& aExpectedSymbolName,
39 if( aExpectedSymbolName.IsEmpty() )
42 if( aPayload.empty() )
44 aError =
_(
"Downloaded symbol payload was empty." );
48 std::string_view payload(
reinterpret_cast<const char*
>( aPayload.data() ), aPayload.size() );
50 if( payload.find(
"(kicad_symbol_lib" ) == std::string_view::npos )
52 aError =
_(
"Downloaded symbol payload was not a KiCad symbol library." );
56 const std::string symbolToken =
57 wxString::Format( wxS(
"(symbol \"%s\"" ), aExpectedSymbolName ).ToStdString();
59 if( payload.find( symbolToken ) == std::string_view::npos )
61 aError = wxString::Format(
62 _(
"Downloaded symbol payload did not include expected symbol '%s'." ),
63 aExpectedSymbolName );
88 bool aPlaceSymbol, wxString& aError )
96 aError =
_(
"Unable to load schematic settings." );
107 const bool strictLibraryTables =
m_frame !=
nullptr;
109 bool importedSymbol =
false;
110 wxString placedNickname;
111 wxString placedSymbolName;
117 if( !
downloader().DownloadAndVerify( aProvider, asset, remainingBudget, fetched, aError ) )
124 wxFileName symbolDir = baseDir;
125 symbolDir.AppendDir( wxS(
"symbols" ) );
129 wxS(
"symbols" ),
true );
130 const wxString symbolName =
132 const wxString nickname = prefix + wxS(
"_" ) + libraryName;
134 wxFileName outFile( symbolDir );
135 outFile.SetFullName( nickname + wxS(
".kicad_sym" ) );
137 if( !validateSymbolPayload( fetched.
payload, symbolName, aError ) )
143 if( strictLibraryTables )
146 addToGlobal,
true, aError ) )
154 importedSymbol =
true;
155 placedNickname = nickname;
156 placedSymbolName = symbolName;
158 else if( asset.
asset_type == wxS(
"footprint" ) )
160 wxFileName fpRoot = baseDir;
161 fpRoot.AppendDir( wxS(
"footprints" ) );
165 wxS(
"footprints" ),
true );
166 const wxString nickname = prefix + wxS(
"_" ) + libraryName;
168 wxFileName libDir = fpRoot;
169 libDir.AppendDir( nickname + wxS(
".pretty" ) );
173 wxS(
"footprint" ) );
175 if( !fileName.Lower().EndsWith( wxS(
".kicad_mod" ) ) )
176 fileName += wxS(
".kicad_mod" );
178 wxFileName outFile( libDir );
179 outFile.SetFullName( fileName );
184 if( strictLibraryTables )
187 addToGlobal,
true, aError ) )
195 else if( asset.
asset_type == wxS(
"3dmodel" ) )
197 wxFileName modelDir = baseDir;
198 modelDir.AppendDir( prefix + wxS(
"_3d" ) );
202 prefix + wxS(
"_model" ) );
204 wxFileName outFile( modelDir );
205 outFile.SetFullName( fileName );
212 wxFileName spiceDir = baseDir;
213 spiceDir.AppendDir( prefix + wxS(
"_spice" ) );
217 prefix + wxS(
"_model.cir" ) );
219 if( !fileName.Lower().EndsWith( wxS(
".cir" ) ) )
220 fileName += wxS(
".cir" );
222 wxFileName outFile( spiceDir );
223 outFile.SetFullName( fileName );
232 if( !importedSymbol )
234 aError =
_(
"No symbol asset was available to place." );
REMOTE_PROVIDER_SETTINGS m_RemoteSymbol
void ReloadLibraryEntry(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH)
virtual LIBRARY_MANAGER & GetLibraryManager() const
const REMOTE_SYMBOL_DOWNLOAD_MANAGER & downloader() const
std::unique_ptr< REMOTE_SYMBOL_DOWNLOAD_MANAGER > m_ownedDownloader
REMOTE_SYMBOL_DOWNLOAD_MANAGER * m_downloader
REMOTE_SYMBOL_IMPORT_JOB(SCH_EDIT_FRAME *aFrame, REMOTE_SYMBOL_DOWNLOAD_MANAGER *aDownloader=nullptr)
bool Import(const REMOTE_PROVIDER_METADATA &aProvider, const REMOTE_SYMBOL_IMPORT_CONTEXT &aContext, const REMOTE_PROVIDER_PART_MANIFEST &aManifest, bool aPlaceSymbol, wxString &aError)
Schematic editor (Eeschema) main window.
PGM_BASE & Pgm()
The global program "get" accessor.
bool PlaceRemoteDownloadedSymbol(SCH_EDIT_FRAME *aFrame, const wxString &aNickname, const wxString &aLibItemName, wxString &aError)
Place a symbol from a remote download into the schematic editor.
bool EnsureRemoteLibraryEntry(LIBRARY_TABLE_TYPE aTableType, const wxFileName &aLibraryPath, const wxString &aNickname, bool aGlobalTable, bool aStrict, wxString &aError)
Add or update a library table entry for a remote download library.
bool WriteRemoteBinaryFile(const wxFileName &aOutput, const std::vector< uint8_t > &aPayload, wxString &aError)
Write binary data to a file, creating parent directories as needed.
bool EnsureRemoteDestinationRoot(wxFileName &aOutDir, wxString &aError)
Resolve and create the configured destination root directory for remote symbol downloads.
wxString RemoteLibraryPrefix()
Return the configured (or default) library prefix for remote downloads, sanitized for use as a filena...
wxString SanitizeRemoteFileComponent(const wxString &aValue, const wxString &aDefault, bool aLower)
Replace non-alphanumeric characters (other than _ - .) with underscores.
T * GetAppSettings(const char *aFilename)
std::vector< REMOTE_PROVIDER_PART_ASSET > assets
std::vector< uint8_t > payload