Pcbnew: footprint library table fixes.

* Replace illegal file system characters when reading legacy libraries to
  prevent FPID parsing errors and allow saving to PRETTY file format.
* Create validator to filter illegal file system characters from footprint
  name text edit controls to prevent issues when saving to PRETTY file format.
* Add missing source file licenses and some minor coding policy fixes.
This commit is contained in:
Wayne Stambaugh 2013-11-29 13:29:41 -05:00
parent 48f9ea2287
commit 56e2df79f6
9 changed files with 280 additions and 75 deletions

View File

@ -1,3 +1,26 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file string.cpp
* @brief Some useful functions to handle strings.
@ -5,9 +28,18 @@
#include <fctsys.h>
#include <macros.h>
#include <richio.h> // StrPrintf
#include <kicad_string.h>
/**
* Illegal file name characters used to insure file names will be valid on all supported
* platforms. This is the list of illegal file name characters for Windows which includes
* the illegal file name characters for Linux and OSX.
*/
static const char illegalFileNameChars[] = "\\/:\"<>|";
int ReadDelimitedText( wxString* aDest, const char* aSource )
{
std::string utf8; // utf8 but without escapes and quotes.
@ -414,3 +446,34 @@ int SplitString( wxString strToSplit,
return 0;
}
wxString GetIllegalFileNameWxChars()
{
return FROM_UTF8( illegalFileNameChars );
}
bool ReplaceIllegalFileNameChars( std::string* aName )
{
bool changed = false;
std::string result;
for( std::string::iterator it = aName->begin(); it != aName->end(); ++it )
{
if( strchr( illegalFileNameChars, *it ) )
{
StrPrintf( &result, "%%%02x", *it );
changed = true;
}
else
{
result += *it;
}
}
if( changed )
*aName = result;
return changed;
}

48
common/validators.cpp Normal file
View File

@ -0,0 +1,48 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 2004-2013 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file validators.cpp
* @brief Custom text control validator implementations.
*/
#include <kicad_string.h>
#include <validators.h>
FOOTPRINT_NAME_VALIDATOR::FOOTPRINT_NAME_VALIDATOR( wxString* aValue ) :
wxTextValidator( wxFILTER_EXCLUDE_CHAR_LIST, aValue )
{
// The Windows (DOS) file system forbidden characters already include the forbidden
// file name characters for both Posix and OSX systems. The characters \/*?|"<> are
// illegal and filtered by the validator.
wxString illegalChars = GetIllegalFileNameWxChars();
wxTextValidator nameValidator( wxFILTER_EXCLUDE_CHAR_LIST );
wxArrayString illegalCharList;
for( unsigned i = 0; i < illegalChars.size(); i++ )
illegalCharList.Add( wxString( illegalChars[i] ) );
SetExcludes( illegalCharList );
}

View File

@ -1,6 +1,27 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* This file is part of the common library \n
* Custom string manipulation routines.
* @file kicad_string.h
* @see common.h, string.cpp
*/
@ -10,6 +31,7 @@
#define KICAD_STRING_H_
#include <wx/string.h>
#include <wx/filename.h>
/**
@ -57,7 +79,7 @@ std::string EscapedUTF8( const wxString& aString );
char* GetLine( FILE* aFile, char* Line, int* LineNum = NULL, int SizeLine = 255 );
/**
* Funxtion StrPurge
* Function StrPurge
* removes leading and training spaces, tabs and end of line chars in \a text
* return a pointer on the first n char in text
*/
@ -79,7 +101,7 @@ wxString DateAndTime();
*
* @param aString1 A wxChar pointer to the reference string.
* @param aString2 A wxChar pointer to the comparison string.
* @param aLength The numbere of characters to compare. Set to -1 to compare
* @param aLength The number of characters to compare. Set to -1 to compare
* the entire string.
* @param aIgnoreCase Use true to make the comparison case insensitive.
* @return An integer value of -1 if \a aString1 is less than \a aString2, 0 if
@ -121,4 +143,25 @@ int SplitString( wxString strToSplit,
wxString* strDigits,
wxString* strEnd );
/**
* Function GetIllegalFileNameWxChars
* @return a wString object containing the illegal file name characters for all platforms.
*/
wxString GetIllegalFileNameWxChars();
/**
* Function ReplaceIllegalFileNameChars
* checks \a aName for illegal file name characters.
*
* The Windows (DOS) file system forbidden characters already include the forbidden file
* name characters for both Posix and OSX systems. The characters \/?*|"\<\> are illegal
* and are replaced with %xx where xx the hexadecimal equivalent of the replaced character.
* This replacement may not be as elegant as using an underscore ('_') or hyphen ('-') but
* it guarentees that there will be no naming conflicts when fixing footprint library names.
*
* @param aName is a point to a std::string object containing the footprint name to verify.
* @return true if any characters have been replaced in \a aName.
*/
bool ReplaceIllegalFileNameChars( std::string* aName );
#endif // KICAD_STRING_H_

57
include/validators.h Normal file
View File

@ -0,0 +1,57 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 2004-2013 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file validators.h
* @brief Custom text control validator definitions.
*/
#include <wx/valtext.h>
/**
* Class FOOTPRINT_NAME_VALIDATOR
*
* This class provides a custom wxValidator object for limiting the allowable characters when
* defining footprint names. Since the introduction of the PRETTY footprint library format,
* footprint names cannot have any characters that would prevent file creation on any platform.
*/
class FOOTPRINT_NAME_VALIDATOR : public wxTextValidator
{
public:
FOOTPRINT_NAME_VALIDATOR( wxString* aValue = NULL ) :
wxTextValidator( wxFILTER_EXCLUDE_CHAR_LIST, aValue )
{
// The Windows (DOS) file system forbidden characters already include the forbidden
// file name characters for both Posix and OSX systems. The characters \/*?|"<> are
// illegal and filtered by the validator.
wxString illegalChars = wxFileName::GetForbiddenChars( wxPATH_DOS );
wxTextValidator nameValidator( wxFILTER_EXCLUDE_CHAR_LIST );
wxArrayString illegalCharList;
for( unsigned i = 0; i < illegalChars.size(); i++ )
illegalCharList.Add( wxString( illegalChars[i] ) );
SetExcludes( illegalCharList );
}
};

View File

@ -42,6 +42,8 @@
#include <wxPcbStruct.h>
#include <base_units.h>
#include <macros.h>
#include <validators.h>
#include <kicad_string.h>
#include <class_module.h>
#include <class_text_mod.h>
@ -62,6 +64,7 @@ DIALOG_MODULE_MODULE_EDITOR::DIALOG_MODULE_MODULE_EDITOR( FOOTPRINT_EDIT_FRAME*
icon.CopyFromBitmap( KiBitmap( icon_modedit_xpm ) );
SetIcon( icon );
m_FootprintNameCtrl->SetValidator( FOOTPRINT_NAME_VALIDATOR() );
initModeditProperties();
m_sdbSizerStdButtonsOK->SetDefault();
GetSizer()->SetSizeHints( this );
@ -147,7 +150,6 @@ void DIALOG_MODULE_MODULE_EDITOR::initModeditProperties()
m_AutoPlaceCtrl->SetItemToolTip( 1, _( "Disable hotkey move commands and Auto Placement" ) );
m_CostRot90Ctrl->SetValue( m_currentModule->GetPlacementCost90() );
m_CostRot180Ctrl->SetValue( m_currentModule->GetPlacementCost180() );
// Initialize 3D parameters
@ -179,8 +181,7 @@ void DIALOG_MODULE_MODULE_EDITOR::initModeditProperties()
// Add solder paste margin ration in per cent
// for the usual default value 0.0, display -0.0 (or -0,0 in some countries)
msg.Printf( wxT( "%f" ),
m_currentModule->GetLocalSolderPasteMarginRatio() * 100.0 );
msg.Printf( wxT( "%f" ), m_currentModule->GetLocalSolderPasteMarginRatio() * 100.0 );
if( m_currentModule->GetLocalSolderPasteMarginRatio() == 0.0 &&
msg[0] == '0') // Sometimes Printf adds a sign if the value is very small (0.0)
@ -208,9 +209,7 @@ void DIALOG_MODULE_MODULE_EDITOR::Transfert3DValuesToDisplay( S3D_MASTER * aStru
if( aStruct3DSource )
{
m_3D_Scale->SetValue( aStruct3DSource->m_MatScale );
m_3D_Offset->SetValue( aStruct3DSource->m_MatPosition );
m_3D_Rotation->SetValue( aStruct3DSource->m_MatRotation );
}
else
@ -221,6 +220,7 @@ void DIALOG_MODULE_MODULE_EDITOR::Transfert3DValuesToDisplay( S3D_MASTER * aStru
}
}
/** Copy 3D info displayed in dialog box to values in a item in m_shapes3D_list
* @param aIndexSelection = item index in m_shapes3D_list
*/
@ -240,6 +240,7 @@ void DIALOG_MODULE_MODULE_EDITOR::On3DShapeNameSelected(wxCommandEvent& event)
{
if( m_lastSelected3DShapeIndex >= 0 )
TransfertDisplayTo3DValues( m_lastSelected3DShapeIndex );
m_lastSelected3DShapeIndex = m_3D_ShapeNameListBox->GetSelection();
if( m_lastSelected3DShapeIndex < 0 ) // happens under wxGTK when deleting an item in m_3D_ShapeNameListBox wxListBox
@ -251,6 +252,7 @@ void DIALOG_MODULE_MODULE_EDITOR::On3DShapeNameSelected(wxCommandEvent& event)
m_lastSelected3DShapeIndex = -1;
return;
}
Transfert3DValuesToDisplay( m_shapes3D_list[m_lastSelected3DShapeIndex] );
}
@ -261,6 +263,7 @@ void DIALOG_MODULE_MODULE_EDITOR::Remove3DShape(wxCommandEvent& event)
TransfertDisplayTo3DValues( m_lastSelected3DShapeIndex );
int ii = m_3D_ShapeNameListBox->GetSelection();
if( ii < 0 )
return;
@ -284,6 +287,7 @@ void DIALOG_MODULE_MODULE_EDITOR::BrowseAndAdd3DLib( wxCommandEvent& event )
wxString fullpath;
fullpath = wxGetApp().ReturnLastVisitedLibraryPath( LIB3D_PATH );
#ifdef __WINDOWS__
fullpath.Replace( wxT( "/" ), wxT( "\\" ) );
#endif
@ -313,6 +317,7 @@ void DIALOG_MODULE_MODULE_EDITOR::BrowseAndAdd3DLib( wxCommandEvent& event )
shortfilename = wxGetApp().ReturnFilenameWithRelativePathInLibPath( fullfilename );
wxFileName aux = shortfilename;
if( aux.IsAbsolute() )
{ // Absolute path, ask if the user wants a relative one
int diag = wxMessageBox(
@ -328,6 +333,7 @@ void DIALOG_MODULE_MODULE_EDITOR::BrowseAndAdd3DLib( wxCommandEvent& event )
}
S3D_MASTER* new3DShape = new S3D_MASTER(NULL);
#ifdef __WINDOWS__
// Store filename in Unix notation
shortfilename.Replace( wxT( "\\" ), wxT( "/" ) );
@ -357,6 +363,7 @@ void DIALOG_MODULE_MODULE_EDITOR::OnOkClick( wxCommandEvent& event )
{
// First, test for invalid chars in module name
wxString footprintName = m_FootprintNameCtrl->GetValue();
if( ! footprintName.IsEmpty() )
{
if( ! MODULE::IsLibNameValid( footprintName ) )
@ -404,9 +411,7 @@ void DIALOG_MODULE_MODULE_EDITOR::OnOkClick( wxCommandEvent& event )
// Initialize masks clearances
m_currentModule->SetLocalClearance( ReturnValueFromTextCtrl( *m_NetClearanceValueCtrl ) );
m_currentModule->SetLocalSolderMaskMargin( ReturnValueFromTextCtrl( *m_SolderMaskMarginCtrl ) );
m_currentModule->SetLocalSolderPasteMargin( ReturnValueFromTextCtrl( *m_SolderPasteMarginCtrl ) );
double dtmp;
wxString msg = m_SolderPasteMarginRatioCtrl->GetValue();
@ -415,6 +420,7 @@ void DIALOG_MODULE_MODULE_EDITOR::OnOkClick( wxCommandEvent& event )
// A -50% margin ratio means no paste on a pad, the ratio must be >= -50 %
if( dtmp < -50.0 )
dtmp = -50.0;
// A margin ratio is always <= 0
if( dtmp > 0.0 )
dtmp = 0.0;
@ -423,14 +429,19 @@ void DIALOG_MODULE_MODULE_EDITOR::OnOkClick( wxCommandEvent& event )
// Update 3D shape list
int ii = m_3D_ShapeNameListBox->GetSelection();
if ( ii >= 0 )
TransfertDisplayTo3DValues( ii );
S3D_MASTER* draw3D = m_currentModule->Models();
for( unsigned ii = 0; ii < m_shapes3D_list.size(); ii++ )
{
S3D_MASTER* draw3DCopy = m_shapes3D_list[ii];
if( draw3DCopy->m_Shape3DName.IsEmpty() )
continue;
if( draw3D == NULL )
{
draw3D = new S3D_MASTER( draw3D );
@ -447,6 +458,7 @@ void DIALOG_MODULE_MODULE_EDITOR::OnOkClick( wxCommandEvent& event )
// Remove old extra 3D shapes
S3D_MASTER* nextdraw3D;
for( ; draw3D != NULL; draw3D = nextdraw3D )
{
nextdraw3D = (S3D_MASTER*) draw3D->Next();
@ -484,4 +496,3 @@ void DIALOG_MODULE_MODULE_EDITOR::OnEditValue(wxCommandEvent& event)
m_parent->SetCrossHairPosition( tmp );
m_ValueCtrl->SetValue( m_valueCopy->GetText() );
}

View File

@ -66,6 +66,7 @@ Load() TODO's
#include <fctsys.h>
#include <trigo.h>
#include <macros.h>
#include <kicad_string.h>
#include <wx/filename.h>
#include <class_board.h>
@ -94,34 +95,6 @@ typedef boost::optional<bool> opt_bool;
const wxChar* traceEaglePlugin = wxT( "KicadEaglePlugin" );
/// Test footprint name for kicad legality, fix if needed and return true if fixing was required.
static bool fix_eagle_package_name( string* aName )
{
string result;
bool changed = false;
for( string::iterator it = aName->begin(); it != aName->end(); ++it )
{
switch( *it )
{
case ':':
case '/':
// replace *it with %xx, as in URL encoding
StrPrintf( &result, "%%%02x", *it );
changed = true;
break;
default:
result += *it;
}
}
if( changed )
*aName = result;
return changed;
}
/// segment (element) of our XPATH into the Eagle XML document tree in PTREE form.
struct TRIPLET
@ -939,7 +912,7 @@ EELEMENT::EELEMENT( CPTREE& aElement )
value = attribs.get<string>( "value" );
package = attribs.get<string>( "package" );
fix_eagle_package_name( &package );
ReplaceIllegalFileNameChars( &package );
x = attribs.get<double>( "x" );
y = attribs.get<double>( "y" );
@ -1617,7 +1590,7 @@ void EAGLE_PLUGIN::loadLibrary( CPTREE& aLib, const string* aLibName )
string pack_name( pack_ref );
fix_eagle_package_name( &pack_name );
ReplaceIllegalFileNameChars( &pack_name );
#if 0 && defined(DEBUG)
if( pack_name == "TO220H" )

View File

@ -281,6 +281,10 @@ void LEGACY_PLUGIN::loadAllSections( bool doAppend )
FPID fpid;
std::string fpName = StrPurge( line + SZ( "$MODULE" ) );
// The footprint names in legacy libraries can contain the '/' and ':'
// characters which will cause the FPID parser to choke.
ReplaceIllegalFileNameChars( &fpName );
if( !fpName.empty() )
fpid = FPID( fpName );
@ -4031,6 +4035,10 @@ void LP_CACHE::LoadModules( LINE_READER* aReader )
std::string footprintName = StrPurge( line + SZ( "$MODULE" ) );
// The footprint names in legacy libraries can contain the '/' and ':'
// characters which will cause the FPID parser to choke.
ReplaceIllegalFileNameChars( &footprintName );
// set the footprint name first thing, so exceptions can use name.
module->SetFPID( FPID( footprintName ) );

View File

@ -40,6 +40,7 @@
#include <pcbcommon.h>
#include <macros.h>
#include <fp_lib_table.h>
#include <validators.h>
#include <class_board.h>
#include <class_module.h>
@ -845,6 +846,7 @@ MODULE* PCB_BASE_FRAME::Create_1_Module( const wxString& aModuleName )
if( moduleName.IsEmpty() )
{
wxTextEntryDialog dlg( this, FMT_MOD_REF, FMT_MOD_CREATE, moduleName );
dlg.SetTextValidator( FOOTPRINT_NAME_VALIDATOR() );
if( dlg.ShowModal() != wxID_OK )
return NULL; //Aborted by user