home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************
- *
- * AERMiscSuite.c
- *
- * Apple Event Registry (AER) Miscellaneou Suite support
- *
- ****************************************************************************/
-
- #include "AERMiscSuite.h"
- #include "AppleEvent.h"
-
- #include "OSASupport.h"
-
- #include "Structs.h"
- #include "DocumentADT.h"
-
- #include "Sounds.h" // for Play Sound and Say events
- #include "StringUtils.h"
-
- #include "OSLHelpers.h"
-
- // ---------------------------------------------------------------------------
- // Private Interface
- // ---------------------------------------------------------------------------
-
- static pascal OSErr HandleDoScript (AppleEvent *appleEvent, AppleEvent *reply, long refCon);
- static pascal OSErr HandleAEPlaySound (AppleEvent *appleEvent, AppleEvent *reply, long refCon);
- static pascal OSErr HandleAESayText (AppleEvent *appleEvent, AppleEvent *reply, long refCon);
-
- /*****************************************************************************
- *
- * InstallMiscSuiteHandlers
- *
- * Called by InstallAEHandlers() at program initialization time
- *
- *****************************************************************************/
-
- Boolean
- InstallMiscSuiteHandlers(void)
- {
- Boolean error;
-
- // Do Script
-
- error = AEInstallEventHandler( kAEMiscStandards,
- kAEDoScript,
- NewAEEventHandlerProc(HandleDoScript),
- 0,
- false);
-
- // Play Sound
-
- if (error == noErr)
- error = AEInstallEventHandler(kCoreEventClass,
- kAEPlaySound,
- NewAEEventHandlerProc(HandleAEPlaySound),
- 0,
- false);
-
- // Say
-
- if (error == noErr)
- error = AEInstallEventHandler(kCoreEventClass,
- kAESay,
- NewAEEventHandlerProc(HandleAESayText),
- 0,
- false);
-
- return (error == noErr);
- }
-
-
- /*****************************************************************************
- *
- * HandleDoScript
- *
- * AppleEvent processing to receive an AppleScript & run it
- * The direct parameter can be either typeIntlText or typeAlias
- *
- *****************************************************************************/
-
- static pascal OSErr
- HandleDoScript(AppleEvent *appleEvent, AppleEvent *reply, long refCon)
- {
- #pragma unused (refCon)
-
- OSErr error = noErr;
- AEDesc directObj = {typeNull, nil};
- AEDesc script = {typeNull, nil};
-
- error = AEGetParamDesc(appleEvent, keyDirectObject, typeWildCard, &directObj);
- if (error != noErr)
- goto CleanUp;
-
- switch (directObj.descriptorType)
- {
- case typeObjectSpecifier:
- case typeFSS:
- case typeAlias:
- error = AECoerceDesc(&directObj, typeFSS, &script);
- if (error == noErr)
- {
- FSSpec fsSpec = **(FSSpecHandle)(script.dataHandle);
- FInfo fInfo;
- OSAID scriptID = 0L;
-
- // make sure the file is a compiled AppleScript file
-
- error = FSpGetFInfo(&fsSpec, &fInfo);
- if (error != noErr)
- goto CleanUp;
-
- switch(fInfo.fdType)
- {
- case kOSAFileType: // a compiled script file
- error = LoadCompiledScript(&fsSpec, &scriptID);
- if (error == noErr)
- error = ExecuteScript(scriptID);
- break;
-
- default:
- error = errAEWrongDataType;
- break;
- }
-
- }
- break;
-
- default:
- error = errAEWrongDataType;
- break;
- }
-
- CleanUp:
- AEDisposeDesc(&directObj);
- AEDisposeDesc(&script);
-
- if (reply != NULL && error != noErr)
- AEPutParamPtr(reply, keyErrorNumber, typeLongInteger, (Ptr)&error, sizeof(OSErr));
-
- return error;
- }
-
- /*****************************************************************************
- *
- * HandleAEPlaySound
- *
- *****************************************************************************/
-
- static pascal OSErr
- HandleAEPlaySound(AppleEvent *appleEvent, AppleEvent *reply, long refCon)
- {
- #pragma unused (refCon)
-
- OSErr error;
-
- AEDesc directObject = {typeNull, nil};
-
- short soundResID;
- long aLong;
-
- // The (required) parameter: 'snd ' resource ID
-
- error = AEGetParamDesc(appleEvent, keyDirectObject, typeWildCard, &directObject);
- if (error != noErr)
- goto CleanUp;
-
- switch (directObject.descriptorType)
- {
- case typeLongInteger:
- error = DescToLong(&directObject, &aLong);
- PlaySound((short)aLong);
- break;
-
- case typeShortInteger:
- error = DescToShort(&directObject, &soundResID);
- if (error == noErr)
- {
- PlaySound(soundResID);
- }
-
- default:
- error = errAEEventNotHandled;
- }
-
- CleanUp:
- AEDisposeDesc(&directObject);
-
- if (reply != NULL && reply->descriptorType != typeNull && error != noErr)
- AEPutParamPtr(reply, keyErrorNumber, typeLongInteger, (Ptr)&error, sizeof(OSErr));
-
- return error;
- }
-
-
- /*****************************************************************************
- *
- * HandleAESayText
- *
- *****************************************************************************/
-
- #define VOICE_BUFFER_SIZE 40
-
- static pascal OSErr
- HandleAESayText(AppleEvent *appleEvent, AppleEvent *reply, long refCon)
- {
- #pragma unused (refCon)
-
- OSErr error;
-
- AEDesc directObject = {typeNull, nil};
- AEDesc voiceParam = {typeNull, nil};
-
- char voice[VOICE_BUFFER_SIZE];
- char *voicePtr = voice;
-
- // The (required) string to speak:
-
- error = AEGetParamDesc(appleEvent, keyDirectObject, typeChar, &directObject);
- if (error != noErr)
- goto CleanUp;
-
- // The (optional) voice name:
-
- error = AEGetParamDesc(appleEvent, 'VOIC', typeChar, &voiceParam);
- if (error != noErr)
- {
- voicePtr = NULL;
- error = noErr; // Disregard error because the voice parameter is optional
- }
- else
- {
- TextToCString(voiceParam.dataHandle, voice, VOICE_BUFFER_SIZE);
- }
-
- // Speech!
-
- if (directObject.dataHandle != nil)
- {
- SayHandle(voicePtr, directObject.dataHandle);
- }
-
- CleanUp:
-
- AEDisposeDesc(&directObject);
- AEDisposeDesc(&voiceParam);
-
- if (reply != NULL && reply->descriptorType != typeNull && error != noErr)
- AEPutParamPtr(reply, keyErrorNumber, typeLongInteger, (Ptr)&error, sizeof(OSErr));
-
- return error;
- }
-
-
- // ---------------------------------------------------------------------------
-