home *** CD-ROM | disk | FTP | other *** search
/ HyperLib 1997 Winter - Disc 1 / HYPERLIB-1997-Winter-CD1.ISO.7z / HYPERLIB-1997-Winter-CD1.ISO / オンラインウェア / PRG / AESample.sit / AESample / sources / sample.AE.c < prev    next >
Text File  |  1996-06-22  |  10KB  |  340 lines

  1. /*
  2.  *--------------------------------------------------------------
  3.  * sample.AE.c
  4.  *--------------------------------------------------------------
  5.  */
  6. #include <Gestalt.h>
  7. #include <AppleEvents.h>
  8. #include <AERegistry.h>
  9.  
  10. #include "sample.h"
  11. #include "sample.AE.h"
  12. #include "sample.send.h"
  13. #include "sample.alrt.h"
  14.  
  15. enum AEResourceIDs {
  16.     dlgAEErrorID = 2002,
  17.     strAEErrorID = dlgAEErrorID
  18. };
  19.  
  20. /* AppleEvent error kind messages */
  21. enum AEErrKinds {
  22.     /* message kinds */
  23.     iAEOpenApplication    = 1,
  24.     iAEOpenDocuments,
  25.     iAEPrintDocuments,
  26.     iAEQuitApplication,
  27.     iAESendOpenSelected,
  28.     iAESendPrintSelected,
  29.     iAEUnknownEvents,
  30.  
  31.     /* error codes */
  32.     iAENotInstalled,
  33.     iAEInvalidConnect,
  34.     iAENotHandled,
  35.     iAEParameterErr,
  36.     iAEMemoryFull,
  37.     iAENotCoercion,
  38.     iAEWrongDataType,
  39.     iAEDecsNotFound,
  40.     iAEInvalDesc,
  41.     iAENoReplyComes,
  42.     iAETimeoutOccur,
  43.     iAEUnknownError,
  44.  
  45.     errAENotInstalled = dlgAEErrorID
  46. };
  47.  
  48. /* number of required AppleEvents */
  49. enum {
  50.     kOpenApp    = 0,
  51.     kOpenDoc,
  52.     kPrntDoc,
  53.     kQuitApp,
  54.     kNumOfAE
  55. };
  56.  
  57. /* static functions only used in this source */
  58. static pascal OSErr DoAEOpenApp(const AppleEvent *, AppleEvent *, long);
  59. static pascal OSErr DoAEOpenDoc(const AppleEvent *, AppleEvent *, long);
  60. static pascal OSErr DoAEPrintDoc(const AppleEvent *, AppleEvent *, long);
  61. static pascal OSErr DoAEQuitApp(const AppleEvent *, AppleEvent *, long);
  62. static OSErr GotRequiredParams(const AppleEvent *);
  63.  
  64. /* globals used for AppleEvent handling */
  65. Boolean    gAEDoubleClicked;
  66. Boolean    gAEDragAndDropped;
  67.  
  68. /* static global: AppleEvent Hander ProcPtr */
  69. static AEEventHandlerUPP gMyAEUPP[kNumOfAE] = { nil, nil, nil, nil };
  70.  
  71. /*
  72.  *--------------------------------------------------------------
  73.  * SetUpMyAppleEvent
  74.  *--------------------------------------------------------------
  75.  *    set up Apple Event procedure
  76.  *    if AppleEvent is not supported, do nothing in here
  77.  *--------------------------------------------------------------
  78.  */
  79. Boolean SetUpMyAppleEvent(void)
  80. {
  81.     AEEventID anAEID;
  82.     long    answer;
  83.     OSErr    result;
  84.  
  85.     /* set startup flag  */
  86.     gAEDoubleClicked = gAEDragAndDropped = false;
  87.  
  88.     /* check gestalt whether AppleEvent is available */
  89.     result = Gestalt(gestaltAppleEventsAttr, &answer);
  90.     if (result != noErr || answer < gestaltAppleEventsPresent) {
  91.         anAEID = iAEUnknownEvents;
  92.         result = iAENotInstalled;
  93.     }
  94.  
  95.     /* create new routine descriptors of my AppleEvent handlers */
  96.     if (result == noErr) {
  97.         gMyAEUPP[kOpenApp] = NewAEEventHandlerProc(DoAEOpenApp);
  98.         gMyAEUPP[kOpenDoc] = NewAEEventHandlerProc(DoAEOpenDoc);
  99.         gMyAEUPP[kPrntDoc] = NewAEEventHandlerProc(DoAEPrintDoc);
  100.         gMyAEUPP[kQuitApp] = NewAEEventHandlerProc(DoAEQuitApp);
  101.     }
  102.     /* istall AppleEvent handlers */
  103.     if (result == noErr) {
  104.         result = AEInstallEventHandler(kCoreEventClass, anAEID = kAEOpenApplication,
  105.             gMyAEUPP[kOpenApp], 0, false);
  106.     }
  107.     if (result == noErr) {
  108.         result = AEInstallEventHandler(kCoreEventClass, anAEID = kAEOpenDocuments,
  109.             gMyAEUPP[kOpenDoc], 0, false);
  110.     }
  111.     if (result == noErr) {
  112.         result = AEInstallEventHandler(kCoreEventClass, anAEID = kAEPrintDocuments,
  113.             gMyAEUPP[kPrntDoc], 0, false);
  114.     }
  115.     if (result == noErr) {
  116.         result = AEInstallEventHandler(kCoreEventClass, anAEID = kAEQuitApplication,
  117.             gMyAEUPP[kQuitApp], 0, false);
  118.     }
  119.     if (result != noErr) {
  120.         /* if failed, show alert */
  121.         DoAEError(result, anAEID);
  122.         return (false);
  123.     }
  124.     return (true);
  125. }
  126. /*
  127.  *--------------------------------------------------------------
  128.  * RemoveMyAppleEvent
  129.  *--------------------------------------------------------------
  130.  *    delete AppleEvent handlers
  131.  *--------------------------------------------------------------
  132.  */
  133. void RemoveMyAppleEvent(void)
  134. {
  135.     int   i;    /* natural integer */
  136.  
  137.     /* remove my AppleEvent handlers */
  138.     for (i = 0; i < kNumOfAE; ++i) {
  139.         if (gMyAEUPP[i] != nil) {
  140.             DisposeRoutineDescriptor(gMyAEUPP[i]);
  141.         }
  142.     }
  143. }
  144. /*
  145.  *--------------------------------------------------------------
  146.  * DoOpenApp
  147.  *--------------------------------------------------------------
  148.  *    AppleEvent Open Application procedure: do nothing
  149.  *--------------------------------------------------------------
  150.  */
  151. pascal OSErr DoAEOpenApp(const AppleEvent *theAE, AppleEvent *reply, long refCon)
  152. {
  153. #pragma unused (theAE, reply, refCon)
  154.  
  155.     gAEDoubleClicked = true;
  156.     return (noErr);
  157. }
  158. /*
  159.  *--------------------------------------------------------------
  160.  * DoOpenDoc
  161.  *--------------------------------------------------------------
  162.  *    AppleEvent Open Document procedure
  163.  *--------------------------------------------------------------
  164.  */
  165. pascal OSErr DoAEOpenDoc(const AppleEvent *theAE, AppleEvent *reply, long refCon)
  166. {
  167. #pragma unused (theAE, reply, refCon)
  168.  
  169.     AEDescList    fileSpecList = { typeNull,  nil };
  170.     FSSpec        thisFileSpec;
  171.     DescType    type;
  172.     AEKeyword    keyword;
  173.     Size        actual;
  174.     long        count;
  175.     long        index;
  176.     OSErr        result;
  177.  
  178.     gAEDragAndDropped = true;
  179.  
  180.     /* pick up file list from the received AppleEvent */
  181.     result = AEGetParamDesc(theAE, keyDirectObject, typeAEList, &fileSpecList);
  182.     if (result == noErr) {
  183.         result = GotRequiredParams(theAE);
  184.     }
  185.     /* get number of files */
  186.     if (result == noErr) {
  187.         result = AECountItems(&fileSpecList, &count);
  188.     }
  189.     /* pick up all the files (FSSPec) in the received AppleEvent */
  190.     if (result == noErr) {
  191.         for (index = 1; index <= count; index++) {
  192.             result = AEGetNthPtr(&fileSpecList, index, typeFSS, &keyword, &type,
  193.                 (Ptr)&thisFileSpec, sizeof(FSSpec), &actual);
  194.             if (result == noErr) {
  195.                 /* This is the heart! */
  196.                 OpenDroppedFile(&thisFileSpec);
  197.             } else {
  198.                 break;
  199.             }
  200.         }
  201.     }
  202.     AEDisposeDesc(&fileSpecList);
  203.     if (result != noErr) {
  204.         DoAEError(result, kAEOpenDocuments);
  205.     }
  206.     return (result);
  207. }
  208. /*
  209.  *--------------------------------------------------------------
  210.  * DoPrintDoc
  211.  *--------------------------------------------------------------
  212.  *    AppleEvent Quit procedure
  213.  *--------------------------------------------------------------
  214.  */
  215. pascal OSErr DoAEPrintDoc(const AppleEvent *theAE, AppleEvent *reply, long refCon)
  216. {
  217. #pragma unused (reply, refCon)
  218.  
  219.     AEDescList    fileSpecList = { typeNull,  nil };
  220.     FSSpec        thisFileSpec;
  221.     DescType    type;
  222.     AEKeyword    keyword;
  223.     Size        actual;
  224.     long        count;
  225.     long        index;
  226.     OSErr        result;
  227.  
  228.     gAEDragAndDropped = true;
  229.  
  230.     /* pick up file list from the received AppleEvent */
  231.     result = AEGetParamDesc(theAE, keyDirectObject, typeAEList, &fileSpecList);
  232.     if (result == noErr) {
  233.         result = GotRequiredParams(theAE);
  234.     }
  235.     /* get number of files */
  236.     if (result == noErr) {
  237.         result = AECountItems(&fileSpecList, &count);
  238.     }
  239.     /* pick up all the files (FSSPec) in the received AppleEvent */
  240.     if (result == noErr) {
  241.         for (index = 1; index <= count; index++) {
  242.             result = AEGetNthPtr(&fileSpecList, index, typeFSS, &keyword, &type,
  243.                 (Ptr)&thisFileSpec, sizeof(FSSpec), &actual);
  244.             if (result == noErr) {
  245.                 /* This is the heart! */
  246.                 PrintDroppedFile(&thisFileSpec);
  247.             } else {
  248.                 break;
  249.             }
  250.         }
  251.     }
  252.     AEDisposeDesc(&fileSpecList);
  253.     if (result != noErr) {
  254.         DoAEError(result, kAEPrintDocuments);
  255.     }
  256.     return (result);
  257. }
  258. /*
  259.  *--------------------------------------------------------------
  260.  * DoQuitApp
  261.  *--------------------------------------------------------------
  262.  *    Apple Event Quit procedure: clear main event loop flag
  263.  *--------------------------------------------------------------
  264.  */
  265. pascal OSErr DoAEQuitApp(const AppleEvent *theAE, AppleEvent *reply, long refCon)
  266. {
  267. #pragma unused (theAE, reply, refCon)
  268.  
  269.     gForever = false;
  270.     return (noErr);
  271. }
  272. /*
  273.  *--------------------------------------------------------------
  274.  * GotRequiredParams
  275.  *--------------------------------------------------------------
  276.  *    Apple Event requred parameter parser
  277.  *--------------------------------------------------------------
  278.  */
  279. static OSErr GotRequiredParams(const AppleEvent *theAE)
  280. {
  281.     DescType    returnedType;
  282.     Size        actualSize;
  283.     OSErr        result;
  284.  
  285.     result = AEGetAttributePtr(theAE, keyMissedKeywordAttr, typeWildCard,
  286.         &returnedType, nil, 0, &actualSize );
  287.  
  288.     if (result == errAEDescNotFound) {
  289.         return (noErr);
  290.     } else if (result == noErr) {
  291.         return (errAEEventNotHandled);
  292.     }
  293.     return (result);
  294. }
  295. /*
  296.  *--------------------------------------------------------------
  297.  * DoAEError
  298.  *--------------------------------------------------------------
  299.  *    Apple Event Error Messages
  300.  *--------------------------------------------------------------
  301.  */
  302. void DoAEError(const OSErr theError, const AEEventID theKind)
  303. {
  304.     Str63    errKinds;
  305.     Str63    errCodes;
  306.     short    kind;
  307.     short    code;
  308.  
  309.     switch (theKind) {
  310.     case kAEOpenApplication:    kind = iAEOpenApplication;    break;
  311.     case kAEOpenDocuments:        kind = iAEOpenDocuments;    break;
  312.     case kAEPrintDocuments:        kind = iAEPrintDocuments;    break;
  313.     case kAEQuitApplication:    kind = iAEQuitApplication;    break;
  314.     case kAEOpenSelection:        kind = iAESendOpenSelected;    break;
  315.     case kAEPrintSelection:        kind = iAESendPrintSelected;    break;
  316.     default:    kind = iAEUnknownEvents;    break;
  317.     }
  318.  
  319.     switch (theError) {
  320.     case errAENotInstalled:        code = iAENotInstalled;    break;
  321.     case connectionInvalid:        code = iAEInvalidConnect;    break;    
  322.     case errAEEventNotHandled:    code = iAENotHandled;    break;
  323.     case paramErr:                code = iAEParameterErr;    break;
  324.     case memFullErr:            code = iAEMemoryFull;    break;
  325.     case errAECoercionFail:        code = iAENotCoercion;    break;
  326.     case errAEWrongDataType:    code = iAEWrongDataType;    break;
  327.     case errAEDescNotFound:        code = iAEDecsNotFound;    break;
  328.     case errAENotAEDesc:        code = iAEDecsNotFound;    break;
  329.     case errAEReplyNotValid:    code = iAENoReplyComes;    break;
  330.     case errAETimeout:            code = iAETimeoutOccur;    break;
  331.     default:    code = iAEUnknownError;    break;
  332.     }
  333.     GetIndString(errKinds, strAEErrorID, kind);
  334.     GetIndString(errCodes, strAEErrorID, code);
  335.     ParamText(errKinds, errCodes, nil, nil);
  336.  
  337.     MyAlert(dlgAEErrorID);
  338. }
  339.  
  340.