#include #include #include #include #include #include #include "AEClassicWorkaround.h" #include "ClassicProtocol.h" #include "HandleBuffer.h" #include "ContextDataClassicIntf.h" #include "CCacheDataClassicIntf.h" #include "CredsDataClassicIntf.h" #include "CredentialsCacheInternal.h" OSErr InstallAppleEventHandlers (void); pascal OSErr DoOpenApp ( const AppleEvent *inRequest, AppleEvent *outReply, SInt32 inReference); pascal OSErr DoOpenDoc ( const AppleEvent *inRequest, AppleEvent *outReply, SInt32 inReference); pascal OSErr DoPrintDoc ( const AppleEvent *inRequest, AppleEvent *outReply, SInt32 inReference); pascal OSErr DoQuitApp ( const AppleEvent *inRequest, AppleEvent *outReply, SInt32 inReference); pascal OSErr DoCCacheMessage ( const AppleEvent *inRequest, AppleEvent *outReply, SInt32 inReference); /*** * * Constants * ***/ const UInt32 kAdditionalStackSize = 24*1024; /* Sleep time passed to WaitNextEvent. */ const SInt32 kEventLoopTime = 1; struct SGlobals { Boolean allDone; /* true while we are still processing events */ cc_context_t context; }; SGlobals gGlobals; int main (void) { OSErr err = noErr; EventRecord theEvent; /* * Initialize globals */ gGlobals.allDone = false; /* * Install required AppleEvent handlers */ if (err == noErr) { err = InstallAppleEventHandlers (); } while (!gGlobals.allDone) { WaitNextEvent (everyEvent, &theEvent, (UInt32) kEventLoopTime, NULL); if (theEvent.what == kHighLevelEvent) { AEProcessAppleEvent (&theEvent); } } return 0; } OSErr InstallAppleEventHandlers (void) { OSErr err = noErr; AEEventHandlerUPP eventHandlerUPP; /* get the UPPs and install the handlers */ /* required events */ AEEventHandlerUPP workaroundUPP = NewAEEventHandlerUPP (ClassicReplyWorkaround); eventHandlerUPP = NewAEEventHandlerUPP (DoOpenApp); err = AEInstallEventHandler (kCoreEventClass, kAEOpenApplication, eventHandlerUPP, 0, false); if (err != noErr) return err; eventHandlerUPP = NewAEEventHandlerUPP (DoOpenDoc); err = AEInstallEventHandler (kCoreEventClass, kAEOpenDocuments, eventHandlerUPP, 0, false); if (err != noErr) return err; eventHandlerUPP = NewAEEventHandlerUPP (DoPrintDoc); err = AEInstallEventHandler (kCoreEventClass, kAEPrintDocuments, eventHandlerUPP, 0, false); if (err != noErr) return err; eventHandlerUPP = NewAEEventHandlerUPP (DoQuitApp); err = AEInstallEventHandler (kCoreEventClass, kAEQuitApplication, eventHandlerUPP, 0, false); if (err != noErr) return err; /* ccache event */ eventHandlerUPP = NewAEEventHandlerUPP (DoCCacheMessage); err = AEInstallEventHandler (ccClassic_EventClass, ccClassic_EventID, workaroundUPP, (SInt32) eventHandlerUPP, false); if (err != noErr) return err; return err; } pascal OSErr DoOpenApp ( const AppleEvent *inRequest, AppleEvent *outReply, SInt32 inReference) { #pragma unused(inRequest) #pragma unused(outReply) #pragma unused(inReference) return noErr; } pascal OSErr DoOpenDoc ( const AppleEvent *inRequest, AppleEvent *outReply, SInt32 inReference) { #pragma unused (inRequest) #pragma unused (outReply) #pragma unused (inReference) return noErr; } pascal OSErr DoPrintDoc ( const AppleEvent *inRequest, AppleEvent *outReply, SInt32 inReference) { #pragma unused(inRequest) #pragma unused(outReply) #pragma unused(inReference) return noErr; } pascal OSErr DoQuitApp ( const AppleEvent *inRequest, AppleEvent *outReply, SInt32 inReference) { #pragma unused(inRequest) #pragma unused(outReply) #pragma unused(inReference) gGlobals.allDone = true; return noErr; } pascal OSErr DoCCacheMessage ( const AppleEvent *inRequest, AppleEvent *outReply, SInt32 inReference) { OSErr err = noErr; UInt32 requestID; if (err == noErr) { Size size; OSType type; err = AEGetKeyPtr (inRequest, ccClassic_Key_MessageID, typeMagnitude, &type, &requestID, sizeof (requestID), &size); } if (err == noErr) { cc_int32 ccErr = ccNoError; if (gGlobals.context == NULL) { ccErr = cc_initialize (&gGlobals.context, ccapi_version_4, NULL, NULL); } if (ccErr != ccNoError) { err = paramErr; } else { if ((ccClassic_Context_FirstMessage < requestID) && (requestID < ccClassic_Context_LastMessage)) { CCIContextDataClassicInterface context (requestID, inRequest, outReply); context.HandleEvent (); } else if ((ccClassic_CCache_FirstMessage < requestID) && (requestID < ccClassic_CCache_LastMessage)) { CCICCacheDataClassicInterface ccache (requestID, inRequest, outReply); ccache.HandleEvent (); } else if ((ccClassic_Credentials_FirstMessage < requestID) && (requestID < ccClassic_Credentials_LastMessage)) { CCICredentialsDataClassicInterface creds (requestID, inRequest, outReply); creds.HandleEvent (); } } if (gGlobals.context != NULL) { cc_context_release (gGlobals.context); gGlobals.context = NULL; } } return err; }