KiCad PCB EDA Suite
LP_CACHE Struct Reference

LP_CACHE assists only for the footprint portion of the PLUGIN API, and only for the LEGACY_PLUGIN, so therefore is private to this implementation file, i.e. More...

Public Member Functions

 LP_CACHE (LEGACY_PLUGIN *aOwner, const wxString &aLibraryPath)
 
void Load ()
 
void ReadAndVerifyHeader (LINE_READER *aReader)
 
void SkipIndex (LINE_READER *aReader)
 
void LoadModules (LINE_READER *aReader)
 
bool IsModified ()
 

Static Public Member Functions

static long long GetTimestamp (const wxString &aLibPath)
 

Public Attributes

LEGACY_PLUGINm_owner
 
wxString m_lib_path
 
MODULE_MAP m_modules
 
bool m_writable
 
bool m_cache_dirty
 
long long m_cache_timestamp
 

Detailed Description

LP_CACHE assists only for the footprint portion of the PLUGIN API, and only for the LEGACY_PLUGIN, so therefore is private to this implementation file, i.e.

not placed into a header.

Definition at line 3210 of file legacy_plugin.cpp.

Constructor & Destructor Documentation

◆ LP_CACHE()

LP_CACHE::LP_CACHE ( LEGACY_PLUGIN aOwner,
const wxString &  aLibraryPath 
)

Definition at line 3241 of file legacy_plugin.cpp.

3241  :
3242  m_owner( aOwner ),
3243  m_lib_path( aLibraryPath ),
3244  m_writable( true ),
3245  m_cache_dirty( true ),
3246  m_cache_timestamp( 0 )
3247 {
3248 }
LEGACY_PLUGIN * m_owner
bool m_cache_dirty
long long m_cache_timestamp
wxString m_lib_path

Member Function Documentation

◆ GetTimestamp()

long long LP_CACHE::GetTimestamp ( const wxString &  aLibPath)
static

Definition at line 3259 of file legacy_plugin.cpp.

3260 {
3261  return wxFileName( aLibPath ).GetModificationTime().GetValue().GetValue();
3262 }

Referenced by LEGACY_PLUGIN::GetLibraryTimestamp(), IsModified(), and Load().

◆ IsModified()

bool LP_CACHE::IsModified ( )

Definition at line 3251 of file legacy_plugin.cpp.

3252 {
3254 
3255  return m_cache_dirty;
3256 }
bool m_cache_dirty
long long m_cache_timestamp
wxString m_lib_path
static long long GetTimestamp(const wxString &aLibPath)

References GetTimestamp(), m_cache_dirty, m_cache_timestamp, and m_lib_path.

Referenced by LEGACY_PLUGIN::cacheLib().

◆ Load()

void LP_CACHE::Load ( )

Definition at line 3265 of file legacy_plugin.cpp.

3266 {
3267  m_cache_dirty = false;
3268 
3269  FILE_LINE_READER reader( m_lib_path );
3270 
3271  ReadAndVerifyHeader( &reader );
3272  SkipIndex( &reader );
3273  LoadModules( &reader );
3274 
3275  // Remember the file modification time of library file when the
3276  // cache snapshot was made, so that in a networked environment we will
3277  // reload the cache as needed.
3279 }
void SkipIndex(LINE_READER *aReader)
bool m_cache_dirty
FILE_LINE_READER is a LINE_READER that reads from an open file.
Definition: richio.h:180
void LoadModules(LINE_READER *aReader)
long long m_cache_timestamp
wxString m_lib_path
static long long GetTimestamp(const wxString &aLibPath)
void ReadAndVerifyHeader(LINE_READER *aReader)

References GetTimestamp(), LoadModules(), m_cache_dirty, m_cache_timestamp, m_lib_path, ReadAndVerifyHeader(), and SkipIndex().

Referenced by LEGACY_PLUGIN::cacheLib().

◆ LoadModules()

void LP_CACHE::LoadModules ( LINE_READER aReader)

Definition at line 3338 of file legacy_plugin.cpp.

3339 {
3340  m_owner->SetReader( aReader );
3341 
3342  char* line = aReader->Line();
3343 
3344  do
3345  {
3346  // test first for the $MODULE, even before reading because of INDEX bug.
3347  if( TESTLINE( "$MODULE" ) )
3348  {
3349  unique_ptr<MODULE> module( new MODULE( m_owner->m_board ) );
3350 
3351  std::string footprintName = StrPurge( line + SZ( "$MODULE" ) );
3352 
3353  // The footprint names in legacy libraries can contain the '/' and ':'
3354  // characters which will cause the LIB_ID parser to choke.
3355  ReplaceIllegalFileNameChars( &footprintName );
3356 
3357  // set the footprint name first thing, so exceptions can use name.
3358  module->SetFPID( LIB_ID( wxEmptyString, footprintName ) );
3359 
3360  m_owner->loadMODULE( module.get() );
3361 
3362  MODULE* m = module.release(); // exceptions after this are not expected.
3363 
3364  // Not sure why this is asserting on debug builds. The debugger shows the
3365  // strings are the same. If it's not really needed maybe it can be removed.
3366 // wxASSERT( footprintName == m->GetFPID().GetLibItemName() );
3367 
3368  /*
3369 
3370  There was a bug in old legacy library management code
3371  (pre-LEGACY_PLUGIN) which was introducing duplicate footprint names
3372  in legacy libraries without notification. To best recover from such
3373  bad libraries, and use them to their fullest, there are a few
3374  strategies that could be used. (Note: footprints must have unique
3375  names to be accepted into this cache.) The strategy used here is to
3376  append a differentiating version counter to the end of the name as:
3377  _v2, _v3, etc.
3378 
3379  */
3380 
3381  MODULE_CITER it = m_modules.find( footprintName );
3382 
3383  if( it == m_modules.end() ) // footprintName is not present in cache yet.
3384  {
3385  std::pair<MODULE_ITER, bool> r = m_modules.insert( footprintName, m );
3386 
3387  wxASSERT_MSG( r.second, wxT( "error doing cache insert using guaranteed unique name" ) );
3388  (void) r;
3389  }
3390 
3391  // Bad library has a duplicate of this footprintName, generate a
3392  // unique footprint name and load it anyway.
3393  else
3394  {
3395  bool nameOK = false;
3396  int version = 2;
3397  char buf[48];
3398 
3399  while( !nameOK )
3400  {
3401  std::string newName = footprintName;
3402 
3403  newName += "_v";
3404  sprintf( buf, "%d", version++ );
3405  newName += buf;
3406 
3407  it = m_modules.find( newName );
3408 
3409  if( it == m_modules.end() )
3410  {
3411  nameOK = true;
3412 
3413  m->SetFPID( LIB_ID( wxEmptyString, newName ) );
3414  std::pair<MODULE_ITER, bool> r = m_modules.insert( newName, m );
3415 
3416  wxASSERT_MSG( r.second, wxT( "error doing cache insert using guaranteed unique name" ) );
3417  (void) r;
3418  }
3419  }
3420  }
3421  }
3422 
3423  } while( ( line = aReader->ReadLine() ) != NULL );
3424 }
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
char * StrPurge(char *text)
Remove leading and training spaces, tabs and end of line chars in text.
Definition: string.cpp:310
LEGACY_PLUGIN * m_owner
void loadMODULE(MODULE *aModule)
bool ReplaceIllegalFileNameChars(std::string *aName, int aReplaceChar)
Checks aName for illegal file name characters.
Definition: string.cpp:680
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
void SetReader(LINE_READER *aReader)
#define NULL
BOARD * m_board
which BOARD, no ownership here
MODULE_MAP::const_iterator MODULE_CITER
virtual char * ReadLine()=0
Function ReadLine reads a line of text into the buffer and increments the line number counter.
#define SZ(x)
Get the length of a string constant, at compile time.
void SetFPID(const LIB_ID &aFPID)
Definition: class_module.h:220
#define TESTLINE(x)
C string compare test for a specific length of characters.
MODULE_MAP m_modules

References LINE_READER::Line(), LEGACY_PLUGIN::loadMODULE(), LEGACY_PLUGIN::m_board, m_modules, m_owner, NULL, LINE_READER::ReadLine(), ReplaceIllegalFileNameChars(), MODULE::SetFPID(), LEGACY_PLUGIN::SetReader(), StrPurge(), SZ, and TESTLINE.

Referenced by Load().

◆ ReadAndVerifyHeader()

void LP_CACHE::ReadAndVerifyHeader ( LINE_READER aReader)

Definition at line 3282 of file legacy_plugin.cpp.

3283 {
3284  char* line = aReader->ReadLine();
3285  char* saveptr;
3286 
3287  if( !line )
3288  THROW_IO_ERROR( wxString::Format( _( "File '%s' is empty." ), m_lib_path ) );
3289 
3290  if( !TESTLINE( "PCBNEW-LibModule-V1" ) )
3291  THROW_IO_ERROR( wxString::Format( _( "File '%s' is not a legacy library." ), m_lib_path ) );
3292 
3293  while( ( line = aReader->ReadLine() ) != NULL )
3294  {
3295  if( TESTLINE( "Units" ) )
3296  {
3297  const char* units = strtok_r( line + SZ( "Units" ), delims, &saveptr );
3298 
3299  if( !strcmp( units, "mm" ) )
3300  m_owner->diskToBiu = IU_PER_MM;
3301 
3302  }
3303  else if( TESTLINE( "$INDEX" ) )
3304  return;
3305  }
3306 }
LEGACY_PLUGIN * m_owner
static const char delims[]
#define NULL
#define THROW_IO_ERROR(msg)
double diskToBiu
convert from disk engineering units to BIUs with this scale factor
virtual char * ReadLine()=0
Function ReadLine reads a line of text into the buffer and increments the line number counter.
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
#define _(s)
Definition: 3d_actions.cpp:31
wxString m_lib_path
char * strtok_r(char *str, const char *delim, char **nextp)
#define SZ(x)
Get the length of a string constant, at compile time.
#define TESTLINE(x)
C string compare test for a specific length of characters.

References _, delims, LEGACY_PLUGIN::diskToBiu, Format(), m_lib_path, m_owner, NULL, LINE_READER::ReadLine(), strtok_r(), SZ, TESTLINE, and THROW_IO_ERROR.

Referenced by Load().

◆ SkipIndex()

void LP_CACHE::SkipIndex ( LINE_READER aReader)

Definition at line 3309 of file legacy_plugin.cpp.

3310 {
3311  // Some broken INDEX sections have more than one section, due to prior bugs.
3312  // So we must read the next line after $EndINDEX tag,
3313  // to see if this is not a new $INDEX tag.
3314  bool exit = false;
3315  char* line = aReader->Line();
3316 
3317  do
3318  {
3319  if( TESTLINE( "$INDEX" ) )
3320  {
3321  exit = false;
3322 
3323  while( ( line = aReader->ReadLine() ) != NULL )
3324  {
3325  if( TESTLINE( "$EndINDEX" ) )
3326  {
3327  exit = true;
3328  break;
3329  }
3330  }
3331  }
3332  else if( exit )
3333  break;
3334  } while( ( line = aReader->ReadLine() ) != NULL );
3335 }
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
#define NULL
virtual char * ReadLine()=0
Function ReadLine reads a line of text into the buffer and increments the line number counter.
#define TESTLINE(x)
C string compare test for a specific length of characters.

References LINE_READER::Line(), NULL, LINE_READER::ReadLine(), and TESTLINE.

Referenced by Load().

Member Data Documentation

◆ m_cache_dirty

bool LP_CACHE::m_cache_dirty

Definition at line 3217 of file legacy_plugin.cpp.

Referenced by IsModified(), and Load().

◆ m_cache_timestamp

long long LP_CACHE::m_cache_timestamp

Definition at line 3219 of file legacy_plugin.cpp.

Referenced by IsModified(), and Load().

◆ m_lib_path

wxString LP_CACHE::m_lib_path

◆ m_modules

MODULE_MAP LP_CACHE::m_modules

◆ m_owner

LEGACY_PLUGIN* LP_CACHE::m_owner

Definition at line 3212 of file legacy_plugin.cpp.

Referenced by LoadModules(), and ReadAndVerifyHeader().

◆ m_writable

bool LP_CACHE::m_writable

Definition at line 3215 of file legacy_plugin.cpp.

Referenced by LEGACY_PLUGIN::IsFootprintLibWritable().


The documentation for this struct was generated from the following file: