home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / Papers / aSEPiA example source / Application / CPlugin.cpp next >
Encoding:
C/C++ Source or Header  |  1999-06-25  |  1.8 KB  |  100 lines  |  [TEXT/CWIE]

  1. /*---------------------------------------------------------------
  2.  
  3.     CPlugin.cpp
  4.     
  5.     A wrapper class for a plugin.
  6.     
  7.     Provides an easy way to managed loading an unloading.
  8.     
  9. ---------------------------------------------------------------*/
  10.  
  11. #include "CPlugin.h"
  12.  
  13.  
  14. CPlugin::CPlugin( FSSpec& inSpec)
  15.     :mIsLoaded(false), 
  16.     mPluginSpec( inSpec ),
  17.     mConnID( 0 ),
  18.     mGetIntfProc( 0 ),
  19.     mRefCount( 0 )
  20. {
  21.  
  22. }
  23.  
  24. CPlugin::~CPlugin()
  25. {
  26.     if ( mIsLoaded == true )  Unload();
  27. }
  28.  
  29. bool CPlugin::Valid()
  30. {
  31.     OSErr err = Load( true );
  32.     if ( err == noErr ) Unload();
  33.     return ( err == noErr );
  34.     
  35. }
  36.  
  37. OSErr    CPlugin::Load( bool load )
  38. {
  39.     mRefCount++;
  40.     if ( mIsLoaded == true ) return noErr;
  41.     
  42.     // try and connect to the DLL
  43.     Str255 errname;
  44.     Ptr entrypt;
  45.     Str255    fragName = "\p";
  46.     CFragLoadOptions    flags = kReferenceCFrag;
  47.     
  48.     if ( load == false ) flags = kFindCFrag;
  49.     
  50.     OSErr status = ::GetDiskFragment(     &mPluginSpec, 
  51.                                         0, 
  52.                                          kCFragGoesToEOF, 
  53.                                          fragName, 
  54.                                          flags, 
  55.                                          &mConnID, 
  56.                                          &entrypt, 
  57.                                         errname );
  58.  
  59.     if (status == noErr && load == true) {
  60.         Ptr symAddr;
  61.         CFragSymbolClass symClass;
  62.         Str255 pstr_name = "\pGetInterfaceProvider";
  63.  
  64.         if ( ::FindSymbol( mConnID, pstr_name, &symAddr, &symClass) == noErr)
  65.         {
  66.             mGetIntfProc = (GetInterfaceProviderProc) symAddr;
  67.             mIntfProvider = (mGetIntfProc)();
  68.         }
  69.         mIsLoaded = true;
  70.     }
  71.     
  72.     return status;
  73. }
  74.  
  75.  
  76. OSErr    CPlugin::Unload()
  77. {
  78.     OSErr    err = noErr;
  79.     
  80.     mRefCount--;
  81.     if ( mRefCount == 0 ) {
  82.  
  83.         CFragConnectionID    theConnID = mConnID;
  84.         OSErr    err = ::CloseConnection( &mConnID );
  85.         if ( err == noErr ) {
  86.             mConnID = 0 ;
  87.             mIsLoaded = false;
  88.         }
  89.     } 
  90.     
  91.     if ( mRefCount < 0 ) Debugger();
  92.         
  93.     return err;
  94. }
  95.  
  96. OSErr    CPlugin::GetInterfacePointer(  unsigned long inID, void** outInterfacePtr )
  97. {
  98.     return mIntfProvider->GetInterfacePointer( inID, outInterfacePtr );
  99. }
  100.