mirror of
https://github.com/nickshanks/ResKnife.git
synced 2024-12-22 17:30:15 +00:00
100 lines
2.7 KiB
C++
100 lines
2.7 KiB
C++
#include "ResourceObject.h"
|
|
#include "Errors.h"
|
|
#include "string.h"
|
|
|
|
/*** CREATOR ***/
|
|
ResourceObject::ResourceObject( FileWindowPtr owner )
|
|
{
|
|
// set contents to zero
|
|
memset( this, 0, sizeof(ResourceObject) );
|
|
|
|
file = owner;
|
|
nameIconRgn = NewRgn();
|
|
}
|
|
|
|
/*** DESTRUCTOR ***/
|
|
ResourceObject::~ResourceObject( void )
|
|
{
|
|
if( nameIconRgn ) DisposeRgn( nameIconRgn );
|
|
if( data ) DisposeHandle( data );
|
|
}
|
|
|
|
/*** RETAIN ***/
|
|
OSStatus ResourceObject::Retain( void )
|
|
{
|
|
OSStatus error = noErr;
|
|
/* if( retainCount == 0 )
|
|
{
|
|
if( dataFork )
|
|
{
|
|
// open file for reading
|
|
SInt16 refNum;
|
|
error = FSpOpenDF( file->GetFileSpec(), fsRdPerm, &refNum );
|
|
if( error )
|
|
{
|
|
DisplayError( "\pData fork could not be read", "\pThis file appears to be corrupted. Although the resources could be read in correctly, the data fork could not be found. Please run Disk First Aid to correct the problem." );
|
|
return error;
|
|
}
|
|
|
|
// get new handle
|
|
data = NewHandleClear( size );
|
|
if( !data || MemError() )
|
|
{
|
|
DisplayError( "\pNot enough memory to read data fork", "\pPlease quit other applications and try again." );
|
|
FSClose( refNum );
|
|
return memFullErr;
|
|
}
|
|
|
|
// read data fork
|
|
HLock( data );
|
|
error = FSRead( refNum, (long *) &size, *data );
|
|
HUnlock( data );
|
|
FSClose( refNum );
|
|
}
|
|
else
|
|
{
|
|
LoadResource( data );
|
|
}
|
|
}
|
|
*/ retainCount++;
|
|
return error;
|
|
}
|
|
|
|
/*** RELEASE ***/
|
|
void ResourceObject::Release( void )
|
|
{
|
|
if( retainCount > 0 )
|
|
{
|
|
/* if( retainCount == 1 )
|
|
DisposeHandle( data );
|
|
*/ retainCount--;
|
|
}
|
|
}
|
|
|
|
/*** SET RESOURCE DIRTY ***/
|
|
void ResourceObject::SetDirty( Boolean value )
|
|
{
|
|
dirty = value;
|
|
file->SetFileDirty( value );
|
|
|
|
// being here indicates the resource size parameter also needs updating
|
|
size = GetHandleSize( data );
|
|
|
|
// bug: should now tell all open copies of this resource to update themselves
|
|
}
|
|
|
|
/*** RES INFO RECORD ACCESSORS ***/
|
|
FileWindowPtr ResourceObject::File( void ) { return file; }
|
|
ResourceObjectPtr ResourceObject::Next( void ) { return next; }
|
|
Boolean ResourceObject::Dirty( void ) { return dirty; }
|
|
void ResourceObject::Select( Boolean select ) { selected = select; }
|
|
Boolean ResourceObject::Selected( void ) { return selected; }
|
|
DataBrowserItemID ResourceObject::Number( void ) { return number; }
|
|
Boolean ResourceObject::RepresentsDataFork( void ) { return dataFork; }
|
|
|
|
Handle ResourceObject::Data( void ) { return data; }
|
|
UInt8* ResourceObject::Name( void ) { return name; }
|
|
UInt32 ResourceObject::Size( void ) { return size; }
|
|
ResType ResourceObject::Type( void ) { return type; }
|
|
SInt16 ResourceObject::ID( void ) { return resID; }
|
|
SInt16 ResourceObject::Attributes( void ) { return attribs; } |