KIWAY_PLAYER* KIWAY::Player( FRAME_T aFrameType, bool doCreate, KIWAY_PLAYER* aParent ) { // Since this will be called from python, cannot assume that code will // not pass a bad aFrameType. if( unsigned( aFrameType ) >= KIWAY_PLAYER_COUNT ) { // @todo : throw an exception here for python's benefit, at least that // way it gets some explanatory text. wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFrameType" ) ); return NULL; } // return the previously opened window KIWAY_PLAYER* frame = GetPlayerFrame( aFrameType ); if( frame ) return frame; if( doCreate ) { FACE_T face_type = KifaceType( aFrameType ); wxASSERT( face_type != FACE_T(-1) ); KIFACE* kiface = KiFACE( face_type ); wxASSERT( kiface ); if( kiface ) { frame = (KIWAY_PLAYER*) kiface->CreateWindow( aParent, // Parent window of frame, NULL in non modal mode aFrameType, this, m_ctl // questionable need, these same flags where passed to the KIFACE::OnKifaceStart() ); wxASSERT( frame ); m_playerFrameName[aFrameType] = frame->GetName(); return frame; } } return NULL; }
FOOTPRINT_PREVIEW_PANEL_BASE* FOOTPRINT_PREVIEW_PANEL_BASE::Create( wxWindow* aParent, KIWAY& aKiway ) { FOOTPRINT_PREVIEW_PANEL_BASE* panel = nullptr; try { KIFACE* kiface = aKiway.KiFACE( KIWAY::FACE_PCB ); auto window = kiface->CreateWindow( aParent, FRAME_PCB_FOOTPRINT_PREVIEW, &aKiway ); panel = dynamic_cast<FOOTPRINT_PREVIEW_PANEL_BASE*>( window ); if( window && !panel ) delete window; } catch( ... ) {} return panel; }
FP_LIB_TABLE* PROJECT::PcbFootprintLibs( KIWAY& aKiway ) { // This is a lazy loading function, it loads the project specific table when // that table is asked for, not before. FP_LIB_TABLE* tbl = (FP_LIB_TABLE*) GetElem( ELEM_FPTBL ); // its gotta be NULL or a FP_LIB_TABLE, or a bug. wxASSERT( !tbl || dynamic_cast<FP_LIB_TABLE*>( tbl ) ); if( !tbl ) { // Build a new project specific FP_LIB_TABLE with the global table as a fallback. // ~FP_LIB_TABLE() will not touch the fallback table, so multiple projects may // stack this way, all using the same global fallback table. KIFACE* kiface = aKiway.KiFACE( KIWAY::FACE_PCB ); if( kiface ) tbl = (FP_LIB_TABLE*) kiface->IfaceOrAddress( KIFACE_NEW_FOOTPRINT_TABLE ); wxASSERT( tbl ); SetElem( ELEM_FPTBL, tbl ); wxString projectFpLibTableFileName = FootprintLibTblName(); try { tbl->Load( projectFpLibTableFileName ); } catch( const IO_ERROR& ioe ) { DisplayErrorMessage( NULL, _( "Error loading project footprint library table" ), ioe.What() ); } } return tbl; }
KIFACE* KIWAY::KiFACE( FACE_T aFaceId, bool doLoad ) { // Since this will be called from python, cannot assume that code will // not pass a bad aFaceId. if( unsigned( aFaceId ) >= DIM( m_kiface ) ) { // @todo : throw an exception here for python's benefit, at least that // way it gets some explanatory text. wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFaceId" ) ); return NULL; } // return the previously loaded KIFACE, if it was. if( m_kiface[aFaceId] ) return m_kiface[aFaceId]; // DSO with KIFACE has not been loaded yet, does caller want to load it? if( doLoad ) { wxString dname = dso_full_path( aFaceId ); wxDynamicLibrary dso; void* addr = NULL; if( !dso.Load( dname, wxDL_VERBATIM | wxDL_NOW | wxDL_GLOBAL ) ) { // Failure: error reporting UI was done via wxLogSysError(). // No further reporting required here. } else if( ( addr = dso.GetSymbol( wxT( KIFACE_INSTANCE_NAME_AND_VERSION ) ) ) == NULL ) { // Failure: error reporting UI was done via wxLogSysError(). // No further reporting required here. } else { KIFACE_GETTER_FUNC* getter = (KIFACE_GETTER_FUNC*) addr; KIFACE* kiface = getter( &m_kiface_version[aFaceId], KIFACE_VERSION, m_program ); // KIFACE_GETTER_FUNC function comment (API) says the non-NULL is unconditional. wxASSERT_MSG( kiface, wxT( "attempted DSO has a bug, failed to return a KIFACE*" ) ); // Give the DSO a single chance to do its "process level" initialization. // "Process level" specifically means stay away from any projects in there. if( kiface->OnKifaceStart( m_program, m_ctl ) ) { // Tell dso's wxDynamicLibrary destructor not to Unload() the program image. (void) dso.Detach(); return m_kiface[aFaceId] = kiface; } } // In any of the failure cases above, dso.Unload() should be called here // by dso destructor. // However: // There is a file installation bug. We only look for KIFACE_I's which we know // to exist, and we did not find one. If we do not find one, this is an // installation bug. wxString msg = wxString::Format( wxT( "Fatal Installation Bug. File:\n" "'%s'\ncould not be loaded\n" ), GetChars( dname ) ); if( ! wxFileExists( dname ) ) msg << wxT( "It is missing.\n" ); else msg << wxT( "Perhaps a shared library (.dll or .so) file is missing.\n" ); msg << wxT( "From command line: argv[0]:\n'" ); msg << wxStandardPaths::Get().GetExecutablePath() << wxT( "'\n" ); // This is a fatal error, one from which we cannot recover, nor do we want // to protect against in client code which would require numerous noisy // tests in numerous places. So we inform the user that the installation // is bad. This exception will likely not get caught until way up in the // wxApp derivative, at which point the process will exit gracefully. THROW_IO_ERROR( msg ); } return NULL; }
void KICAD_MANAGER_FRAME::OnEditFpLibTable( wxCommandEvent& aEvent ) { KIFACE* kiface = Kiway().KiFACE( KIWAY::FACE_PCB ); kiface->CreateWindow( this, DIALOG_PCB_LIBRARY_TABLE, &Kiway() ); }