mirror of
https://github.com/nickshanks/ResKnife.git
synced 2024-08-31 19:29:11 +00:00
95 lines
3.5 KiB
C++
95 lines
3.5 KiB
C++
|
#include "PlugObject.h"
|
||
|
#include "Errors.h"
|
||
|
extern globals g;
|
||
|
|
||
|
/*** LOAD EDITOR ***/
|
||
|
OSStatus LoadEditor( ResourceObjectPtr resource, ConstStr63Param libName )
|
||
|
{
|
||
|
// create editor window structure and save resource to be edited into it
|
||
|
OSStatus error = noErr;
|
||
|
PlugObjectPtr plug = (PlugObjectPtr) NewPtrClear( sizeof(PlugObject) ); // bug: this function calls itself, so memory leak may exist here
|
||
|
if( !plug ) return memFullErr; // another bug: should check if plug already has associated PlugObject (ie it is loaded already) - globalRefCon won't work
|
||
|
|
||
|
|
||
|
// load editor's library into memory
|
||
|
CFragConnectionID connID = null;
|
||
|
Ptr mainAddr = null;
|
||
|
Str255 errMessage;
|
||
|
error = GetSharedLibrary( libName, kPowerPCCFragArch, kLoadCFrag, &connID, &mainAddr, errMessage );
|
||
|
DebugError( errMessage );
|
||
|
if( error )
|
||
|
{
|
||
|
if( EqualString( libName, "\pHex Editor", true, true ) )
|
||
|
{
|
||
|
DisposePtr( (Ptr) plug ); // only dispose if was created just now
|
||
|
DisplayError( "\pNo editors are available for this resource!", "\pI suggest you reinstall the program." );
|
||
|
return error;
|
||
|
}
|
||
|
else if( EqualString( libName, "\pTemplate Editor", true, true ) )
|
||
|
{
|
||
|
error = LoadEditor( resource, "\pHex Editor" );
|
||
|
return error;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
error = LoadEditor( resource, "\pTemplate Editor" );
|
||
|
if( error )
|
||
|
error = LoadEditor( resource, "\pHex Editor" );
|
||
|
return error;
|
||
|
}
|
||
|
}
|
||
|
plug->SetConnectionID( connID );
|
||
|
|
||
|
// find and call InitInstance symbol
|
||
|
InitPlugProcPtr symAddr;
|
||
|
CFragSymbolClass symClass;
|
||
|
error = FindSymbol( connID, "\pPlug_InitInstance", (Ptr *) &symAddr, &symClass );
|
||
|
if( error )
|
||
|
{
|
||
|
DisposePtr( (Ptr) plug ); // only dispose if was created just now
|
||
|
if( g.debug ) DebugError( "\pPlug_InitInstance() could not be found." );
|
||
|
else DisplayError( "\pCannot load up requested editor.", "\pPlease obtain an update from the plug-in's author." );
|
||
|
return error;
|
||
|
}
|
||
|
error = (* symAddr)( plug, resource );
|
||
|
if( error )
|
||
|
{
|
||
|
DisposePtr( (Ptr) plug ); // only dispose if was created just now
|
||
|
DebugError( "\pPlug_InitInstance() returned an error. This is quite normal for the Template Editor, thus if no XXXX Editor exists, and no template is found, you will see this dialog, then a hex editor appear." );
|
||
|
}
|
||
|
return error;
|
||
|
}
|
||
|
|
||
|
/*** UNLOAD EDITOR ***/
|
||
|
OSStatus UnloadEditor( PlugObjectPtr plug )
|
||
|
{
|
||
|
#pragma unused( plug )
|
||
|
OSStatus error = noErr;
|
||
|
CFragConnectionID connID = plug->GetConnectionID();
|
||
|
|
||
|
// find and call DisposeEditor symbol
|
||
|
/* DisposePlugProcPtr symAddr;
|
||
|
CFragSymbolClass symClass;
|
||
|
error = FindSymbol( connID, "\pPlug_DisposeEditor", (Ptr *) &symAddr, &symClass );
|
||
|
if( error ) return error;
|
||
|
(* symAddr)( plug );
|
||
|
*/
|
||
|
// close connection to editor
|
||
|
error = CloseConnection( &connID );
|
||
|
plug->SetConnectionID( null );
|
||
|
return error;
|
||
|
}
|
||
|
|
||
|
/**************************/
|
||
|
/* CLASS ACCESSOR METHODS */
|
||
|
/**************************/
|
||
|
|
||
|
/*** ACCESSORS ***/
|
||
|
void PlugObject::SetRefCon( UInt32 value ) { refcon = value; }
|
||
|
UInt32 PlugObject::GetRefCon( void ) { return refcon; }
|
||
|
CFragConnectionID PlugObject::GetConnectionID( void ) { return connID; }
|
||
|
void PlugObject::SetConnectionID( CFragConnectionID newID ) { connID = newID; }
|
||
|
WindowObjectPtr PlugObject::GetWindowObject( void ) { return windowObj; }
|
||
|
void PlugObject::SetWindowObject( WindowObjectPtr newWindowObj ) { windowObj = newWindowObj; }
|
||
|
ResourceObjectPtr PlugObject::GetResourceObject( void ) { return resourceObj; }
|
||
|
void PlugObject::SetResourceObject( ResourceObjectPtr newResourceObj ) { resourceObj = newResourceObj; }
|