home *** CD-ROM | disk | FTP | other *** search
- /*---------------------------------------------------------------
-
- CPlugin.cpp
-
- A wrapper class for a plugin.
-
- Provides an easy way to managed loading an unloading.
-
- ---------------------------------------------------------------*/
-
- #include "CPlugin.h"
-
-
- CPlugin::CPlugin( FSSpec& inSpec)
- :mIsLoaded(false),
- mPluginSpec( inSpec ),
- mConnID( 0 ),
- mGetIntfProc( 0 ),
- mRefCount( 0 )
- {
-
- }
-
- CPlugin::~CPlugin()
- {
- if ( mIsLoaded == true ) Unload();
- }
-
- bool CPlugin::Valid()
- {
- OSErr err = Load( true );
- if ( err == noErr ) Unload();
- return ( err == noErr );
-
- }
-
- OSErr CPlugin::Load( bool load )
- {
- mRefCount++;
- if ( mIsLoaded == true ) return noErr;
-
- // try and connect to the DLL
- Str255 errname;
- Ptr entrypt;
- Str255 fragName = "\p";
- CFragLoadOptions flags = kReferenceCFrag;
-
- if ( load == false ) flags = kFindCFrag;
-
- OSErr status = ::GetDiskFragment( &mPluginSpec,
- 0,
- kCFragGoesToEOF,
- fragName,
- flags,
- &mConnID,
- &entrypt,
- errname );
-
- if (status == noErr && load == true) {
- Ptr symAddr;
- CFragSymbolClass symClass;
- Str255 pstr_name = "\pGetInterfaceProvider";
-
- if ( ::FindSymbol( mConnID, pstr_name, &symAddr, &symClass) == noErr)
- {
- mGetIntfProc = (GetInterfaceProviderProc) symAddr;
- mIntfProvider = (mGetIntfProc)();
- }
- mIsLoaded = true;
- }
-
- return status;
- }
-
-
- OSErr CPlugin::Unload()
- {
- OSErr err = noErr;
-
- mRefCount--;
- if ( mRefCount == 0 ) {
-
- CFragConnectionID theConnID = mConnID;
- OSErr err = ::CloseConnection( &mConnID );
- if ( err == noErr ) {
- mConnID = 0 ;
- mIsLoaded = false;
- }
- }
-
- if ( mRefCount < 0 ) Debugger();
-
- return err;
- }
-
- OSErr CPlugin::GetInterfacePointer( unsigned long inID, void** outInterfacePtr )
- {
- return mIntfProvider->GetInterfacePointer( inID, outInterfacePtr );
- }
-