home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 March / macformat-022.iso / Shareware City / Developers / SW Demo / Demo Source / AEHandler.c next >
Encoding:
Text File  |  1994-10-07  |  7.3 KB  |  225 lines  |  [TEXT/MPCC]

  1. // ----------------------------------------------------------------------------------
  2. // AEHandler.c
  3. // ----------------------------------------------------------------------------------
  4. // Handles the required suite of Apple Events
  5. //
  6. // This demo is copywrite 1994 by LexTek Internation.  Feel free to use it for
  7. // whatever purpose you wish.  The SpellWright Library may not be copied or 
  8. // distributed, except when linked to your application that adds significant features
  9. // to the code.  ie. you can't take the library, make a new library and sell it.  You
  10. // can, however, use it without royalties in applications or other such projects.
  11. //
  12. // LexTek International
  13. // 2255 N. University Parkway, Suit 15
  14. // Provo, UT 84604
  15. // (801) 375.8332  Phone
  16. // (801) 375.7654  Fax 
  17. //
  18. // ----------------------------------------------------------------------------------
  19. // History:
  20. //    9/11/94        CG        Original
  21. //    10/2/94        CG        Added file opening from AE
  22. //
  23.  
  24. #include <AppleEvents.h>
  25. #include "AEHandler.h"
  26. #include "EventLoop.h"
  27. #include "WindowHandler.h"
  28. #include "Globals.h"
  29.  
  30. void DoHighLevel(EventRecord *theEvent);
  31. pascal OSErr AEOpenApp(AppleEvent *request, AppleEvent *reply, long handlerRefCon);
  32. pascal OSErr AEOpenDocs(register AppleEvent *request, AppleEvent *reply, long ref);
  33. pascal OSErr AEPrintDocs(AppleEvent *request, AppleEvent *reply, long ref);
  34. pascal OSErr AEQuitApp(AppleEvent *request, AppleEvent *reply, long ref);
  35. void InitAEHandlers(void);
  36. OSErr AEGotRequiredParams(AppleEvent *aevt);
  37. OSErr OpenHandler(AppleEvent *request);
  38.  
  39.  
  40. // ----------------------------------------------------------------------------------
  41.  
  42. extern void ErrMsgCode(Str255 msg, short code);
  43.  
  44. // ----------------------------------------------------------------------------------
  45. // DoHighLevel
  46. // ----------------------------------------------------------------------------------
  47. // Handles a High Level Event by processing the AppleEvent.
  48.  
  49. void DoHighLevel(EventRecord *theEvent)
  50. {    int    theError;
  51.  
  52.     theError = AEProcessAppleEvent(theEvent);
  53.     if ( theError != noErr)
  54.         ErrMsgCode( "\pError in handling Apple Event", theError);
  55.         
  56. } // HandleHighLevel
  57.  
  58.  
  59. // ----------------------------------------------------------------------------------
  60. // AEOpenApp    -- Open Application AE
  61. // ----------------------------------------------------------------------------------
  62. // Opens the application.  This is the first event we get (under Sys7).  Here we
  63. // merely open a new window.
  64.  
  65. pascal OSErr AEOpenApp(AppleEvent *request, AppleEvent *reply, long handlerRefCon)
  66. {    
  67.     CreateDocWindow();
  68.     return AEGotRequiredParams(request);
  69. } // AEOpenApp
  70.  
  71.  
  72. // ----------------------------------------------------------------------------------
  73. // AEOpenDocs    -- Open Document AE
  74. // ----------------------------------------------------------------------------------
  75. // Opens our documents.  This can happen either at start or any other time.
  76.  
  77. pascal OSErr 
  78. AEOpenDocs(register AppleEvent *request, AppleEvent *reply, long ref)
  79. {
  80.     return OpenHandler(request);
  81.     
  82. } // AEOpenDocs
  83.  
  84.  
  85. // ----------------------------------------------------------------------------------
  86. // AEPrintDocs    -- Print Document AE
  87. // ----------------------------------------------------------------------------------
  88. // This prints our document.  As I've not added the printing functionality yet we
  89. // merely return a not handled error.
  90.  
  91. pascal OSErr 
  92. AEPrintDocs(AppleEvent *request, AppleEvent *reply, long ref)
  93. {
  94.     return errAEEventNotHandled;
  95.     
  96. } // AEPrintDocs
  97.  
  98.  
  99. // ----------------------------------------------------------------------------------
  100. // AEQuitApp
  101. // ----------------------------------------------------------------------------------
  102. // This quits our app.  Right now we merely set the global quit flag to true.
  103. // Eventually we'd probably want to make this a little more fancy.
  104.  
  105. pascal OSErr 
  106. AEQuitApp(AppleEvent *request, AppleEvent *reply, long ref)
  107. {
  108.     register OSErr    err;
  109.  
  110.     err = AEGotRequiredParams(request);
  111.  
  112.     if (err == noErr)
  113.         gQuit = TRUE;
  114.         
  115.     return err;
  116.     
  117. } // AEQuitApp
  118.  
  119. // ----------------------------------------------------------------------------------
  120. // InitAEHandlers    -- Install our Apple Event Handlers
  121. // ----------------------------------------------------------------------------------
  122.  
  123. void
  124. InitAEHandlers(void)
  125. {
  126.     int    err;
  127.     
  128.     // MPW and Metrowerks have different headers
  129.     #ifndef    NewAEEventHandlerProc
  130.     #    ifdef    NewEventHandlerProc
  131.     #        define    NewAEEventHandlerProc    NewEventHandlerProc
  132.     #    else
  133.     #        define    NewAEEventHandlerProc(proc)    (EventHandlerProcPtr)proc
  134.     #    endif
  135.     #endif
  136.     
  137.     // Install the Handlers
  138.     err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerProc(AEQuitApp), kAEQuitApplication, false);
  139.     if (err == noErr)
  140.         err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerProc(AEOpenDocs), kAEOpenDocuments, false);
  141.     if (err == noErr)
  142.         err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, NewAEEventHandlerProc(AEPrintDocs), kAEPrintDocuments, false);
  143.     if (err == noErr)
  144.         err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, NewAEEventHandlerProc(AEOpenApp), kAEOpenApplication, false);
  145.  
  146.     // check for errs
  147.     if ( err )
  148.         ErrMsgCode( "\pCouldn't Install Apple Event Handler", err);
  149.  
  150. } // InitAEHandlers
  151.  
  152. // ----------------------------------------------------------------------------------
  153. // AEGotRequiredParams    -- check for parameters
  154. // ----------------------------------------------------------------------------------
  155. // This routine merely checks to ensure that we've got all the required parameters for
  156. // our AppleEvents.
  157.  
  158. OSErr 
  159. AEGotRequiredParams(AppleEvent *aevt)
  160. {
  161.     register OSErr    err;
  162.     Size            actualSize;
  163.     DescType        typeCode;
  164.  
  165.     // see if we've got all the parameters...
  166.     err = AEGetAttributePtr(aevt, keyMissedKeywordAttr, typeWildCard, &typeCode,
  167.                             NULL, 0, &actualSize);
  168.  
  169.     if (err == errAEDescNotFound)    // if no "missed keyword" attribute we have the required params
  170.         err = noErr;
  171.     else
  172.     if (err == noErr)                // if "missed keyword" attribute exists then we missed at least one
  173.         err = errAEParamMissed;
  174.  
  175.     return err;
  176. } // AEGotRequiredParams
  177.  
  178. // ----------------------------------------------------------------------------------
  179. // OpenHandler
  180. // ----------------------------------------------------------------------------------
  181. // Handles the open apple event.
  182.  
  183. OSErr OpenHandler(AppleEvent *request)
  184. {   OSErr         err, err2;
  185.     AEDesc         theDesc;
  186.     AEKeyword     ignoredKeyWord;
  187.     DescType     ignoredType;
  188.     Size         ignoredSize;
  189.     FSSpec         theFSS;
  190.     long         FilesToOpen;
  191.     
  192.     long         counter;
  193.     
  194.     err = AEGetParamDesc(request, keyDirectObject, typeAEList, &theDesc);
  195.     
  196.     if (err) 
  197.     {    ErrMsgCode("\pAEGetParamDesc", err);
  198.     } // if
  199.     
  200.     // check for missing parameters (returns an err if one is missing)
  201.     if ( !AEGotRequiredParams(request) )
  202.     {    
  203.         // We have the required parameters.  Now we get the direct object, get
  204.         // it's type and then parse it.
  205.         
  206.         if (err = AECountItems(&theDesc, &FilesToOpen))
  207.             ErrMsgCode("\pAECountItems", err);
  208.         else
  209.         {    for (counter = 1; ((counter <= FilesToOpen) && (!err)); ++counter)
  210.             {    if ( err = AEGetNthPtr(&theDesc, counter, typeFSS, &ignoredKeyWord,
  211.                             &ignoredType, (Ptr)&theFSS, sizeof(theFSS), &ignoredSize))
  212.                     ErrMsgCode("\pAEGetNthDesc", err);
  213.                 else
  214.                     DoOpen(&theFSS);    // open a file window
  215.                 
  216.             } // for
  217.         } // else
  218.     
  219.     } // if
  220.      
  221.     if (err2 = AEDisposeDesc(&theDesc))
  222.         ErrMsgCode("\pAEDisposeDesc of theDesc", err2);
  223.     return (err ? err : err2);
  224.  
  225. } // OpenHandler