home *** CD-ROM | disk | FTP | other *** search
/ Mac Power 1999 June / macpower199906.bin / 9906⁄AMUG / INTERNET / NetCacheResolver 0.9d7.sit / NetCacheResolver 0.9d7 folder / source code CWPro4 / source / NCR_AppleEvent.c < prev    next >
Encoding:
Text File  |  1999-02-04  |  32.6 KB  |  1,153 lines  |  [TEXT/CWIE]

  1. // NetCache Resolver, 1995 (C) Mizutori Tetsuya
  2. // - NCR_AppleEvent.c, October 10, 1995
  3. // This document is pretty printed in 10-point Geneva font.
  4.  
  5. //#define DEBUG 1
  6.  
  7. #include <AppleEvents.h>
  8. #include <AERegistry.h>
  9. #include <AEObjects.h>
  10.  
  11. #include "NCR_Basic.h"
  12. #include "NCR_AppleEvent.h"
  13. #include "NCR_File.h"
  14. #include "NCR_Resolve.h"
  15. #include "NCR_Qsort.h"
  16. #include "NCR_Error.h"
  17. #ifdef DEBUG
  18. #include "NCR_Message.h"
  19. #endif /* DEBUG */
  20.  
  21. #ifdef COMMNET
  22. 1. Initialize
  23.     call SetupAppleEvent()
  24.  
  25. 2. Apple Event precess
  26.     case: AEOpenApplication
  27.         call DoOpenApplication()
  28. //        set  gAEOpenAppl = true
  29.  
  30.     case: AEOpenDocuments
  31. ///        call DoOpenDocumentBegin()
  32.         call DoOpenDocument( &theFSSpec, index, count ) for each file
  33. //        set  gAEOpenDoc = true
  34. ///        call DoOpenDocumentEnd()
  35.  
  36.     case: AEPrintDocuments
  37.         call DoPrintDocument()
  38. //        set  gAEPrintDoc = true
  39.  
  40.     case: AEQuitApplication
  41.         call DoQuitApplication()
  42. //        set  gAEQuitAppl = true
  43.  
  44. #endif /* COMMENT */
  45.  
  46. enum myAppleEventSuits {
  47. //    kAEActivate    = 'actv',        // Already defined in <AERegistry.h>
  48.     
  49. // AppleScript Command: resolve $typeAlias$ [with sorted by $Enum$]
  50.     kNCRSuite        = 'MzcR',        // EVENT CLASS
  51.     kAEResolve        = 'rslv',        // EVENT ID
  52. // Reply:
  53. //    typeAEList        = 'list',        // a list of string 'TEXT'
  54. // Direct Parameter: 
  55. //    typeAlias        = 'alis',        // a list of aliases
  56. // Other Parameters: [with sorted by name/date/size/type/url]
  57.     kAESorted        = 'soby',        // KEYWORD
  58.     typeSortOption    = 'Esrt',        // see also Enumaration
  59.  
  60. // AppleScript Command: sort $typeAEList$
  61. //                    [at $integer$] [in regular/normal] [as alphabet/number] [with $TEXT$]
  62. //    kNCRSuite        = 'MzcR',        // EVENT CLASS
  63.     kAEMySort        = 'sort',        // EVENT ID
  64. // Reply:
  65. //    typeAEList        = 'list',        // a list of string 'TEXT'
  66. // Direct Parameter: 
  67. //    typeAEList        = 'list',        // a list of string 'TEXT'
  68. // Other Parameter: [at $integer$]
  69.     kAEPosition    = 'posn',        // KEYWORD
  70. //    typeLongInteger    = 'long',        // field number
  71. // Other Parameter: [by name/date/size/type/url]
  72. //    kAESorted        = 'soby',        // KEYWORD
  73. //    typeSortOption    = 'Esrt',        // see also Enumaration
  74. // Other Parameter: [in regular/normal]
  75.     kAEOrder        = 'ordr',        // KEYWORD
  76.     typeOrderOption    = 'Eord',        // see also Enumaration
  77. // Other Parameter: [as alphabet/number]
  78.     kAETypeAs        = 'type',        // KEYWORD
  79.     typeTypeOption    = 'Etyp',        // see also Enumaration
  80. // Other Parameter: [with $TEXT$]
  81.     kAESeparator    = 'sepa',        // KEYWORD
  82. //    typeChar        = 'TEXT',        // field separator
  83.  
  84. // AppleScript Command: assign $typeObjectSpecifier$ to value
  85. //    kNCRSuite        = 'MzcR',        // EVENT CLASS
  86. //    kAESetData        = 'setd',        // EVENT ID
  87. // Reply:
  88. //    typeNull        = 'null',
  89. // Direct Parameter: 
  90. //    typeObjectSpecifier    = 'obj ',    // an object
  91. // Other Parameters: to value
  92. //    kAEData        = 'data',        // KEYWORD
  93. //    typeWildCard    = '****',
  94.  
  95. // AppleScript Command: show about
  96. //    kNCRSuite        = 'MzcR',        // EVENT CLASS
  97.     kAEShowAbout    = 'abou',        // EVENT ID
  98. // Reply:
  99. //    typeNull        = 'null',
  100. // Direct Parameter: 
  101. //    typeNull        = 'null',
  102. // Other Parameters:
  103. //    typeNull        = 'null',
  104.  
  105.     _myAppleEventSuits
  106. };
  107.  
  108. enum myEnumerateKey {
  109. //    typeSortOption    = 'Esrt',
  110.     keyByName    = 'sona',
  111.     keyByDate        = 'soda',
  112.     keyBySize        = 'sosi',
  113.     keyByType        = 'soty',
  114.     keyByUrl        = 'sour',
  115.     _myEnumerationKey
  116. };
  117.  
  118. enum myEnumrateOrder {
  119. //    typeOrderOption    = 'Eord',
  120.     keyOrdRegular    = 'norm',
  121.     keyOrdReverse    = 'revs',
  122.     _myEnumrationOrder
  123. };
  124.  
  125. enum myEnumerateTypeAs {
  126. //    typeTypeOption    = 'Etyp',
  127.     keyTypeAlpha    = 'alph',
  128.     keyTypeNumb    = 'numb',
  129.     _myEnumerateTypeAs
  130. };
  131.  
  132. enum cacheLogField {
  133.     kSortByName    = 4,
  134.     kSortByDate    = 3,
  135.     kSortBySize    = 8,
  136.     kSortByType    = 6,
  137.     kSortByUrl    = 5,
  138.     _cacheLogField
  139. };
  140.  
  141. enum viewByConstants {
  142. //    typeviewBy        = 'vwBY',
  143.     viewBySmallIcon    = 'smic',    // 0; bySmallIcon
  144.     viewByIcon        = 'iimg',    // 1; byIcon
  145.     viewByName        = 'pnam',    // 2; byName
  146.     viewByModDate        = 'modd',    // 3; byModDate
  147.     viewBySize        = 'ptsz',    // 4; bySize
  148.     viewByKind        = 'kind',    // 5; byKind
  149.     viewByCommnet        = 'comt',    // 6; byComment
  150.     viewByLabel        = 'labi',    // 7; byLabel
  151.     viewByVersion        = 'vers',    // 8; byVersion
  152.     _viewByConstants
  153. };
  154.  
  155. #ifdef COMMENT
  156. enum AppleEventConstants {
  157.     kCoreEventClass        = 'aevt',
  158.     kAECoreSuite        = 'core',
  159.     kAEMiscStandards    = 'misc',
  160.     kAEOpenApplication    = 'oapp',
  161.     kAEOpenDocuments    = 'odoc',
  162.     kAEPrintDocuments    = 'pdoc',
  163.     kAEQuitApplication    = 'quit',
  164.     kAESetData            = 'setd',
  165.     kAEData            = 'data',
  166.     kAENoReply        = 0x00000001,
  167.     typeChar            = 'TEXT',
  168.     typeAEList            = 'list',
  169.     typeAERecord        = 'reco',
  170.     typeFSS            = 'fss ',
  171.     typeObjectSpecifier    = 'obj ',
  172.     typeWildCard        = '****',
  173.     typeType            = 'type',
  174.     typeKeyword        = 'keyw',
  175.     typeNull            = 'null',
  176.     keyDirectObject        = '----',
  177.     keyErrorNumber    = 'errn',
  178.     keyErrorString        = 'errs',
  179.     _AppleEventConstants
  180. };
  181. #endif /* COMMENT */
  182.  
  183. /***** Constants & Globals *****/
  184. //extern Boolean    gAEOpenAppl;
  185. //extern Boolean    gAEOpenDocs;
  186. //extern Boolean    gAEPrintDoc;
  187. //extern Boolean    gAEQuitAppl;
  188.  
  189. // callback functions, defined in 'main.c'
  190. extern OSErr DoOpenApplication ( void );
  191. extern OSErr DoQuitApplication ( void );
  192. extern OSErr DoPrintDocument ( void );
  193. //extern OSErr DoOpenDocumentBegin ( void );
  194. //extern OSErr DoOpenDocumentEnd ( void );
  195. extern OSErr DoOpenDocument ( FSSpec *theFSSpec, long index, long count );
  196.  
  197.  
  198. // prototypes
  199. /***** Do Apple Event process *****/
  200. pascal OSErr DoOpenApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  201. pascal OSErr DoOpenDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  202. pascal OSErr DoPrintDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  203. pascal OSErr DoQuitApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  204.  
  205. /***** AppleScript Suite *****/
  206. pascal OSErr DoActivate ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  207. pascal OSErr DoResolve ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  208. pascal OSErr DoSort ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  209. pascal OSErr DoSetData ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  210. pascal OSErr DoShowAbout ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  211. pascal OSErr DoMiscEvent ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  212.  
  213. /***** Apple Event routines *****/
  214. static OSErr GotRequiredParams ( AppleEvent *appleEvent );
  215. static OSErr AEPutFieldArray ( AEDescList *resultList, ArrayHandle arrayH );
  216. static void ErrMsgAE ( long err, Boolean fatal );
  217.  
  218. /***** setup Apple Event handles *****/
  219.  
  220. /*
  221. #define AEInstall(eventClass,eventID,procHandle)    {¥
  222.     err = AEInstallEventHandler( eventClass, eventID, (AEEventHandlerProcPtr)procHandle, 0L, false);    ¥
  223.     if ( err != noErr ) ErrorMessageAE( err, true ); }
  224. */
  225. #define AEInstall(eventClass,eventID,procHandle)    {¥
  226.     err = AEInstallEventHandler( eventClass, eventID, NewAEEventHandlerProc(procHandle), 0L, false);    ¥
  227.     if ( err != noErr ) ErrorMessageAE( err, true ); }
  228.  
  229. void SetupAppleEvent ( void )
  230. {
  231.     OSErr    err;
  232.     long        feature;
  233.  
  234.     GestaltCheck( gestaltAppleEventsAttr );
  235.  
  236.     // for Required Suite
  237.     AEInstall( kCoreEventClass, kAEOpenApplication, DoOpenApp );
  238.     AEInstall( kCoreEventClass, kAEOpenDocuments, DoOpenDoc );
  239.     AEInstall( kCoreEventClass, kAEPrintDocuments, DoPrintDoc );
  240.     AEInstall( kCoreEventClass, kAEQuitApplication, DoQuitApp );
  241.  
  242.     // for AppleScript Suite
  243. //    AEInstall( kAECoreSuite, kAECreateElement, DoCreateElement );
  244. //    AEInstall( kAECoreSuite, kAEClose, DoCloseElement );
  245.     AEInstall( kAEMiscStandards, kAEActivate, DoActivate );
  246.     AEInstall( kNCRSuite, kAESetData, DoSetData );
  247. //    AEInstall( kAECoreSuite, kAEGetData, DoGetData );
  248.     AEInstall( kNCRSuite, kAEResolve, DoResolve );
  249.     AEInstall( kNCRSuite, kAEMySort, DoSort );
  250.     AEInstall( kNCRSuite, kAEShowAbout, DoShowAbout );
  251. //    AEInstall( typeWildCard, typeWildCard, DoMiscEvent );
  252.  
  253.  
  254. #ifdef COMMENT        // for Resolving Object Specifier Records
  255.     err = AEInstallObjectAccessor( cProperty, typeWildCard, (OSLAccessorProcPtr) MyPropertyObjectAccessor, 0, false );
  256.     if ( err != noErr ) Message("MyPropertyObjectAccessor not available.¥n");
  257.  
  258.     err = AEInstallObjectAccessor( typeWildCard, typeWildCard, (OSLAccessorProcPtr) MyObjectAccessor, 0, false );
  259.     if ( err != noErr ) Message("MyObjectAccessor not available.¥n");
  260.  
  261.     err = AESetObjectCallbacks(
  262.         (OSLCompareProcPtr) MyCompareObjects, 
  263.         (OSLCountProcPtr) MyCountObjects,
  264.         (OSLDisposeTokenProcPtr)nil,
  265.         (OSLGetMarkTokenProcPtr)nil,
  266.         (OSLMarkProcPtr)nil,
  267.         (OSLAdjustMarksProcPtr)nil,
  268.         (OSLGetErrDescProcPtr)nil);
  269.     if ( err != noErr ) Message("AESetObjectCallbacks not available.¥n");
  270. #endif /* COMMENT */
  271.     
  272.     err = AESetInteractionAllowed( kAEInteractWithLocal );
  273. }
  274.  
  275. /***** Do Apple Event process *****/
  276. pascal OSErr DoOpenApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  277. {
  278. #ifdef DEBUG
  279.     Message("Apple event: Open Application Event¥n");
  280. #endif /* DEBUG */
  281.  
  282.     DoOpenApplication();
  283.  
  284. //    gAEOpenAppl = true;
  285.  
  286.     return noErr;
  287. }
  288.  
  289. pascal OSErr DoOpenDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  290. {
  291.     AEDescList        fileSpecList = {typeNull, nil};
  292.     FSSpec        fileSpec;
  293.     DescType        type;
  294.     AEKeyword        keyword;
  295.     Size            actual;
  296.     long            count;
  297.     long            index;
  298.     OSErr        err = noErr;
  299.  
  300. #ifdef DEBUG
  301.     Message("Apple event: Open Document Event¥n");
  302. #endif /* DEBUG */
  303.  
  304. //    DoOpenDocumentBegin();
  305.  
  306.     err = AEGetParamDesc( theAppleEvent, keyDirectObject, typeAEList, &fileSpecList);
  307.     if ( err != noErr ) { ErrMsgAE( err, false); goto out; }
  308.  
  309.     err = GotRequiredParams( theAppleEvent );
  310.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out; }
  311.  
  312.     err = AECountItems( &fileSpecList, &count );
  313.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out; }
  314.  
  315.     for (index=1; index<=count; index++) {
  316.         err = AEGetNthPtr( &fileSpecList, index, typeFSS, &keyword, &type,
  317.                         (Ptr) &fileSpec, sizeof( FSSpec ), &actual );
  318.         if ( err != noErr ) { ErrMsgAE( err, false ); goto out; }
  319.  
  320.         err = DoOpenDocument( &fileSpec, index, count );
  321.         if ( err != noErr ) break;
  322.     }
  323.  
  324.   out:
  325.       if ( fileSpecList.dataHandle != nil ) AEDisposeDesc( &fileSpecList );
  326.  
  327. //    DoOpenDocumentEnd();
  328. //    gAEOpenDocs = true;
  329.     
  330.     return err;
  331. }
  332.  
  333. pascal OSErr DoPrintDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  334. {
  335. #ifdef DEBUG
  336.     Message("Apple event: Print Document Event¥n");
  337. #endif /* DEBUG */
  338.  
  339.     DoPrintDocument();
  340.     
  341. //    gAEPrintDoc = true;
  342.     
  343.     return noErr;
  344. }
  345.  
  346. pascal OSErr DoQuitApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  347. {
  348. #ifdef DEBUG
  349.     Message("Apple event: Quit Application Event¥n");
  350. #endif /* DEBUG */
  351.  
  352.     DoQuitApplication();
  353.     
  354. //    gAEQuitAppl = true;
  355.  
  356.     return noErr;
  357. }
  358.  
  359. /***** AppleScript Suite *****/
  360. /***** Command: activate *****/
  361. pascal OSErr DoActivate ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  362. {
  363.     ProcessSerialNumber PSN;
  364.     OSErr            err;
  365.  
  366. #ifdef DEBUG
  367.     Message("Apple event: Activate Event¥n");
  368. #endif /* DEBUG */
  369.  
  370.     err = GetCurrentProcess( &PSN );
  371.     if ( err != noErr ) {
  372.         ErrMsgAE( err,  false );
  373.     } else {
  374.         err = SetFrontProcess( &PSN );
  375.     }
  376.     
  377.     return err;
  378. }
  379.  
  380.  
  381. /***** Command: resolve *****/
  382. #ifdef COMMENT
  383. // AppleScript Command: resolve $typeAlias$ [with sorted by $Enum$]
  384.     kNCRSuite        = 'MzcR',        // EVENT CLASS
  385.     kAEResolve        = 'rslv',        // EVENT ID
  386. // Reply:
  387.     typeAEList        = 'list',        // a list of string 'TEXT'
  388. // Direct Parameter: 
  389.     typeAlias        = 'alis',        // a list of aliases
  390. // Other Parameters: [with sorted by name/date/size/type/url]
  391.     kAESorted        = 'soby',        // KEYWORD
  392.     typeSortOption    = 'Esrt',        // see also Enumaration
  393. #endif /* COMMENT */
  394.  
  395.  
  396. pascal OSErr DoResolve ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  397. {
  398.     AEDescList        fileSpecList = {typeNull, nil};
  399.     AEDesc        fileSpecDesc = {typeNull, nil};
  400.     AEDesc        desc = {typeNull, nil};
  401.     long            sortKeyPosition = 0;
  402.     Boolean        withSorted = false;
  403.     Boolean        asNumber = false;
  404.     Boolean        inReverse = false;
  405.     AEDescList        resultList = {typeNull, nil};
  406.     long            index, indexLast=0, count;
  407.     DescType        type, dataType;
  408.     OSErr        err = noErr;
  409.  
  410. #ifdef DEBUG
  411.     Message("Apple event: Resolve Event¥n");
  412. #endif /* DEBUG */
  413.  
  414. // Responding to AppleEvent message
  415.     // Get Direct Parameter
  416. #ifdef DEBUG
  417.     Message("DoResolve: Direct Param¥n");
  418. #endif /* DEBUG */
  419.     err = AEGetParamDesc( theAppleEvent, keyDirectObject, typeAEList, &fileSpecList);    // created 'fileSpecList'
  420.     if ( err != noErr ) { ErrMsgAE( err, false); goto out_responding; }
  421.  
  422.     err = AECountItems( &fileSpecList, &count );
  423.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
  424.  
  425.     for (index=1; index<=count; index++) {
  426.         FSSpec        fileSpec;
  427.         Size            actual;
  428.         AEKeyword        keyword;
  429.         
  430.         err = AEGetNthPtr( &fileSpecList, index, typeFSS, &keyword, &type,
  431.                         (Ptr) &fileSpec, sizeof( FSSpec ), &actual );
  432.         if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
  433.         AEPutFile ( &fileSpec );
  434.     }
  435.  
  436.     // Get Other Parameter [with sorted by $Enum$]
  437. #ifdef DEBUG
  438.     Message("DoResolve: Other Param [with sorted by]¥n");
  439. #endif /* DEBUG */
  440.     err = AEGetParamDesc( theAppleEvent, kAESorted, typeWildCard, &desc);        // created 'desc'
  441.     if ( err != noErr ) {
  442.         if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
  443.     //    sortKeyPosition = 0;
  444.     //    withSorted = false;
  445.     } else {
  446.         type = desc.descriptorType;
  447.         if ( type == typeEnumerated ) {
  448.             dataType = * (DescType *) *desc.dataHandle;
  449.         #ifdef DEBUG
  450.             Message("DoResolve: Param [with sorted by '%T'] as '%T'¥n", dataType, type );
  451.         #endif /* DEBUG */
  452.             withSorted = true; asNumber = false; inReverse = false;
  453.             switch ( dataType ) {
  454.                 case keyByName:        sortKeyPosition = kSortByName;    break;;
  455.                 case keyByDate:        sortKeyPosition = kSortByDate;    asNumber = true; inReverse = true; break;
  456.                 case keyBySize:        sortKeyPosition = kSortBySize;    asNumber = true; inReverse = true; break;
  457.                 case keyByType:        sortKeyPosition = kSortByType;    break;
  458.                 case keyByUrl:        sortKeyPosition = kSortByUrl;    break;
  459.                 default:
  460.                 #ifdef DEBUG
  461.                     Message("DoResolve: Wrong Param [with sorted by '%T'] as '%T'¥n", dataType, type );
  462.                 #endif /* DEBUG */
  463.                     withSorted = false;
  464.                     err = errAEWrongDataType; goto out_responding;
  465.                     break;
  466.             }
  467.         } else {
  468.         #ifdef DEBUG
  469.             Message("DoResolve: Wrong Param [with sorted by '%T']¥n", type );
  470.         #endif /* DEBUG */
  471.             withSorted = false;
  472.             err = errAEWrongDataType; goto out_responding;
  473.         }
  474.     }
  475.       if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );    // dispose of 'desc'
  476.  
  477. #ifdef DEBUG
  478.     Message("DoResolve: Param position(%ld), asNum(%d), inRev(%d)¥n",
  479.             sortKeyPosition, asNumber, inReverse);
  480. #endif /* DEBUG */
  481.  
  482.     // Have I read through the parameters?
  483. #ifdef DEBUG
  484.     Message("Apple event: DoResolve GotRequiredParams()¥n");
  485. #endif /* DEBUG */
  486.     err = GotRequiredParams( theAppleEvent );
  487.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
  488.  
  489.   out_responding:
  490.         if ( fileSpecList.dataHandle != nil ) AEDisposeDesc( &fileSpecList );    // dispose of 'fileSpecList'
  491.         if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );            // dispose of 'desc' if needed
  492.     if ( err != noErr ) goto out;
  493.  
  494.  
  495. // Handling data with parameters
  496.     count = AECountFileList();
  497.  
  498. // Creating and Sending AppleEvent message
  499. #ifdef DEBUG
  500.     Message("Apple event: DoResolve AECreateList()¥n");
  501. #endif /* DEBUG */
  502.     err = AECreateList( nil, 0, false, &resultList );        // create a AEDisc 'resultList'
  503.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
  504.  
  505.     // add the contents of the file to 'resultList'
  506.     for ( index=0; index<count; index++ ) {
  507.         FSSpec    fileSpec;
  508.         FInfo        fileInfo;
  509.         Handle    arrayH = nil;
  510.         Handle    theHndl = nil;
  511.         long        datasize, arraySize;
  512.  
  513.         AEGetFile ( &fileSpec, index );
  514.  
  515. #ifdef DEBUG
  516.         Message("filename[%ld]='%S'¥n",(index+1),fileSpec.name);
  517.         Message("Apple event: DoResolve AEPutPtr(%ld)¥n", (index+1));
  518. #endif /* DEBUG */
  519.  
  520. #ifdef Not_Yet_Implemented
  521.  
  522.         err = AEPutPtr( &resultList, indexLast, typeChar, &fileSpec.name[1], fileSpec.name[0] );    
  523.         if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
  524.  
  525. #else /* Not_Yet_Implemented */
  526.  
  527.         // read record from the file
  528.         theHndl = NewHandleClear( 0 );        // create a Handle 'theHndl'
  529.         if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
  530.         
  531.         err = GetRecordFromFile ( &fileSpec, &fileInfo, theHndl, &datasize );    
  532.         if ( err != noErr ) { ErrMsgAE( err, false ); goto out_putting; }
  533.         
  534.         // convert 'theHndl' to 'arrayH' with sorting
  535.         arrayH = NewHandleClear( 0 );        // create a Handle 'arrayH'
  536.         if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
  537.         
  538.         // use default Field Separator and Record Separator
  539.         arraySize = SetupFieldArray( theHndl, (ArrayHandle) arrayH, sortKeyPosition );
  540.     
  541.         if ( withSorted ) {
  542.             HLock( arrayH );
  543.             quicksort( (Array *) *arrayH, 0, arraySize-1, asNumber, inReverse );
  544.             HUnlock( arrayH );
  545.         }
  546.  
  547.         // add 'arrayH' to 'resultList'
  548.         err = AEPutFieldArray( &resultList, (ArrayHandle) arrayH );
  549.         if ( err != noErr ) { ErrMsgAE( err, false ); }
  550.  
  551.   out_putting:
  552.         if ( arrayH != nil ) DisposeHandle( arrayH );    // dispose the Handle 'arrayH'
  553.         if ( theHndl != nil ) DisposeHandle( theHndl );    // dispose the Handle 'theHndl'
  554. #endif /* Not_Yet_Implemented */
  555.     }
  556.  
  557. #ifdef DEBUG
  558.     Message("Apple event: DoResolve AEPutParamDesc()¥n");
  559. #endif /* DEBUG */
  560.     err = AEPutParamDesc( reply, keyDirectObject, &resultList );
  561.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
  562.     
  563.   out_sending:
  564.       if ( resultList.dataHandle != nil ) AEDisposeDesc( &resultList );    // dispose the AEDisc 'resultList'
  565.   
  566.   out:
  567.       AEDisposFileList();
  568.       
  569.     return err;
  570. }
  571.  
  572. /***** Command: sort *****/
  573. #ifdef COMMENT
  574. // AppleScript Command: sort $typeAEList$
  575. //                    [at $integer$] [in regular/normal] [as alphabet/number] [with $TEXT$]
  576.     kNCRSuite        = 'MzcR',        // EVENT CLASS
  577.     kAEMySort        = 'sort',        // EVENT ID
  578. // Reply:
  579.     typeAEList        = 'list',        // a list of string 'TEXT'
  580. // Direct Parameter: 
  581.     typeAEList        = 'list',        // a list of string 'TEXT'
  582. // Other Parameters: [at $integer$]
  583.     kAEPosition    = 'posn',        // KEYWORD
  584.     typeLongInteger    = 'long',        // field number
  585. // Other Parameter: [by name/date/size/type/url]
  586.     kAESorted        = 'soby',        // KEYWORD
  587.     typeSortOption    = 'Esrt',        // see also Enumaration
  588. // Other Parameters: [in regular/normal]
  589.     kAEOrder        = 'ordr',        // KEYWORD
  590.     typeOrderOption    = 'Eord',        // see also Enumaration
  591. // Other Parameters: [as alphabet/number]
  592.     kAETypeAs        = 'type',        // KEYWORD
  593.     typeTypeOption    = 'Etyp',        // see also Enumaration
  594. // Other Parameters: [with $TEXT$]
  595.     kAESeparator    = 'sepa',        // KEYWORD
  596.     typeChar        = 'TEXT',        // field separator
  597. #endif /* COMMENT */
  598.  
  599. #define TAB    '¥t'                // Field Separator
  600. #define EOL    '¥r'                // Record Separator
  601.  
  602. pascal OSErr DoSort ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  603. {
  604.     AEDescList        descList = {typeNull, nil};
  605.     AEDescList        resultList = {typeNull, nil};
  606.     AEDesc        desc = {typeNull, nil};
  607.     DescType        type, dataType;
  608.     AEKeyword        theAEKeyword;
  609.  
  610.     Handle        theHndl = nil;
  611.     Handle        arrayH = nil;
  612.     long            size;
  613.     long            sortKeyPosition = 4;
  614.     Boolean        inReverse = false;
  615.     Boolean        asNumber = false;
  616.     unsigned char    fieldSeparator = TAB;
  617.  
  618.     long            count, index;
  619.     OSErr        err = noErr;
  620.  
  621. #ifdef DEBUG
  622.     Message("Apple event: Sort Event¥n");
  623. #endif /* DEBUG */
  624.  
  625. // Responding to AppleEvent message
  626.     // Direct Parameter
  627. #ifdef DEBUG
  628.     Message("DoSort: Direct Param¥n");
  629. #endif /* DEBUG */
  630.     err = AEGetParamDesc( theAppleEvent, keyDirectObject, typeAEList, &descList );    // create AEDisc 'descList'
  631.     if ( err != noErr ) { ErrMsgAE( err, false); goto out_responding; }
  632.  
  633.     err = AECountItems( &descList, &count );
  634.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
  635.  
  636.     theHndl = NewHandleClear( 0 );        // create a handle 'theHndl'
  637.     if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
  638.  
  639.     for (index=1; index<=count; index++) {
  640.         Handle    theHndl2;
  641.         long        size2;
  642.         
  643.         err = AEGetNthDesc( &descList, index, typeChar, &theAEKeyword, &desc );    // created 'desc'
  644.         if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
  645.         theHndl2 = desc.dataHandle;
  646.         size = GetHandleSize(theHndl);
  647.         size2 = GetHandleSize(theHndl2);
  648.         SetHandleSize( theHndl, size+size2+1);
  649.         if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
  650.         BlockMove( (Ptr) *theHndl2, (Ptr) *theHndl+size, size2 );
  651.         ((unsigned char *) *theHndl)[size+size2] = EOL;
  652.         
  653.         if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );        // dispose of 'desc'
  654.     }
  655.  
  656.     // Other Parameter [at $integer$]
  657. #ifdef DEBUG
  658.     Message("DoSort: Param [at $integer$]¥n");
  659. #endif /* DEBUG */
  660.     desc.dataHandle = nil;
  661.     err = AEGetParamDesc( theAppleEvent, kAEPosition, typeWildCard, &desc);    // created 'desc'
  662.     if ( err != noErr ) {
  663.         if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
  664.     //    sortKeyPosition = 0;
  665.     } else {
  666.         type = desc.descriptorType;
  667.         if ( type == typeLongInteger ) {
  668.             sortKeyPosition = * (long *) *desc.dataHandle;
  669.         #ifdef DEBUG
  670.             Message("DoSort: Param [at %ld] as '%T'¥n", sortKeyPosition, type );
  671.         #endif /* DEBUG */
  672.         } else {
  673.         #ifdef DEBUG
  674.             Message("DoSort: Wrong Param by '%T'¥n", type );
  675.         #endif /* DEBUG */
  676.             err = errAEWrongDataType; goto out_responding;
  677.         }
  678.     }
  679.       if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );    // dispose of 'desc'
  680.  
  681.     // Get Other Parameter [by name/date/size/type/url]
  682. #ifdef DEBUG
  683.     Message("DoSort: Other Param [with sorted by]¥n");
  684. #endif /* DEBUG */
  685.     err = AEGetParamDesc( theAppleEvent, kAESorted, typeWildCard, &desc);        // created 'desc'
  686.     if ( err != noErr ) {
  687.         if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
  688.     //    sortKeyPosition = 0;
  689.     } else {
  690.         type = desc.descriptorType;
  691.         if ( type == typeEnumerated ) {
  692.             dataType = * (DescType *) *desc.dataHandle;
  693.         #ifdef DEBUG
  694.             Message("DoSort: Param [with sorted by '%T'] as '%T'¥n", dataType, type );
  695.         #endif /* DEBUG */
  696.             asNumber = false; inReverse = false;
  697.             switch ( dataType ) {
  698.                 case keyByName:        sortKeyPosition = kSortByName;    break;;
  699.                 case keyByDate:        sortKeyPosition = kSortByDate;    asNumber = true; inReverse = true; break;
  700.                 case keyBySize:        sortKeyPosition = kSortBySize;    asNumber = true; inReverse = true; break;
  701.                 case keyByType:        sortKeyPosition = kSortByType;    break;
  702.                 case keyByUrl:        sortKeyPosition = kSortByUrl;    break;
  703.                 default:
  704.                 #ifdef DEBUG
  705.                     Message("DoResolve: Wrong Param [with sorted by '%T'] as '%T'¥n", dataType, type );
  706.                 #endif /* DEBUG */
  707.                     err = errAEWrongDataType; goto out_responding;
  708.                     break;
  709.             }
  710.         } else {
  711.         #ifdef DEBUG
  712.             Message("DoResolve: Wrong Param [with sorted by '%T']¥n", type );
  713.         #endif /* DEBUG */
  714.             err = errAEWrongDataType; goto out_responding;
  715.         }
  716.     }
  717.       if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );    // dispose of 'desc'
  718.  
  719.     // Other Parameter  [in regular/normal]
  720. #ifdef DEBUG
  721.     Message("DoSort: Param [in regular/normal]¥n");
  722. #endif /* DEBUG */
  723.     desc.dataHandle = nil;
  724.     err = AEGetParamDesc( theAppleEvent, kAEOrder, typeWildCard, &desc);        // created 'desc'
  725.     if ( err != noErr ) {
  726.         if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
  727.     //    inReverse = false;
  728.     } else {
  729.         type = desc.descriptorType;
  730.         if ( type == typeEnumerated ) {
  731.             dataType = * (DescType *) *desc.dataHandle;
  732.         #ifdef DEBUG
  733.             Message("DoSort: Param [in '%T'] as '%T'¥n", dataType, type );
  734.         #endif /* DEBUG */
  735.             switch ( dataType ) {
  736.                 case keyOrdRegular:    inReverse = false;    break;
  737.                 case keyOrdReverse:    inReverse = true;    break;
  738.                 default:
  739.             #ifdef DEBUG
  740.                     Message("DoSort: Wrong Param [in '%T'] by '%T'¥n", dataType, type );
  741.             #endif /* DEBUG */
  742.                     err = errAEWrongDataType; goto out_responding;
  743.                     break;
  744.             }
  745.         } else {
  746.         #ifdef DEBUG
  747.             Message("DoSort: Wrong Param by '%T'¥n", type );
  748.         #endif /* DEBUG */
  749.             err = errAEWrongDataType; goto out_responding;
  750.         }
  751.     }
  752.       if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );    // dispose of 'desc'
  753.  
  754.     // Other Parameter  [as alphabet/number]
  755. #ifdef DEBUG
  756.     Message("DoSort: Param [as alphabet/number]¥n");
  757. #endif /* DEBUG */
  758.     desc.dataHandle = nil;
  759.     err = AEGetParamDesc( theAppleEvent, kAETypeAs, typeWildCard, &desc);    // created 'desc'
  760.     if ( err != noErr ) {
  761.         if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
  762.     //    asNumber = false;
  763.     } else {
  764.         type = desc.descriptorType;
  765.         if ( type == typeEnumerated ) {
  766.             dataType = * (DescType *) *desc.dataHandle;
  767.         #ifdef DEBUG
  768.             Message("DoSort: Param [as '%T'] as '%T'¥n", dataType, type );
  769.         #endif /* DEBUG */
  770.             switch ( dataType ) {
  771.                 case keyTypeAlpha:    asNumber = false;    break;
  772.                 case keyTypeNumb:    asNumber = true;    break;
  773.                 default:
  774.             #ifdef DEBUG
  775.                     Message("DoSort: Wrong Param [as '%T'] by '%T'¥n", dataType, type );
  776.             #endif /* DEBUG */
  777.                     err = errAEWrongDataType; goto out_responding;
  778.                     break;
  779.             }
  780.         } else {
  781.             #ifdef DEBUG
  782.                 Message("DoSort: Wrong Param by '%T'¥n", type );
  783.             #endif /* DEBUG */
  784.             err = errAEWrongDataType; goto out_responding;
  785.         }
  786.     }
  787.       if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );        // dispose of 'desc'
  788.  
  789.     // Other Parameter [with $TEXT$]
  790. #ifdef DEBUG
  791.     Message("DoSort: Param [with $TEXT$]¥n");
  792. #endif /* DEBUG */
  793.     desc.dataHandle = nil;
  794.     err = AEGetParamDesc( theAppleEvent, kAESeparator, typeWildCard, &desc);        // created 'desc'
  795.     if ( err != noErr ) {
  796.         if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
  797.     //    fieldSeparator = TAB;
  798.     } else {
  799.         type = desc.descriptorType;
  800.         if ( type == typeChar ) {
  801.             fieldSeparator = * (unsigned char *) *desc.dataHandle;
  802.         #ifdef DEBUG
  803.             Message("DoSort: Param [with ¥¥%03o] as '%T'¥n", fieldSeparator, type );
  804.         #endif /* DEBUG */
  805.         } else {
  806.         #ifdef DEBUG
  807.             Message("DoSort: Wrong Param by '%T'¥n", type );
  808.         #endif /* DEBUG */
  809.             err = errAEWrongDataType; goto out_responding;
  810.         }
  811.     }
  812.       if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );    // dispose of 'desc'
  813.  
  814.  
  815. #ifdef DEBUG
  816.     Message("DoSort: Param position(%ld), asNum(%d), inRev(%d)¥n",
  817.             sortKeyPosition, asNumber, inReverse);
  818. #endif /* DEBUG */
  819.  
  820.     // Have I read through the parameters?
  821. #ifdef DEBUG
  822.     Message("Apple event: DoSort GotRequiredParams()¥n");
  823. #endif /* DEBUG */
  824.     err = GotRequiredParams( theAppleEvent );
  825.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
  826.  
  827.   out_responding:
  828.         if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );    // dispose the AEDesc 'desc' if needed
  829.     if ( err != noErr ) goto out;
  830.  
  831.  
  832. // Handling data with parameters
  833.  
  834.     arrayH = NewHandleClear( 0 );        // create a Handle 'arrayH'
  835.     if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
  836.     
  837.     ((Array *) *arrayH)->fs = fieldSeparator;
  838.     count = SetupFieldArray( theHndl, (ArrayHandle) arrayH, sortKeyPosition );
  839.     
  840.     HLock( arrayH );
  841.     quicksort( (Array *) *arrayH, 0, count-1, asNumber, inReverse );
  842.     HUnlock( arrayH );
  843.  
  844.  
  845. // Creating and Sending AppleEvent message
  846.  
  847. #ifdef DEBUG
  848.     Message("Apple event: DoResolve AECreateList()¥n");
  849. #endif /* DEBUG */
  850.     err = AECreateList( nil, 0, false, &resultList );    // create a AEDesc 'resultList'
  851.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
  852.  
  853.     err = AEPutFieldArray( &resultList, (ArrayHandle) arrayH );
  854.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
  855.  
  856. #ifdef DEBUG
  857.     Message("Apple event: DoSort AEPutParamDesc()¥n");
  858. #endif /* DEBUG */
  859.     err = AEPutParamDesc( reply, keyDirectObject, &resultList );
  860.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
  861.     
  862.   out_sending:
  863.     if ( arrayH != nil ) DisposeHandle( arrayH );    // dispose the Handle 'arrayH'
  864.       if ( resultList.dataHandle != nil ) AEDisposeDesc( &resultList );    // dispose the AEDesc 'resultList'
  865.       goto out;
  866.   
  867.   out:
  868.       if ( theHndl != nil ) DisposeHandle( theHndl);    // dispose handle 'theHndl'
  869.        
  870.     return err;
  871. }
  872.  
  873. /***** Command: assign *****/
  874. #ifdef COMMENT
  875. // AppleScript Command: assign $typeObjectSpecifier$ to value
  876.     kNCRSuite        = 'MzcR',        // EVENT CLASS
  877.     kAESetData        = 'setd',        // EVENT ID
  878. // Reply:
  879.     typeNull        = 'null',
  880. // Direct Parameter: 
  881.     typeObjectSpecifier    = 'obj ',    // an object
  882. // Other Parameters: to value
  883.     kAEData        = 'data',        // KEYWORD
  884.     typeWildCard    = '****',
  885. #endif /* COMMENT */
  886.  
  887. pascal OSErr DoSetData ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  888. {
  889. #ifdef DEBUG
  890.     Message("Apple event: Set Data Event¥n");
  891. #endif /* DEBUG */
  892.  
  893.     // Sorry, do nothing here.
  894.  
  895.     return noErr;
  896. }
  897.  
  898. /***** Command: show about *****/
  899. #ifdef COMMENT
  900. // AppleScript Command: show about
  901.     kNCRSuite        = 'MzcR',        // EVENT CLASS
  902.     kAEShowAbout    = 'abou',        // EVENT ID
  903. // Reply:
  904.     typeNull        = 'null',
  905. // Direct Parameter: 
  906.     typeNull        = 'null',
  907. // Other Parameters:
  908.     typeNull        = 'null',
  909. #endif /* COMMENT */
  910.  
  911. #define    kAboutID        130
  912.  
  913. pascal Boolean idleProc ( EventRecord *event, long *sleeptime, RgnHandle *mouseRgn );
  914.  
  915. pascal OSErr DoShowAbout ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  916. {
  917.     OSErr    err;
  918.     
  919. #ifdef DEBUG
  920.     Message("Apple event: Show About¥n");
  921. #endif /* DEBUG */
  922.  
  923. /*    err = AEInteractWithUser( kAEDefaultTimeout, nil, (AEIdleProcPtr) idleProc );    */
  924.     err = AEInteractWithUser( kAEDefaultTimeout, nil, NewAEIdleProc(idleProc) );
  925.     if ( err != noErr ) { ErrMsgAE( err, false ); return err; }
  926.  
  927.     Alert( kAboutID, nil );
  928.     
  929.     return noErr;
  930. }
  931.  
  932. pascal Boolean idleProc ( EventRecord *event, long *sleeptime, RgnHandle *mouseRgn )
  933. {
  934.     switch ( event->what ) {
  935.         case updateEvt:
  936.         case activateEvt:
  937.         case osEvt:
  938.             break;
  939.         case nullEvent:
  940.             SystemTask();
  941.             break;
  942.     }
  943.     
  944.     return false;
  945. }
  946.  
  947. /***** Command: miscellaneous *****/
  948. pascal OSErr DoMiscEvent ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  949. {
  950. #ifdef DEBUG
  951.     Message("Apple event: Miscellaneous Event¥n");
  952. #endif /* DEBUG */
  953.  
  954.     //MyInspectDescList( theAppleEvent );
  955.  
  956.     return noErr;
  957. }
  958.  
  959.  
  960. /***** Apple Event routines *****/
  961. static OSErr GotRequiredParams ( AppleEvent *appleEvent )
  962. {
  963.     DescType    returnedType;
  964.     Size        actualSize;
  965.     OSErr    err;
  966.  
  967.     err = AEGetAttributePtr( appleEvent, keyMissedKeywordAttr, typeWildCard,
  968.                         &returnedType, nil, 0, &actualSize );
  969.  
  970.     if ( err == errAEDescNotFound )  return noErr;
  971.     else if ( err == noErr )  return errAEEventNotHandled;
  972.     else return err;
  973. }
  974.  
  975. static OSErr AEPutFieldArray ( AEDescList *resultList, ArrayHandle arrayH )
  976. {
  977.     Handle        theHndl;
  978.     long            count, len, k;
  979.     long            indexLast=0;
  980.     unsigned char    *p, *q;
  981.     OSErr        err = noErr;
  982.     
  983.     count = ((Array *) *arrayH)->count;
  984.     if ( count <= 0 ) return err;
  985.  
  986.     theHndl = ((Array *) *arrayH)->h;
  987.     HLock( theHndl );
  988.     p = (unsigned char *) *theHndl;
  989.  
  990.     for ( k=0; k<count; k++ ) {
  991. #ifdef TEST_QSORT
  992.         q = p + ((Array *) *arrayH)->pair[k].keyword;
  993.         len = ((Array *) *arrayH)->pair[k].keywordlen;
  994. #else /* TEST_QSORT */
  995.         q = p + ((Array *) *arrayH)->pair[k].text;
  996.         len = ((Array *) *arrayH)->pair[k].textlen;
  997. #endif /* TEST_QSORT */
  998. #ifdef DEBUG
  999. //        Message("Apple event: DoResolveRecord AEPutPtr(%ld)¥n", (k+1));
  1000. #endif /* DEBUG */
  1001.         err = AEPutPtr( resultList, indexLast, typeChar, q, len );
  1002.         if ( err != noErr ) { ErrMsgAE( err, false ); break; }
  1003.     }
  1004.     
  1005.     HUnlock( theHndl );
  1006.  
  1007.     return err;
  1008. }
  1009.  
  1010.  
  1011. static void ErrMsgAE ( long err, Boolean fatal )
  1012. {
  1013. #ifdef DEBUG
  1014.     ErrorMessageAE ( err, fatal );
  1015. #endif /* DEBUG */
  1016. }
  1017.  
  1018. /***** Apple Event FileList *****/
  1019.  
  1020. static long        gFSSpecListNum = 0;
  1021. static Handle    gFSSpecList = nil;
  1022.  
  1023. long AECountFileList ( void )
  1024. {
  1025.     return gFSSpecListNum;
  1026. }
  1027.  
  1028. void AEPutFile ( FSSpec *theFSSpec )
  1029. {
  1030.     long        index;
  1031.     Size        dataSize = sizeof( FSSpec );
  1032.     Handle    theHandle;
  1033.     OSErr    err;
  1034.  
  1035.     theHandle = gFSSpecList;
  1036.     
  1037.     if ( theHandle == nil ) {
  1038.         theHandle = NewHandleClear( dataSize );
  1039.         gFSSpecList = theHandle;
  1040.         if ( theHandle == nil ) { /* error */
  1041.             ErrorMessageMEM( memFullErr, true ); }
  1042.     } else {
  1043.         dataSize += GetHandleSize( theHandle );
  1044.         SetHandleSize( theHandle, dataSize );
  1045.         if ( (err=MemError()) != noErr ) { /* error */
  1046.             ErrorMessageMEM( err, true ); }
  1047.     }
  1048.     
  1049.     index = gFSSpecListNum;
  1050.     ((FSSpec *) *theHandle)[index] = *theFSSpec;
  1051.     
  1052.     gFSSpecListNum += 1;
  1053. }
  1054.  
  1055. Boolean AEGetFile ( FSSpec *theFSSpec, long index )
  1056. {
  1057.     if ( index < 0 || gFSSpecListNum <= index )  return false;
  1058.     
  1059.     *theFSSpec = ((FSSpec *) *gFSSpecList)[index];
  1060.     
  1061.     return true;
  1062. }
  1063.  
  1064. void AEDisposFileList ( void )
  1065. {
  1066.     if ( gFSSpecList != nil ) DisposeHandle( gFSSpecList );
  1067.     gFSSpecList = nil;
  1068.  
  1069.     gFSSpecListNum = 0;
  1070. }
  1071.  
  1072.  
  1073. // end of program
  1074.  
  1075. #ifdef SAMPLE
  1076. void main( void )
  1077. {
  1078.     GestaltCheck( gestaltSystemVersion );
  1079. //    GestaltCheck( gestaltProcessorType );    // for version 1.1.1
  1080.  
  1081.     InitToolbox();
  1082.     SetupMenuBar();
  1083.     SetupAppleEvent();
  1084.  
  1085.     EventLoop();
  1086.  
  1087.     ExitToShell();
  1088. }
  1089.  
  1090. void EventLoop( void )
  1091. {
  1092.     Boolean        gotEvent;
  1093.     EventRecord    event;
  1094.     RgnHandle        mouseRgn;
  1095.  
  1096.     gDone = false;
  1097.     mouseRgn = nil;
  1098.  
  1099.     while ( gDone == false ) {
  1100.         gotEvent = WaitNextEvent(everyEvent,&event,kSleep,mouseRgn);
  1101.         if ( gotEvent ) DoEvent( &event );
  1102.     }
  1103. }
  1104.  
  1105.  
  1106. void DoEvent( EventRecord *event )
  1107. {
  1108.     char        theChar;
  1109.     Boolean    toActive;
  1110.  
  1111.     switch( event->what ) {
  1112.     case kHighLevelEvent:
  1113.         if ( event->message == kCoreEventClass ) 
  1114.             switch ( *((long *) (&(event->where))) ) {
  1115.                 case kAEOpenApplication:    gAEOpenAppl = true; break;
  1116.                 case kAEOpenDocuments:    gAEOpenDocs = true; break;
  1117.                 case kAEPrintDocuments:    gAEPrintDoc = true; break;
  1118.                 case kAEQuitApplication:    gAEQuitAppl = true; break;
  1119.                 default:                break; }
  1120.         AEProcessAppleEvent( event );
  1121.         break;
  1122.     case mouseDown:
  1123.         HandleMouseDown( event );
  1124.         break;
  1125.     case mouseUp:
  1126.     case keyUp:
  1127.         break;
  1128.     case keyDown:
  1129.     case autoKey:
  1130.     case updateEvt:
  1131.         DoUpdate( (WindowPtr) (event->message), event );
  1132.         break;
  1133.     case activateEvt:
  1134.         toActive = ( (event->modifiers & activeFlag) == activeFlag );
  1135.         DoActivate( (WindowPtr) (event->message), toActive );
  1136.         break;
  1137.     case diskEvt:
  1138.     case networkEvt:
  1139.     case driverEvt:
  1140.     case app1Evt:
  1141.     case app2Evt:
  1142.     case app3Evt:
  1143.     case osEvt:
  1144.         DoSuspentResume( event );
  1145.         break;
  1146.     }
  1147. }
  1148.  
  1149. #endif /* SAMPLE */
  1150.  
  1151.  
  1152.  
  1153.