home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Tool Chest / Dev.CD Feb 97 TC.toast / Sample Code / Interapplication Communication / MenuScripter 4.0 / Sources / MSAEGetDataSize.c < prev    next >
Encoding:
Text File  |  1996-07-09  |  3.7 KB  |  148 lines  |  [TEXT/CWIE]

  1. // MSAEGetDataSize.c
  2. //
  3. // Original version by Jon Lansdell and Nigel Humphreys.
  4. // 4.0 and 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1996, all rights reserved.
  6.  
  7. #include "MSAEGetDataSize.h"
  8.  
  9. #include "MSAEUtils.h"
  10.  
  11. // -----------------------------------------------------------------------
  12. //        Name:             DoGetDataSize
  13. //        Purpose:        Handles the GetDataSize AppleEvent.
  14. // -----------------------------------------------------------------------
  15.  
  16. pascal OSErr    DoGetDataSize(const AppleEvent    *theAppleEvent,
  17.                                     AppleEvent    *reply,
  18.                                     long        handlerRefCon)
  19. #ifdef __MWERKS__
  20.     #pragma unused (handlerRefCon)
  21. #endif
  22.  
  23.     AEDesc        directObj = {typeNull, NULL},
  24.                 result = {typeNull, NULL};
  25.     Size          actualSize;
  26.     DescType      returnedType;
  27.     DescType      reqType;
  28.     OSErr         err;
  29.     
  30.         // pick up the direct object, which is the object whose data is to be sized
  31.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  32.         
  33.         // now the get the type wanted - optional
  34.     reqType = typeChar;    // Default to char
  35.     (void)AEGetParamPtr(theAppleEvent, keyAERequestedType, typeType, &returnedType,
  36.                                                 (Ptr)&reqType, sizeof(reqType), &actualSize);
  37.         
  38.     err = GotRequiredParams(theAppleEvent);
  39.     if (noErr != err) goto done;
  40.     
  41.     if (typeNull != directObj.descriptorType)
  42.         err = GetDataSizeDesc(&directObj, reqType, &result);
  43.     else
  44.         err = errAENoSuchObject;
  45.         
  46.     err = AddResultToReply(&result, reply, err);
  47.  
  48. done:    
  49.     (void)AEDisposeDesc(&directObj);
  50.     (void)AEDisposeDesc(&result);
  51.             
  52.     return(err);
  53. } // DoGetDataSize
  54.  
  55.  
  56. OSErr    GetDataSizeTextToken(TextToken* theToken, AEDesc* result)
  57. {
  58.     long    aSize;
  59.     OSErr    err;
  60.     
  61.     aSize = theToken->tokenLength;
  62.     
  63.     err = AECreateDesc(typeLongInteger, (Ptr)&aSize, sizeof(aSize), result);
  64.  
  65.     return(err);
  66. }
  67.  
  68. OSErr    GetDataSizeTextDesc(AEDesc* textDesc, AEDesc* result)
  69. {
  70.     TextToken        aTextToken;
  71.     Size            actualSize;
  72.     OSErr            err;
  73.  
  74.     if (typeMyText != textDesc->descriptorType)
  75.         return(errAETypeError);
  76.         
  77.     GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  78.  
  79.     err = GetDataSizeTextToken(&aTextToken, result);
  80.     
  81.     return(err);
  82. }
  83.  
  84. OSErr    GetDataSizeDesc(AEDesc* aDesc, DescType reqType, AEDesc* result)
  85. {
  86.     AEDesc        dataSizeDesc = {typeNull, NULL},
  87.                 textDesc = {typeNull, NULL},
  88.                 itemDesc = {typeNull, NULL},
  89.                 itemResult = {typeNull, NULL};
  90.     long        itemCount,
  91.                 index;
  92.     DescType    theAEKeyword;
  93.     OSErr        err;
  94.     
  95.     if (typeObjectSpecifier == aDesc->descriptorType)
  96.         err = AEResolve(aDesc, kAEIDoMinimum, &dataSizeDesc);
  97.     else if (typeNull != aDesc->descriptorType)
  98.         err = AEDuplicateDesc(aDesc, &dataSizeDesc);
  99.         
  100.     if (noErr != err) goto done;
  101.     
  102.     if (typeAEList == dataSizeDesc.descriptorType)
  103.     {
  104.         err = AECreateList(NULL, 0 , false, result);    // Result will also be a list of items
  105.         if (noErr != err) goto done;
  106.         err = AECountItems(&dataSizeDesc, &itemCount);
  107.         if (noErr != err) goto done;
  108.         
  109.         for (index = 1; index <= itemCount; index++)
  110.         {
  111.             err = AEGetNthDesc(&dataSizeDesc, index, typeWildCard, &theAEKeyword, &itemDesc);
  112.             if (noErr != err) goto done;
  113.             
  114.             err = GetDataSizeDesc(&itemDesc, reqType, &itemResult);    // Call recursively
  115.             if (noErr != err) goto done;
  116.             
  117.             err = AEPutDesc(result, 0, &itemResult);    // Add to our result list
  118.             if (noErr != err) goto done;
  119.  
  120.             (void)AEDisposeDesc(&itemDesc);
  121.             (void)AEDisposeDesc(&itemResult);
  122.         }
  123.     }
  124.     else
  125.     {
  126.         switch (reqType)
  127.         {
  128.             case typeChar:
  129.                 err = AECoerceDesc(&dataSizeDesc, typeMyText, &textDesc);
  130.                 if (noErr != err) goto done;
  131.                 err = GetDataSizeTextDesc(&textDesc, result);
  132.                 break;
  133.                 
  134.             default:
  135.                 err = errAEWrongDataType;
  136.         }
  137.     }
  138.     
  139. done:
  140.     (void)AEDisposeDesc(&dataSizeDesc);
  141.     (void)AEDisposeDesc(&textDesc);
  142.     (void)AEDisposeDesc(&itemDesc);
  143.     (void)AEDisposeDesc(&itemResult);
  144.     
  145.     return(err);
  146. }
  147.