home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-11-20 | 3.8 KB | 160 lines | [TEXT/CWIE] |
- // SVAESave.c
- //
- // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
- // 3.1 updates by Greg Sutton.
- // ©Apple Computer Inc 1995, all rights reserved.
-
- #include "SVAESave.h"
-
- #include "SVEditAEUtils.h"
- #include "SVEditWindow.h" // for DPtrFromWindowPtr()
- #include "SVEditFile.h" // for DoSave() etc…
-
-
- // -----------------------------------------------------------------------
- // Name: DoSaveWindow
- // Purpose: Handles the Save AppleEvent.
- // -----------------------------------------------------------------------
-
- #pragma segment File
-
- pascal OSErr DoSaveWindow(const AppleEvent *theAppleEvent,
- AppleEvent *reply,
- long handlerRefCon)
- {
- #pragma unused (reply, handlerRefCon)
-
- AEDesc directObj = {typeNull, NULL};
- Size actualSize;
- DescType returnedType;
- FSSpec destFSSpec;
-
- WindowToken aWindowToken;
- OSErr err;
-
- // pick up the direct object
- err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
-
- // pick up optional destination param, if any
- if (noErr != AEGetParamPtr(theAppleEvent, keyAEDestination, typeFSS, &returnedType,
- (Ptr)&destFSSpec, sizeof(destFSSpec), &actualSize))
- {
- destFSSpec.vRefNum = 0;
- destFSSpec.parID = 0;
- }
-
- err = GotRequiredParams(theAppleEvent);
- if (noErr != err) goto done;
-
- if (typeNull != directObj.descriptorType)
- err = SaveDesc(&directObj, &destFSSpec);
- else if (FrontWindow())
- {
- aWindowToken.tokenWindow = FrontWindow();
-
- err = SaveWindowToken(&aWindowToken, &destFSSpec);
- }
- else
- err = errAENoSuchObject;
-
- done:
- if (directObj.dataHandle)
- AEDisposeDesc(&directObj);
-
- return(err);
- } // DoSaveWindow
-
-
- OSErr SaveWindowToken(WindowToken* theToken, FSSpec* destFSSpec)
- {
- DPtr docPtr;
- OSErr err;
-
- docPtr = DPtrFromWindowPtr(theToken->tokenWindow);
-
- if (! docPtr)
- return(errAENoSuchObject);
-
- if (docPtr->everSaved == false && ! destFSSpec->vRefNum && ! destFSSpec->parID)
- return(kAEGenericErr); // Never been saved and no destination to save
-
- if (destFSSpec->vRefNum || destFSSpec->parID) // We were given a destination
- err = DoSave(docPtr, *destFSSpec);
- else
- err = SaveUsingTemp(docPtr);
-
- return(err);
- }
-
-
- OSErr SaveWindowDesc(AEDesc* windowDesc, FSSpec* destFSSpec)
- {
- WindowToken aWindowToken;
- Size actualSize;
- OSErr err;
-
- if (typeMyWndw != windowDesc->descriptorType)
- return(errAETypeError);
-
- GetRawDataFromDescriptor(windowDesc, (Ptr)&aWindowToken, sizeof(aWindowToken), &actualSize);
-
- err = SaveWindowToken(&aWindowToken, destFSSpec);
-
- return(err);
- }
-
-
- OSErr SaveDesc(AEDesc* aDesc, FSSpec* destFSSpec)
- {
- AEDesc saveDesc = {typeNull, NULL},
- windowDesc = {typeNull, NULL},
- itemDesc = {typeNull, NULL};
- long itemCount,
- index;
- DescType theAEKeyword;
- OSErr err;
-
- if (typeObjectSpecifier == aDesc->descriptorType)
- err = AEResolve(aDesc, kAEIDoMinimum, &saveDesc);
- else
- err = AEDuplicateDesc(aDesc, &saveDesc);
-
- if (noErr != err) goto done;
-
- switch (saveDesc.descriptorType)
- {
- case typeAEList:
- err = AECountItems(&saveDesc, &itemCount);
- if (noErr != err) goto done;
-
- for (index = 1; index <= itemCount; index++) // Do front back order
- {
- err = AEGetNthDesc(&saveDesc, index, typeWildCard, &theAEKeyword, &itemDesc);
- if (noErr != err) goto done;
-
- err = SaveDesc(&itemDesc, destFSSpec); // Call recursively
- if (noErr != err) goto done;
-
- if (itemDesc.dataHandle)
- AEDisposeDesc(&itemDesc);
- }
- break;
-
- default:
- err = AECoerceDesc(&saveDesc, typeMyWndw, &windowDesc);
- if (noErr != err) goto done;
- err = SaveWindowDesc(&windowDesc, destFSSpec);
- }
-
- done:
- if (saveDesc.dataHandle)
- AEDisposeDesc(&saveDesc);
- if (windowDesc.dataHandle)
- AEDisposeDesc(&windowDesc);
- if (itemDesc.dataHandle)
- AEDisposeDesc(&itemDesc);
-
- return(err);
- }
-
-