Sources/MSAEClone.c

// MSAEClone.c
//
// Original version by Jon Lansdell and Nigel Humphreys.
// 4.0 and 3.1 updates by Greg Sutton.
// ©Apple Computer Inc 1996, all rights reserved.
 
/*
    14-Nov-95 : GS : Disposed of all interim descriptors in DoClone().
*/
 
#include "MSAEClone.h"
 
#include "MSAEUtils.h"
#include "MSAECreate.h"
#include "MSAEGetData.h"
 
 
#pragma segment AppleEvent
 
 
// Clone an object - only handles text objects
     
     
pascal OSErr    DoClone(const AppleEvent *theAppleEvent, AppleEvent *reply, long refcon)
{
#ifdef __MWERKS__
    #pragma unused (reply, refcon)
#endif
 
    AEDesc      directObj = {typeNull, NULL},
                insertHereDesc = {typeNull, NULL},
                resultDesc = {typeNull, NULL};
    OSErr       err;
 
    err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
    if (noErr != err) goto done;
 
    err = AEGetParamDesc(theAppleEvent, keyAEInsertHere, typeWildCard, &insertHereDesc);
    if (noErr != err) goto done;
 
    err = GotRequiredParams(theAppleEvent);
    if (noErr != err) goto done;
    
    err = CloneDesc(&directObj, &insertHereDesc, &resultDesc);
    if (noErr != err) goto done;
    
    err = AddResultToReply(&resultDesc, reply, err);
 
done:
    (void)AEDisposeDesc(&directObj);
    (void)AEDisposeDesc(&insertHereDesc);
    (void)AEDisposeDesc(&resultDesc);
        
    return(err);
}
 
OSErr   CloneTextDesc(AEDesc* textDesc, AEDesc* insertHereDesc, AEDesc* result)
{
    TextToken       aTextToken;
    Size            actualSize;
    AEDesc          dataDesc = {typeNull, NULL},
                    propertyDesc = {typeNull, NULL};    // Use to pass no properties
    OSErr           err;
 
    if (typeMyText != textDesc->descriptorType)
        return(errAETypeError);
        
    GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
    
    err = GetTextTextProperty(&aTextToken, &dataDesc);
    if (noErr != err) goto done;
    
    err = CreateText(cText, &dataDesc, insertHereDesc, &propertyDesc, result);
 
done:
    if (dataDesc.dataHandle)
        AEDisposeDesc(&dataDesc);
 
    return(err);
}
 
OSErr   CloneDesc(AEDesc* aDesc, AEDesc* insertHereDesc, AEDesc* result)
{
    AEDesc      cloneDesc = {typeNull, NULL},
                textDesc = {typeNull, NULL};
    OSErr       err;
    
    if (typeObjectSpecifier == aDesc->descriptorType)
        err = AEResolve(aDesc, kAEIDoMinimum, &cloneDesc);
    else if (typeNull != aDesc->descriptorType)
        err = AEDuplicateDesc(aDesc, &cloneDesc);
        
    if (noErr != err) goto done;
    
    switch (cloneDesc.descriptorType)
    {
        case typeAEList:
            err = errAETypeError;
            // We can't handle copying more than one item to the scrap
            break;
            
        default:
            err = AECoerceDesc(&cloneDesc, typeMyText, &textDesc);
            if (noErr != err) goto done;
            err = CloneTextDesc(&textDesc, insertHereDesc, result);
    }
    
done:
    (void)AEDisposeDesc(&cloneDesc);
    (void)AEDisposeDesc(&textDesc);
    
    return(err);
}