28#include <lib_table_lexer.h>
56using namespace LIB_TABLE_T;
91 if( in->CurTok() != T_design_block_lib_table )
95 if( ( tok = in->NextTok() ) != T_design_block_lib_table )
96 in->Expecting( T_design_block_lib_table );
99 while( ( tok = in->NextTok() ) != T_RIGHT )
101 std::unique_ptr<DESIGN_BLOCK_LIB_TABLE_ROW> row =
102 std::make_unique<DESIGN_BLOCK_LIB_TABLE_ROW>();
105 in->Expecting( T_RIGHT );
108 in->Expecting( T_LEFT );
111 int lineNum = in->CurLineNumber();
115 if( tok == T_version )
117 in->NeedNUMBER(
"version" );
124 in->Expecting( T_lib );
129 if( ( tok = in->NextTok() ) != T_name )
130 in->Expecting( T_name );
132 in->NeedSYMBOLorNUMBER();
134 row->SetNickName( in->FromUTF8() );
140 bool sawType =
false;
141 bool sawOpts =
false;
142 bool sawDesc =
false;
144 bool sawDisabled =
false;
146 while( ( tok = in->NextTok() ) != T_RIGHT )
149 in->Unexpected( T_EOF );
152 in->Expecting( T_LEFT );
154 tok = in->NeedSYMBOLorNUMBER();
160 in->Duplicate( tok );
163 in->NeedSYMBOLorNUMBER();
164 row->SetFullURI( in->FromUTF8() );
169 in->Duplicate( tok );
172 in->NeedSYMBOLorNUMBER();
173 row->SetType( in->FromUTF8() );
178 in->Duplicate( tok );
181 in->NeedSYMBOLorNUMBER();
182 row->SetOptions( in->FromUTF8() );
187 in->Duplicate( tok );
190 in->NeedSYMBOLorNUMBER();
191 row->SetDescr( in->FromUTF8() );
196 in->Duplicate( tok );
199 row->SetEnabled(
false );
208 default: in->Unexpected( tok );
215 in->Expecting( T_type );
218 in->Expecting( T_uri );
223 wxString nickname = row->GetNickName();
225 bool doReplace =
false;
232 wxString msg = wxString::Format(
_(
"Duplicate library nickname '%s' found in "
233 "design block library table file line %d." ),
236 if( !errMsg.IsEmpty() )
243 if( !errMsg.IsEmpty() )
252 for(
unsigned i = 0; i <
m_rows.size(); ++i )
268 aOutput->
Print( aIndentLevel,
"(design_block_lib_table\n" );
272 it->Format( aOutput, aIndentLevel + 1 );
274 aOutput->
Print( aIndentLevel,
")\n" );
286 wxCHECK( row && row->
plugin, hash );
289 + wxHashTable::MakeKey( *aNickname );
298 row =
FindRow( nickname,
true );
305 wxCHECK2( row && row->
plugin,
continue );
308 + wxHashTable::MakeKey( nickname );
316 const wxString& aNickname,
bool aBestEfforts )
320 row->
plugin->DesignBlockEnumerate( aDesignBlockNames, row->
GetFullURI(
true ), aBestEfforts,
326 bool aCheckIfEnabled )
333 wxString msg = wxString::Format(
334 _(
"design-block-lib-table files contain no library named '%s'." ), aNickname );
346 const wxString& aDesignBlockName )
372 const wxString& aDesignBlockName )
377 return row->
plugin->GetEnumeratedDesignBlock( row->
GetFullURI(
true ), aDesignBlockName,
383 const wxString& aDesignBlockName )
390 return row->
plugin->DesignBlockExists( row->
GetFullURI(
true ), aDesignBlockName,
401 const wxString& aDesignBlockName,
430 std::unique_ptr<DESIGN_BLOCK> design_block( row->
plugin->DesignBlockLoad(
433 if( design_block.get() )
444 const wxString& aDesignBlockName )
449 return row->
plugin->DesignBlockDelete( row->
GetFullURI(
true ), aDesignBlockName,
485 if( nickname.size() )
496 for(
unsigned i = 0; i < nicks.size(); ++i )
521 const wxString& aPrefix ) :
525 wxFileName f( aPath, wxS(
"" ) );
529 wxDirTraverseResult
OnFile(
const wxString& aFilePath )
override {
return wxDIR_CONTINUE; }
531 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
533 wxFileName dir = wxFileName::DirName( dirPath );
538 if( dirPath.EndsWith( wxString::Format( wxS(
".%s" ),
542 wxString versionedPath = wxString::Format(
545 wxArrayString parts = dir.GetDirs();
547 parts.Insert( versionedPath, 0 );
549 wxString libPath = wxJoin( parts,
'/' );
553 wxString
name = parts.Last().substr( 0, parts.Last().length() - 7 );
568 nickname, libPath, wxT(
"KiCad" ), wxEmptyString,
569 _(
"Added by Plugin and Content Manager" ) ) );
573 return wxDIR_CONTINUE;
586 bool tableExists =
true;
589 if( !fn.FileExists() )
593 if( !fn.DirExists() && !fn.Mkdir( 0x777, wxPATH_MKDIR_FULL ) )
595 THROW_IO_ERROR( wxString::Format(
_(
"Cannot create global library table path '%s'." ),
606 std::optional<wxString> v =
609 if( v && !v->IsEmpty() )
615 if( fileName.IsEmpty() || !::wxCopyFile( fileName, fn.GetFullPath(),
false ) )
619 emptyTable.
Save( fn.GetFullPath() );
624 aTable.
Load( fn.GetFullPath() );
630 wxString packagesPath;
639 wxFileName d( packagesPath, wxS(
"" ) );
640 d.AppendDir( wxS(
"design_blocks" ) );
646 wxDir dir( d.GetPath() );
648 dir.Traverse( traverser );
655 std::vector<wxString> to_remove;
657 for(
size_t i = 0; i < aTable.
GetCount(); i++ )
662 if(
path.StartsWith( packagesPath ) && !wxDir::Exists(
path ) )
666 for(
const wxString& nickName : to_remove )
693 return fn.GetFullPath();
@ KICAD_SEXP
S-expression KiCad file format.
static DESIGN_BLOCK_FILE_T EnumFromStr(const wxString &aFileType)
static DESIGN_BLOCK_IO * FindPlugin(DESIGN_BLOCK_FILE_T aFileType)
Hold a record identifying a library accessed by the appropriate design block library #PLUGIN object i...
void SetType(const wxString &aType) override
Change the type represented by this row.
void setPlugin(DESIGN_BLOCK_IO *aPlugin)
DESIGN_BLOCK_IO_MGR::DESIGN_BLOCK_FILE_T type
IO_RELEASER< DESIGN_BLOCK_IO > plugin
bool operator==(const DESIGN_BLOCK_LIB_TABLE_ROW &aRow) const
void DesignBlockLibDelete(const wxString &aNickname)
bool operator==(const DESIGN_BLOCK_LIB_TABLE &aFpTable) const
long long GenerateTimestamp(const wxString *aNickname)
Generate a hashed timestamp representing the last-mod-times of the library indicated by aNickname,...
static wxString GetGlobalTableFileName()
const DESIGN_BLOCK * GetEnumeratedDesignBlock(const wxString &aNickname, const wxString &aDesignBlockName)
A version of DesignBlockLoad() for use after DesignBlockEnumerate() for more efficient cache manageme...
bool IsDesignBlockLibWritable(const wxString &aNickname)
Return true if the library given by aNickname is writable.
void DesignBlockDelete(const wxString &aNickname, const wxString &aDesignBlockName)
Delete the aDesignBlockName from the library given by aNickname.
void DesignBlockLibCreate(const wxString &aNickname)
DESIGN_BLOCK * DesignBlockLoad(const wxString &aNickname, const wxString &aDesignBlockName, bool aKeepUUID=false)
Load a design block having aDesignBlockName from the library given by aNickname.
virtual void Parse(LIB_TABLE_LEXER *aLexer) override
Parse the #LIB_TABLE_LEXER s-expression library table format into the appropriate LIB_TABLE_ROW objec...
SAVE_T
The set of return values from DesignBlockSave() below.
DESIGN_BLOCK_LIB_TABLE(DESIGN_BLOCK_LIB_TABLE *aFallBackTable=nullptr)
Build a design block library table by pre-pending this table fragment in front of aFallBackTable.
SAVE_T DesignBlockSave(const wxString &aNickname, const DESIGN_BLOCK *aDesignBlock, bool aOverwrite=true)
Write aDesignBlock to an existing library given by aNickname.
DESIGN_BLOCK * DesignBlockLoadWithOptionalNickname(const LIB_ID &aDesignBlockId, bool aKeepUUID=false)
Load a design block having aDesignBlockId with possibly an empty nickname.
bool DesignBlockExists(const wxString &aNickname, const wxString &aDesignBlockName)
Indicates whether or not the given design block already exists in the given library.
static DESIGN_BLOCK_LIST_IMPL & GetGlobalList()
static bool LoadGlobalTable(DESIGN_BLOCK_LIB_TABLE &aTable)
Load the global design block library table into aTable.
const DESIGN_BLOCK_LIB_TABLE_ROW * FindRow(const wxString &aNickName, bool aCheckIfEnabled=false)
Return an DESIGN_BLOCK_LIB_TABLE_ROW if aNickName is found in this table or in any chained fall back ...
void DesignBlockEnumerate(wxArrayString &aDesignBlockNames, const wxString &aNickname, bool aBestEfforts)
Return a list of design block names contained within the library given by aNickname.
static const wxString GlobalPathEnvVariableName()
Return the name of the environment variable used to hold the directory of locally installed "KiCad sp...
static DESIGN_BLOCK_LIB_TABLE & GetGlobalLibTable()
virtual void Format(OUTPUTFORMATTER *aOutput, int aIndentLevel) const override
Generate the table in s-expression format to aOutput with an indentation level of aIndentLevel.
const LIB_ID & GetLibId() const
A logical library item identifier and consists of various portions much like a URI.
int SetLibNickname(const UTF8 &aLibNickname)
Override the logical library name portion of the LIB_ID to aLibNickname.
const UTF8 & GetLibItemName() const
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Hold a record identifying a library accessed by the appropriate plug in object in the LIB_TABLE.
const std::map< std::string, UTF8 > * GetProperties() const
Return the constant #PROPERTIES for this library (LIB_TABLE_ROW).
const wxString & GetNickName() const
const wxString GetFullURI(bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
bool operator==(const LIB_TABLE_ROW &r) const
Manage LIB_TABLE_ROW records (rows), and can be searched based on library nickname.
std::vector< wxString > GetLogicalLibs()
Return the logical library names, all of them that are pertinent to a look up done on this LIB_TABLE.
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
int m_version
Versioning to handle importing old tables.
LIB_TABLE_ROW & At(unsigned aIndex)
Get the 'n'th LIB_TABLE_ROW object.
bool InsertRow(LIB_TABLE_ROW *aRow, bool doReplace=false)
Adds aRow if it does not already exist or if doReplace is true.
LIB_TABLE_ROWS m_rows
Owning set of rows.
bool doInsertRow(LIB_TABLE_ROW *aRow, bool doReplace=false)
Performs the mechanics of inserting a row, but without locking or reindexing.
void Load(const wxString &aFileName)
Load the library table using the path defined by aFileName aFallBackTable.
bool HasLibraryWithPath(const wxString &aPath) const
Test for the existence of aPath in the library table.
bool RemoveRow(const LIB_TABLE_ROW *aRow)
Removes a row from the table and frees the pointer.
unsigned GetCount() const
Get the number of rows contained in the table.
void Save(const wxString &aFileName) const
Write this library table to aFileName in s-expression form.
LIB_TABLE_ROW * findRow(const wxString &aNickname, bool aCheckIfEnabled=false) const
Return a LIB_TABLE_ROW if aNickname is found in this table or in any chained fallBack table fragment,...
static wxString GetUserSettingsPath()
Return the user configuration path used to store KiCad's configuration files.
PCM_DESIGN_BLOCK_LIB_TRAVERSER(const wxString &aPath, DESIGN_BLOCK_LIB_TABLE &aTable, const wxString &aPrefix)
wxDirTraverseResult OnFile(const wxString &aFilePath) override
wxDirTraverseResult OnDir(const wxString &dirPath) override
DESIGN_BLOCK_LIB_TABLE & m_lib_table
size_t m_prefix_dir_count
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
virtual SETTINGS_MANAGER & GetSettingsManager() const
Look for files in a number of paths.
void AddPaths(const wxString &aPaths, int aIndex=-1)
Insert or append path(s).
T * GetAppSettings(const wxString &aFilename)
Return a handle to the a given settings by type.
std::string::size_type size() const
static void setLibNickname(DESIGN_BLOCK *aModule, const wxString &aNickname, const wxString &aDesignBlockName)
DESIGN_BLOCK_LIB_TABLE GDesignBlockTable
The global design block library table.
DESIGN_BLOCK_LIST_IMPL GDesignBlockList
The global footprint info table.
Functions related to environment variables, including help functions.
static const std::string KiCadDesignBlockLibPathExtension
static const std::string DesignBlockLibraryTableFileName
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
#define THROW_IO_ERROR(msg)
LIB_TABLE_ROWS::const_iterator LIB_TABLE_ROWS_CITER
KICOMMON_API std::optional< wxString > GetVersionedEnvVarValue(const std::map< wxString, ENV_VAR_ITEM > &aMap, const wxString &aBaseName)
Attempt to retrieve the value of a versioned environment variable, such as KICAD8_TEMPLATE_DIR.
KICOMMON_API wxString GetVersionedEnvVarName(const wxString &aBaseName)
Construct a versioned environment variable based on this KiCad major version.
PGM_BASE & Pgm()
The global program "get" accessor.
void SystemDirsAppend(SEARCH_STACK *aSearchStack)
Append system places to aSearchStack in a platform specific way and pertinent to KiCad programs.
System directories search utilities.
Definition of file extensions used in Kicad.