mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-04-19 23:31:40 +00:00
Introduce base IO_MGR class and unify RELEASER objects
The IO_RELEASER is a thin-wrapper around a std::unique_ptr, but done this way to allow easier addition of a custom deleter in the future if something needs to call back into the IO_MGR.
This commit is contained in:
parent
04d15026c5
commit
f2702b223c
common
eeschema
dialogs
eeschema_helpers.cppfiles-io.cppproject_rescue.cppsch_io
sheet.cppsymbol_editor
symbol_lib_table.cppsymbol_lib_table.hsymbol_library_manager.cpptools
include
pcbnew
qa
qa_utils
schematic_utils
tests
tools/pns
@ -303,7 +303,7 @@ void FP_LIB_TABLE::FootprintEnumerate( wxArrayString& aFootprintNames, const wxS
|
||||
bool aBestEfforts )
|
||||
{
|
||||
const FP_LIB_TABLE_ROW* row = FindRow( aNickname, true );
|
||||
wxASSERT( (PCB_IO*) row->plugin );
|
||||
wxASSERT( row->plugin );
|
||||
row->plugin->FootprintEnumerate( aFootprintNames, row->GetFullURI( true ), aBestEfforts,
|
||||
row->GetProperties() );
|
||||
}
|
||||
@ -312,7 +312,7 @@ void FP_LIB_TABLE::FootprintEnumerate( wxArrayString& aFootprintNames, const wxS
|
||||
void FP_LIB_TABLE::PrefetchLib( const wxString& aNickname )
|
||||
{
|
||||
const FP_LIB_TABLE_ROW* row = FindRow( aNickname, true );
|
||||
wxASSERT( (PCB_IO*) row->plugin );
|
||||
wxASSERT( row->plugin );
|
||||
row->plugin->PrefetchLib( row->GetFullURI( true ), row->GetProperties() );
|
||||
}
|
||||
|
||||
@ -369,7 +369,7 @@ const FOOTPRINT* FP_LIB_TABLE::GetEnumeratedFootprint( const wxString& aNickname
|
||||
const wxString& aFootprintName )
|
||||
{
|
||||
const FP_LIB_TABLE_ROW* row = FindRow( aNickname, true );
|
||||
wxASSERT( (PCB_IO*) row->plugin );
|
||||
wxASSERT( row->plugin );
|
||||
|
||||
return row->plugin->GetEnumeratedFootprint( row->GetFullURI( true ), aFootprintName,
|
||||
row->GetProperties() );
|
||||
@ -381,7 +381,7 @@ bool FP_LIB_TABLE::FootprintExists( const wxString& aNickname, const wxString& a
|
||||
try
|
||||
{
|
||||
const FP_LIB_TABLE_ROW* row = FindRow( aNickname, true );
|
||||
wxASSERT( (PCB_IO*) row->plugin );
|
||||
wxASSERT( row->plugin );
|
||||
|
||||
return row->plugin->FootprintExists( row->GetFullURI( true ), aFootprintName,
|
||||
row->GetProperties() );
|
||||
@ -397,7 +397,7 @@ FOOTPRINT* FP_LIB_TABLE::FootprintLoad( const wxString& aNickname,
|
||||
const wxString& aFootprintName, bool aKeepUUID )
|
||||
{
|
||||
const FP_LIB_TABLE_ROW* row = FindRow( aNickname, true );
|
||||
wxASSERT( (PCB_IO*) row->plugin );
|
||||
wxASSERT( row->plugin );
|
||||
|
||||
FOOTPRINT* ret = row->plugin->FootprintLoad( row->GetFullURI( true ), aFootprintName,
|
||||
aKeepUUID, row->GetProperties() );
|
||||
@ -412,7 +412,7 @@ FP_LIB_TABLE::SAVE_T FP_LIB_TABLE::FootprintSave( const wxString& aNickname,
|
||||
const FOOTPRINT* aFootprint, bool aOverwrite )
|
||||
{
|
||||
const FP_LIB_TABLE_ROW* row = FindRow( aNickname, true );
|
||||
wxASSERT( (PCB_IO*) row->plugin );
|
||||
wxASSERT( row->plugin );
|
||||
|
||||
if( !aOverwrite )
|
||||
{
|
||||
@ -438,7 +438,7 @@ FP_LIB_TABLE::SAVE_T FP_LIB_TABLE::FootprintSave( const wxString& aNickname,
|
||||
void FP_LIB_TABLE::FootprintDelete( const wxString& aNickname, const wxString& aFootprintName )
|
||||
{
|
||||
const FP_LIB_TABLE_ROW* row = FindRow( aNickname, true );
|
||||
wxASSERT( (PCB_IO*) row->plugin );
|
||||
wxASSERT( row->plugin );
|
||||
return row->plugin->FootprintDelete( row->GetFullURI( true ), aFootprintName,
|
||||
row->GetProperties() );
|
||||
}
|
||||
@ -447,7 +447,7 @@ void FP_LIB_TABLE::FootprintDelete( const wxString& aNickname, const wxString& a
|
||||
bool FP_LIB_TABLE::IsFootprintLibWritable( const wxString& aNickname )
|
||||
{
|
||||
const FP_LIB_TABLE_ROW* row = FindRow( aNickname, true );
|
||||
wxASSERT( (PCB_IO*) row->plugin );
|
||||
wxASSERT( row->plugin );
|
||||
return row->plugin->IsLibraryWritable( row->GetFullURI( true ) );
|
||||
}
|
||||
|
||||
@ -455,7 +455,7 @@ bool FP_LIB_TABLE::IsFootprintLibWritable( const wxString& aNickname )
|
||||
void FP_LIB_TABLE::FootprintLibDelete( const wxString& aNickname )
|
||||
{
|
||||
const FP_LIB_TABLE_ROW* row = FindRow( aNickname, true );
|
||||
wxASSERT( (PCB_IO*) row->plugin );
|
||||
wxASSERT( row->plugin );
|
||||
row->plugin->DeleteLibrary( row->GetFullURI( true ), row->GetProperties() );
|
||||
}
|
||||
|
||||
@ -463,7 +463,7 @@ void FP_LIB_TABLE::FootprintLibDelete( const wxString& aNickname )
|
||||
void FP_LIB_TABLE::FootprintLibCreate( const wxString& aNickname )
|
||||
{
|
||||
const FP_LIB_TABLE_ROW* row = FindRow( aNickname, true );
|
||||
wxASSERT( (PCB_IO*) row->plugin );
|
||||
wxASSERT( row->plugin );
|
||||
row->plugin->CreateLibrary( row->GetFullURI( true ), row->GetProperties() );
|
||||
}
|
||||
|
||||
|
@ -561,7 +561,7 @@ bool DIALOG_SHEET_PROPERTIES::onSheetFilenameChanged( const wxString& aNewFilena
|
||||
|
||||
if( renameFile )
|
||||
{
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||
|
||||
// If the associated screen is shared by more than one sheet, do not
|
||||
// change the filename of the corresponding screen here.
|
||||
|
@ -172,7 +172,7 @@ protected:
|
||||
STRING_UTF8_MAP choices;
|
||||
|
||||
SCH_IO_MGR::SCH_FILE_T pi_type = SCH_IO_MGR::EnumFromStr( row->GetType() );
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( pi_type ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( pi_type ) );
|
||||
pi->GetLibraryOptions( &choices );
|
||||
|
||||
DIALOG_PLUGIN_OPTIONS dlg( m_dialog, row->GetNickName(), choices, options, &result );
|
||||
@ -256,7 +256,7 @@ PANEL_SYM_LIB_TABLE::PANEL_SYM_LIB_TABLE( DIALOG_EDIT_LIBRARY_TABLES* aParent, P
|
||||
|
||||
for( const SCH_IO_MGR::SCH_FILE_T& type : SCH_IO_MGR::SCH_FILE_T_vector )
|
||||
{
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( type ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( type ) );
|
||||
|
||||
if( !pi )
|
||||
continue;
|
||||
@ -308,7 +308,7 @@ PANEL_SYM_LIB_TABLE::PANEL_SYM_LIB_TABLE( DIALOG_EDIT_LIBRARY_TABLES* aParent, P
|
||||
auto* libTable = static_cast<SYMBOL_LIB_TABLE_GRID*>( grid->GetTable() );
|
||||
auto* tableRow = static_cast<SYMBOL_LIB_TABLE_ROW*>( libTable->at( row ) );
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( tableRow->GetFileType() ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( tableRow->GetFileType() ) );
|
||||
|
||||
if( pi )
|
||||
{
|
||||
@ -585,7 +585,7 @@ void PANEL_SYM_LIB_TABLE::browseLibrariesHandler( wxCommandEvent& event )
|
||||
|
||||
for( const SCH_IO_MGR::SCH_FILE_T& fileType : SCH_IO_MGR::SCH_FILE_T_vector )
|
||||
{
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( fileType ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( fileType ) );
|
||||
|
||||
if( !pi )
|
||||
continue;
|
||||
@ -936,8 +936,8 @@ bool PANEL_SYM_LIB_TABLE::convertLibrary( STRING_UTF8_MAP* aOldFileProps, const
|
||||
if( oldFileType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
|
||||
return false;
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER oldFilePI( SCH_IO_MGR::FindPlugin( oldFileType ) );
|
||||
SCH_IO::SCH_IO_RELEASER kicadPI( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||
IO_RELEASER<SCH_IO> oldFilePI( SCH_IO_MGR::FindPlugin( oldFileType ) );
|
||||
IO_RELEASER<SCH_IO> kicadPI( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||
std::vector<LIB_SYMBOL*> symbols;
|
||||
std::vector<LIB_SYMBOL*> newSymbols;
|
||||
std::map<LIB_SYMBOL*, LIB_SYMBOL*> symbolMap;
|
||||
|
@ -121,8 +121,7 @@ SCHEMATIC* EESCHEMA_HELPERS::LoadSchematic( wxString& aFileName, SCH_IO_MGR::SCH
|
||||
if( !project )
|
||||
project = GetDefaultProject();
|
||||
|
||||
SCH_IO* plugin = SCH_IO_MGR::FindPlugin( aFormat );
|
||||
SCH_IO::SCH_IO_RELEASER pi( plugin );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( aFormat ) );
|
||||
|
||||
SCHEMATIC* schematic = new SCHEMATIC( project );
|
||||
|
||||
|
@ -248,8 +248,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
|
||||
|
||||
SetScreen( nullptr );
|
||||
|
||||
SCH_IO* plugin = SCH_IO_MGR::FindPlugin( schFileType );
|
||||
SCH_IO::SCH_IO_RELEASER pi( plugin );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( schFileType ) );
|
||||
|
||||
pi->SetProgressReporter( &progressReporter );
|
||||
|
||||
@ -670,7 +669,7 @@ void SCH_EDIT_FRAME::OnImportProject( wxCommandEvent& aEvent )
|
||||
if( fileType == SCH_IO_MGR::SCH_KICAD || fileType == SCH_IO_MGR::SCH_LEGACY )
|
||||
continue; // this is "Import non-KiCad schematic"
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( fileType ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( fileType ) );
|
||||
|
||||
if( !pi )
|
||||
continue;
|
||||
@ -725,7 +724,7 @@ void SCH_EDIT_FRAME::OnImportProject( wxCommandEvent& aEvent )
|
||||
|
||||
for( const SCH_IO_MGR::SCH_FILE_T& fileType : SCH_IO_MGR::SCH_FILE_T_vector )
|
||||
{
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( fileType ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( fileType ) );
|
||||
|
||||
if( !pi )
|
||||
continue;
|
||||
@ -798,7 +797,7 @@ bool SCH_EDIT_FRAME::saveSchematicFile( SCH_SHEET* aSheet, const wxString& aSave
|
||||
if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
|
||||
pluginType = SCH_IO_MGR::SCH_KICAD;
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( pluginType ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( pluginType ) );
|
||||
|
||||
try
|
||||
{
|
||||
@ -1331,12 +1330,12 @@ bool SCH_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType,
|
||||
|
||||
try
|
||||
{
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( fileType ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( fileType ) );
|
||||
DIALOG_HTML_REPORTER errorReporter( this );
|
||||
WX_PROGRESS_REPORTER progressReporter( this, _( "Importing Schematic" ), 1 );
|
||||
|
||||
PROJECT_CHOOSER_PLUGIN* projectChooserPlugin =
|
||||
dynamic_cast<PROJECT_CHOOSER_PLUGIN*>( (SCH_IO*) pi );
|
||||
dynamic_cast<PROJECT_CHOOSER_PLUGIN*>( pi.get() );
|
||||
|
||||
if( projectChooserPlugin )
|
||||
{
|
||||
|
@ -862,7 +862,7 @@ bool SYMBOL_LIB_TABLE_RESCUER::WriteRescueLibrary( wxWindow *aParent )
|
||||
|
||||
try
|
||||
{
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||
|
||||
for( const std::unique_ptr<LIB_SYMBOL>& symbol : m_rescueLibSymbols )
|
||||
pi->SaveSymbol( fn.GetFullPath(), new LIB_SYMBOL( *symbol.get() ), m_properties.get() );
|
||||
|
@ -355,7 +355,7 @@ SCH_SHEET* SCH_IO_ALTIUM::LoadSchematicFile( const wxString& aFileName, SCHEMATI
|
||||
|
||||
wxCHECK_MSG( libTable, nullptr, "Could not load symbol lib table." );
|
||||
|
||||
m_pi.set( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||
m_pi.reset( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||
|
||||
/// @note No check is being done here to see if the existing symbol library exists so this
|
||||
/// will overwrite the existing one.
|
||||
|
@ -178,8 +178,8 @@ private:
|
||||
wxString m_libName; // Library name to save symbols
|
||||
bool m_isIntLib; // Flag to indicate Integrated Library
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER m_pi; // Plugin to create KiCad symbol library.
|
||||
std::unique_ptr<STRING_UTF8_MAP> m_properties; // Library plugin properties.
|
||||
IO_RELEASER<SCH_IO> m_pi; // Plugin to create KiCad symbol library.
|
||||
std::unique_ptr<STRING_UTF8_MAP> m_properties; // Library plugin properties.
|
||||
|
||||
std::unique_ptr<TITLE_BLOCK> m_currentTitleBlock; // Will be assigned at the end of parsing
|
||||
// a sheet
|
||||
|
@ -115,8 +115,7 @@ SCH_SHEET* SCH_IO_CADSTAR_ARCHIVE::LoadSchematicFile( const wxString& aFi
|
||||
wxFileName libFileName( aSchematic->Prj().GetProjectPath(), libName,
|
||||
FILEEXT::KiCadSymbolLibFileExtension );
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER sch_plugin;
|
||||
sch_plugin.set( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||
IO_RELEASER<SCH_IO> sch_plugin( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||
|
||||
if( !libTable->HasLibrary( libName ) )
|
||||
{
|
||||
|
@ -455,7 +455,7 @@ SCH_SHEET* SCH_IO_EAGLE::LoadSchematicFile( const wxString& aFileName, SCHEMATIC
|
||||
|
||||
wxCHECK_MSG( libTable, nullptr, wxT( "Could not load symbol lib table." ) );
|
||||
|
||||
m_pi.set( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||
m_pi.reset( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||
m_properties = std::make_unique<STRING_UTF8_MAP>();
|
||||
( *m_properties )[SCH_IO_KICAD_LEGACY::PropBuffering] = "";
|
||||
|
||||
|
@ -247,8 +247,8 @@ private:
|
||||
std::map<wxString, EAGLE_LIBRARY> m_eagleLibs;
|
||||
std::unordered_map<wxString, bool> m_userValue; ///< deviceset/@uservalue for device.
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER m_pi; ///< PI to create KiCad symbol library.
|
||||
std::unique_ptr<STRING_UTF8_MAP> m_properties; ///< Library plugin properties.
|
||||
IO_RELEASER<SCH_IO> m_pi; ///< PI to create KiCad symbol library.
|
||||
std::unique_ptr<STRING_UTF8_MAP> m_properties; ///< Library plugin properties.
|
||||
|
||||
unsigned m_doneCount;
|
||||
unsigned m_lastProgressCount;
|
||||
|
@ -540,8 +540,7 @@ SCH_SHEET* SCH_IO_EASYEDAPRO::LoadSchematicFile( const wxString& aFileName,
|
||||
};
|
||||
EASYEDAPRO::IterateZipFiles( aFileName, cbs );
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER sch_plugin;
|
||||
sch_plugin.set( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||
IO_RELEASER<SCH_IO> sch_plugin( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||
|
||||
if( !libTable->HasLibrary( libName ) )
|
||||
{
|
||||
|
@ -356,57 +356,6 @@ public:
|
||||
*/
|
||||
virtual ~SCH_IO() { }
|
||||
|
||||
|
||||
/**
|
||||
* Helper object to release a #SCH_IO in the context of a potential thrown exception
|
||||
* through its destructor.
|
||||
*/
|
||||
class SCH_IO_RELEASER
|
||||
{
|
||||
SCH_IO* plugin;
|
||||
|
||||
// private assignment operator so it's illegal
|
||||
SCH_IO_RELEASER& operator=( SCH_IO_RELEASER& aOther ) { return *this; }
|
||||
|
||||
// private copy constructor so it's illegal
|
||||
SCH_IO_RELEASER( const SCH_IO_RELEASER& aOther ) {}
|
||||
|
||||
public:
|
||||
SCH_IO_RELEASER( SCH_IO* aPlugin = nullptr ) :
|
||||
plugin( aPlugin )
|
||||
{
|
||||
}
|
||||
|
||||
~SCH_IO_RELEASER()
|
||||
{
|
||||
if( plugin )
|
||||
release();
|
||||
}
|
||||
|
||||
void release()
|
||||
{
|
||||
SCH_IO_MGR::ReleasePlugin( plugin );
|
||||
plugin = nullptr;
|
||||
}
|
||||
|
||||
void set( SCH_IO* aPlugin )
|
||||
{
|
||||
if( plugin )
|
||||
release();
|
||||
plugin = aPlugin;
|
||||
}
|
||||
|
||||
operator SCH_IO* () const
|
||||
{
|
||||
return plugin;
|
||||
}
|
||||
|
||||
SCH_IO* operator -> () const
|
||||
{
|
||||
return plugin;
|
||||
}
|
||||
};
|
||||
|
||||
protected:
|
||||
|
||||
SCH_IO( const wxString& aName ) : IO_BASE( aName )
|
||||
|
@ -79,16 +79,6 @@ SCH_IO* SCH_IO_MGR::FindPlugin( SCH_FILE_T aFileType )
|
||||
}
|
||||
|
||||
|
||||
void SCH_IO_MGR::ReleasePlugin( SCH_IO* aPlugin )
|
||||
{
|
||||
// This function is a place holder for a future point in time where
|
||||
// the plugin is a DLL/DSO. It could do reference counting, and then
|
||||
// unload the DLL/DSO when count goes to zero.
|
||||
|
||||
delete aPlugin;
|
||||
}
|
||||
|
||||
|
||||
const wxString SCH_IO_MGR::ShowType( SCH_FILE_T aType )
|
||||
{
|
||||
// keep this function in sync with EnumFromStr() relative to the
|
||||
@ -158,7 +148,7 @@ SCH_IO_MGR::SCH_FILE_T SCH_IO_MGR::GuessPluginTypeFromLibPath( const wxString& a
|
||||
if( ( aCtl & KICTL_NONKICAD_ONLY ) && isKiCad )
|
||||
continue;
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( fileType ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( fileType ) );
|
||||
|
||||
if( !pi )
|
||||
continue;
|
||||
@ -184,7 +174,7 @@ SCH_IO_MGR::SCH_FILE_T SCH_IO_MGR::GuessPluginTypeFromSchPath( const wxString& a
|
||||
if( ( aCtl & KICTL_NONKICAD_ONLY ) && isKiCad )
|
||||
continue;
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( fileType ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( fileType ) );
|
||||
|
||||
if( !pi )
|
||||
continue;
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include <reporter.h>
|
||||
#include <i18n_utility.h>
|
||||
#include <io/io_base.h>
|
||||
#include <io/io_mgr.h>
|
||||
#include <wx/arrstr.h>
|
||||
|
||||
|
||||
@ -47,7 +48,7 @@ class PROGRESS_REPORTER;
|
||||
/**
|
||||
* A factory which returns an instance of a #SCH_IO.
|
||||
*/
|
||||
class SCH_IO_MGR
|
||||
class SCH_IO_MGR : public IO_MGR
|
||||
{
|
||||
public:
|
||||
|
||||
@ -78,26 +79,14 @@ public:
|
||||
* Return a #SCH_IO which the caller can use to import, export, save, or load
|
||||
* design documents.
|
||||
*
|
||||
* The returned #SCH_IO, may be reference counted, so please call PluginRelease()
|
||||
* when you are done using the returned #SCH_IO. It may or may not be code running
|
||||
* from a DLL/DSO.
|
||||
*
|
||||
* @param aFileType is from #SCH_FILE_T and tells which plugin to find.
|
||||
*
|
||||
* @return the plugin corresponding to aFileType or NULL if not found.
|
||||
* Caller owns the returned object, and must call PluginRelease when done using it.
|
||||
* Caller owns the returned object.
|
||||
*/
|
||||
APIEXPORT
|
||||
static SCH_IO* FindPlugin( SCH_FILE_T aFileType );
|
||||
|
||||
/**
|
||||
* Release a #SCH_IO back to the system, and may cause it to be unloaded from memory.
|
||||
*
|
||||
* @param aPlugin is the one to be released, and which is no longer usable
|
||||
* after calling this.
|
||||
*/
|
||||
static void ReleasePlugin( SCH_IO* aPlugin );
|
||||
|
||||
/**
|
||||
* Return a brief name for a plugin, given aFileType enum.
|
||||
*/
|
||||
|
@ -169,7 +169,7 @@ bool SCH_EDIT_FRAME::LoadSheetFromFile( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHier
|
||||
if( schFileType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
|
||||
schFileType = SCH_IO_MGR::SCH_KICAD;
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( schFileType ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( schFileType ) );
|
||||
std::unique_ptr< SCH_SHEET> tmpSheet = std::make_unique<SCH_SHEET>( &Schematic() );
|
||||
|
||||
// This will cause the sheet UUID to be set to the UUID of the aSheet argument. This is
|
||||
|
@ -56,7 +56,7 @@ void SYMBOL_EDIT_FRAME::ImportSymbol()
|
||||
if( fileType == SCH_IO_MGR::SCH_KICAD || fileType == SCH_IO_MGR::SCH_LEGACY )
|
||||
continue; // this is "Import non-KiCad schematic"
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( fileType ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( fileType ) );
|
||||
|
||||
if( !pi )
|
||||
continue;
|
||||
@ -98,7 +98,7 @@ void SYMBOL_EDIT_FRAME::ImportSymbol()
|
||||
return;
|
||||
}
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( piType ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( piType ) );
|
||||
|
||||
// TODO dialog to select the symbol to be imported if there is more than one
|
||||
try
|
||||
@ -173,7 +173,7 @@ void SYMBOL_EDIT_FRAME::ExportSymbol()
|
||||
if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
|
||||
pluginType = SCH_IO_MGR::SCH_KICAD;
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( pluginType ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( pluginType ) );
|
||||
|
||||
if( fn.FileExists() )
|
||||
{
|
||||
|
@ -82,7 +82,7 @@ bool SYMBOL_LIB_TABLE_ROW::Refresh()
|
||||
{
|
||||
wxArrayString dummyList;
|
||||
|
||||
plugin.set( SCH_IO_MGR::FindPlugin( type ) );
|
||||
plugin.reset( SCH_IO_MGR::FindPlugin( type ) );
|
||||
SetLoaded( false );
|
||||
plugin->SetLibTable( static_cast<SYMBOL_LIB_TABLE*>( GetParent() ) );
|
||||
plugin->EnumerateSymbolLib( dummyList, GetFullURI( true ), GetProperties() );
|
||||
@ -110,8 +110,7 @@ void SYMBOL_LIB_TABLE_ROW::ShowSettingsDialog( wxWindow* aParent ) const
|
||||
if( type != SCH_IO_MGR::SCH_DATABASE )
|
||||
return;
|
||||
|
||||
DIALOG_DATABASE_LIB_SETTINGS dlg( aParent,
|
||||
static_cast<SCH_IO_DATABASE*>( ( SCH_IO* )plugin ) );
|
||||
DIALOG_DATABASE_LIB_SETTINGS dlg( aParent, static_cast<SCH_IO_DATABASE*>( plugin.get() ) );
|
||||
dlg.ShowModal();
|
||||
}
|
||||
|
||||
|
@ -133,11 +133,11 @@ private:
|
||||
|
||||
void setPlugin( SCH_IO* aPlugin )
|
||||
{
|
||||
plugin.set( aPlugin );
|
||||
plugin.reset( aPlugin );
|
||||
}
|
||||
|
||||
SCH_IO::SCH_IO_RELEASER plugin;
|
||||
LIB_T type;
|
||||
IO_RELEASER<SCH_IO> plugin;
|
||||
LIB_T type;
|
||||
};
|
||||
|
||||
|
||||
|
@ -173,7 +173,8 @@ bool SYMBOL_LIBRARY_MANAGER::SaveLibrary( const wxString& aLibrary, const wxStri
|
||||
wxCHECK( aFileType != SCH_IO_MGR::SCH_FILE_T::SCH_LEGACY && LibraryExists( aLibrary ), false );
|
||||
wxFileName fn( aFileName );
|
||||
wxCHECK( !fn.FileExists() || fn.IsFileWritable(), false );
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( aFileType ) );
|
||||
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( aFileType ) );
|
||||
bool res = true; // assume all libraries are successfully saved
|
||||
|
||||
STRING_UTF8_MAP properties;
|
||||
|
@ -422,7 +422,7 @@ int SCH_EDITOR_CONTROL::ExportSymbolsToLibrary( const TOOL_EVENT& aEvent )
|
||||
|
||||
SYMBOL_LIB_TABLE_ROW* row = mgr.GetLibrary( targetLib );
|
||||
SCH_IO_MGR::SCH_FILE_T type = SCH_IO_MGR::EnumFromStr( row->GetType() );
|
||||
SCH_IO::SCH_IO_RELEASER pi( SCH_IO_MGR::FindPlugin( type ) );
|
||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( type ) );
|
||||
|
||||
wxFileName dest = row->GetFullURI( true );
|
||||
dest.Normalize( FN_NORMALIZE_FLAGS | wxPATH_NORM_ENV_VARS );
|
||||
|
@ -84,13 +84,13 @@ private:
|
||||
|
||||
void setPlugin( PCB_IO* aPlugin )
|
||||
{
|
||||
plugin.set( aPlugin );
|
||||
plugin.reset( aPlugin );
|
||||
}
|
||||
|
||||
friend class FP_LIB_TABLE;
|
||||
|
||||
private:
|
||||
PCB_IO::RELEASER plugin;
|
||||
IO_RELEASER<PCB_IO> plugin;
|
||||
PCB_IO_MGR::PCB_FILE_T type;
|
||||
};
|
||||
|
||||
|
43
include/io/io_mgr.h
Normal file
43
include/io/io_mgr.h
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2023 KiCad Developers, see AUTHORS.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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef IO_MGR_H_
|
||||
#define IO_MGR_H_
|
||||
|
||||
#include <memory>
|
||||
|
||||
/**
|
||||
* Helper to hold and release an #IO_BASE object when exceptions are thrown.
|
||||
*
|
||||
* (Wrapper around a std::unique_ptr, but created to allow possible custom deleters
|
||||
* in the future).
|
||||
*/
|
||||
template <class T>
|
||||
using IO_RELEASER = std::unique_ptr<T>;
|
||||
|
||||
|
||||
class IO_MGR
|
||||
{
|
||||
public:
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif // IO_MGR_H_
|
@ -284,8 +284,8 @@ void DIALOG_BOARD_SETUP::onAuxiliaryAction( wxCommandEvent& aEvent )
|
||||
|
||||
PROJECT* otherPrj = m_frame->GetSettingsManager()->GetProject( projectFn.GetFullPath() );
|
||||
|
||||
PCB_IO::RELEASER pi( PCB_IO_MGR::PluginFind( PCB_IO_MGR::KICAD_SEXP ) );
|
||||
BOARD* otherBoard = nullptr;
|
||||
IO_RELEASER<PCB_IO> pi( PCB_IO_MGR::PluginFind( PCB_IO_MGR::KICAD_SEXP ) );
|
||||
BOARD* otherBoard = nullptr;
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -240,7 +240,7 @@ protected:
|
||||
STRING_UTF8_MAP choices;
|
||||
|
||||
PCB_IO_MGR::PCB_FILE_T pi_type = PCB_IO_MGR::EnumFromStr( row->GetType() );
|
||||
PCB_IO::RELEASER pi( PCB_IO_MGR::PluginFind( pi_type ) );
|
||||
IO_RELEASER<PCB_IO> pi( PCB_IO_MGR::PluginFind( pi_type ) );
|
||||
pi->GetLibraryOptions( &choices );
|
||||
|
||||
DIALOG_PLUGIN_OPTIONS dlg( m_dialog, row->GetNickName(), choices, options, &result );
|
||||
@ -514,7 +514,7 @@ void PANEL_FP_LIB_TABLE::populatePluginList()
|
||||
{
|
||||
for( const auto& plugin : PCB_IO_MGR::PLUGIN_REGISTRY::Instance()->AllPlugins() )
|
||||
{
|
||||
PCB_IO::RELEASER pi( plugin.m_createFunc() );
|
||||
IO_RELEASER<PCB_IO> pi( plugin.m_createFunc() );
|
||||
|
||||
if( !pi )
|
||||
continue;
|
||||
@ -899,8 +899,8 @@ bool PANEL_FP_LIB_TABLE::convertLibrary( STRING_UTF8_MAP* aOldFileProps,
|
||||
return false;
|
||||
|
||||
|
||||
PCB_IO::RELEASER oldFilePI( PCB_IO_MGR::PluginFind( oldFileType ) );
|
||||
PCB_IO::RELEASER kicadPI( PCB_IO_MGR::PluginFind( PCB_IO_MGR::KICAD_SEXP ) );
|
||||
IO_RELEASER<PCB_IO> oldFilePI( PCB_IO_MGR::PluginFind( oldFileType ) );
|
||||
IO_RELEASER<PCB_IO> kicadPI( PCB_IO_MGR::PluginFind( PCB_IO_MGR::KICAD_SEXP ) );
|
||||
wxArrayString fpNames;
|
||||
wxFileName newFileName( aNewFilePath );
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user