mirror of
https://github.com/nickshanks/ResKnife.git
synced 2024-06-07 11:29:29 +00:00
247 lines
5.8 KiB
C++
247 lines
5.8 KiB
C++
#include "Utility.h"
|
|
|
|
/**********************/
|
|
/* QUICKDRAW ROUTINES */
|
|
/**********************/
|
|
|
|
/*** SET COLOUR ***/
|
|
void SetColour(RGBColor *colour, UInt16 red, UInt16 green, UInt16 blue)
|
|
{
|
|
colour->red = red;
|
|
colour->green = green;
|
|
colour->blue = blue;
|
|
}
|
|
|
|
/*** MAKE LOCAL ***/
|
|
void MakeLocal( WindowRef window, Point globalPoint, Point *localPoint )
|
|
{
|
|
GrafPtr oldPort;
|
|
GetPort( &oldPort );
|
|
SetPortWindowPort( window );
|
|
|
|
localPoint->h = globalPoint.h;
|
|
localPoint->v = globalPoint.v;
|
|
GlobalToLocal( localPoint );
|
|
|
|
SetPort( oldPort );
|
|
}
|
|
|
|
/*** MAKE GLOBAL ***/
|
|
void MakeGlobal( WindowRef window, Point localPoint, Point *globalPoint )
|
|
{
|
|
GrafPtr oldPort;
|
|
GetPort( &oldPort );
|
|
SetPortWindowPort( window );
|
|
|
|
globalPoint->h = localPoint.h;
|
|
globalPoint->v = localPoint.v;
|
|
LocalToGlobal( globalPoint );
|
|
|
|
SetPort( oldPort );
|
|
}
|
|
|
|
/* investigate the call ShieldCursor() - it hides the mouse when it enters a certain rect */
|
|
|
|
/*******************/
|
|
/* STRING ROUTINES */
|
|
/*******************/
|
|
|
|
/*** C STRING LENGTH ***/
|
|
unsigned long CStringLength(char *string)
|
|
{
|
|
unsigned long length;
|
|
Boolean end = false;
|
|
for(length = 0; end == false; length++)
|
|
if(*(string + length) == 0x00) end = true;
|
|
return length;
|
|
}
|
|
|
|
/*** PASCAL STRING LENGTH ***/
|
|
unsigned char PStringLength(unsigned char *string)
|
|
{
|
|
return *string;
|
|
}
|
|
|
|
/*** TYPE TO C STRING ***/
|
|
void TypeToCString(const OSType type, char *string)
|
|
{
|
|
BlockMoveData(&type, &string[0], sizeof(OSType));
|
|
string[sizeof(OSType)] = 0x00;
|
|
}
|
|
|
|
/*** TYPE TO PASCAL STRING ***/
|
|
void TypeToPString(const OSType type, Str255 string)
|
|
{
|
|
string[0] = sizeof(OSType);
|
|
BlockMoveData(&type, &string[1], sizeof(OSType));
|
|
}
|
|
|
|
/*** TYPE TO CORE FOUNDATION STRING ***/
|
|
void TypeToCFString(const OSType type, CFStringRef *string)
|
|
{
|
|
char cString[5];
|
|
TypeToCString(type, (char *) &cString);
|
|
*string = CFStringCreateWithCString(CFAllocatorGetDefault(), (char *) &cString, kCFStringEncodingMacRoman);
|
|
}
|
|
|
|
/*** COPY C STRING ***/
|
|
void CopyCString(const UInt8 *source, UInt8 *dest)
|
|
{
|
|
//#pragma warning off
|
|
while(*dest++ = *source++);
|
|
//#pragma warning reset
|
|
}
|
|
|
|
/*** COPY PASCAL STRING ***/
|
|
void CopyPString(const UInt8 *source, UInt8 *dest)
|
|
{
|
|
UInt8 length = *source, count;
|
|
for(count = 0; count <= length; count++)
|
|
*dest++ = *source++;
|
|
}
|
|
|
|
/*** EQUAL C STRINGS ***/
|
|
Boolean EqualCStrings(UInt8 *source, UInt8 *dest)
|
|
{
|
|
while(*source != 0x00)
|
|
if(*source++ != *dest++) return false;
|
|
return true;
|
|
}
|
|
|
|
/*** EQUAL PASCAL STRINGS ***/
|
|
Boolean EqualPStrings(UInt8 *source, UInt8 *dest)
|
|
{
|
|
UInt8 length = *source, count;
|
|
for(count = 0; count <= length; count++)
|
|
if(*source++ != *dest++) return false;
|
|
return true;
|
|
}
|
|
|
|
/*** APPEND ONE PASCAL STRING ONTO ANOTHER ***/
|
|
void AppendPString(Str255 original, ConstStr255Param added)
|
|
{
|
|
short numberBytes = added[0]; // length of string to be added
|
|
short totalLength = added[0] + original[0];
|
|
|
|
if(totalLength > 255) // too long, adjust number of bytes to add
|
|
{
|
|
totalLength = 255;
|
|
numberBytes = totalLength - original[0];
|
|
}
|
|
|
|
BlockMoveData(&added[1], &original[totalLength-numberBytes + 1], numberBytes);
|
|
original[0] = totalLength; // new length of original string
|
|
while(++totalLength <= 255)
|
|
original[totalLength] = 0x00; // set rest of string to zero
|
|
}
|
|
|
|
/*****************/
|
|
/* MENU ROUTINES */
|
|
/*****************/
|
|
|
|
/*** MENU ITEM ENABLE ***/
|
|
void MenuItemEnable(MenuRef menu, MenuItemIndex item, Boolean enable)
|
|
{
|
|
#if !TARGET_API_MAC_CARBON
|
|
if(g.systemVersion >= kMacOS85)
|
|
{
|
|
#endif
|
|
if(enable) EnableMenuItem(menu, item);
|
|
else DisableMenuItem(menu, item);
|
|
#if !TARGET_API_MAC_CARBON
|
|
}
|
|
else
|
|
{
|
|
if(enable) EnableItem(menu, item);
|
|
else DisableItem(menu, item);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/*** ENABLE MENU COMMAND ***/
|
|
void EnableCommand(MenuRef menu, MenuCommand command, Boolean enable)
|
|
{
|
|
if(enable) EnableMenuCommand(menu, command);
|
|
else DisableMenuCommand(menu, command);
|
|
}
|
|
|
|
/******************/
|
|
/* FILE UTILITIES */
|
|
/******************/
|
|
|
|
/* MakeRelativeAliasFile creates a new alias file located at
|
|
aliasDest referring to the targetFile. relative path
|
|
information is stored in the new file. */
|
|
|
|
/* MAKE RELATIVE ALIAS FILE */
|
|
OSErr MakeRelativeAliasFile(FSSpec *targetFile, FSSpec *aliasDest)
|
|
{
|
|
OSErr error;
|
|
FInfo fndrInfo;
|
|
AliasHandle theAlias = NULL;
|
|
Boolean fileCreated = false;
|
|
SInt16 rsrc = -1;
|
|
|
|
// set up our the alias' file information
|
|
error = FSpGetFInfo(targetFile, &fndrInfo);
|
|
if(error != noErr) goto bail;
|
|
if(fndrInfo.fdType == 'APPL')
|
|
fndrInfo.fdType = kApplicationAliasType;
|
|
fndrInfo.fdFlags = kIsAlias; // implicitly clear the inited bit
|
|
|
|
// create the new file
|
|
FSpCreateResFile(aliasDest, 'TEMP', 'TEMP', smSystemScript);
|
|
if((error = ResError()) != noErr) goto bail;
|
|
fileCreated = true;
|
|
|
|
// set the file information or the new file
|
|
error = FSpSetFInfo(aliasDest, &fndrInfo);
|
|
if(error != noErr) goto bail;
|
|
|
|
// create the alias record, relative to the new alias file
|
|
error = NewAlias(aliasDest, targetFile, &theAlias);
|
|
if(error != noErr) goto bail;
|
|
|
|
// save the resource
|
|
rsrc = FSpOpenResFile(aliasDest, fsRdWrPerm);
|
|
if(rsrc == -1)
|
|
{
|
|
error = ResError();
|
|
goto bail;
|
|
}
|
|
UseResFile(rsrc);
|
|
AddResource((Handle) theAlias, rAliasType, 0, aliasDest->name);
|
|
error = ResError();
|
|
if(error != noErr) goto bail;
|
|
theAlias = NULL;
|
|
CloseResFile(rsrc);
|
|
rsrc = -1;
|
|
error = ResError();
|
|
if(error != noErr) goto bail;
|
|
|
|
// done
|
|
return noErr;
|
|
bail:
|
|
if(rsrc != -1) CloseResFile(rsrc);
|
|
if(fileCreated) FSpDelete(aliasDest);
|
|
if(theAlias != NULL) DisposeHandle((Handle) theAlias);
|
|
return error;
|
|
}
|
|
|
|
/**********************/
|
|
/* INTERNET UTILITIES */
|
|
/**********************/
|
|
|
|
/*** LAUNCH WEB BROWSER ***/
|
|
OSStatus LaunchURL(char *url)
|
|
{
|
|
OSStatus error = noErr;
|
|
ICInstance instance;
|
|
error = ICStart(&instance, 'rsrc');
|
|
if(error != noErr) return error;
|
|
|
|
SInt32 start = 0, length = CStringLength(url);
|
|
error = ICLaunchURL(instance, NULL, url, length, &start, &length);
|
|
ICStop(instance);
|
|
return error;
|
|
} |