Blame | Last modification | View Log | Download | RSS feed
#include <stdio.h>/*#include <math.h>*/#include <fp.h> /* Jago */#include <Quickdraw.h>#include "Defn.h"#include "Graphics.h"#include "RIntf.h"OSErr doWritePictData(WindowPtr windowPtr,SInt16 tempFileRefNum);OSErr doCopyAppNameResource(WindowPtr windowPtr);OSErr doCopyGraResource(ResType ,SInt16 ,SInt16 ,SInt16 );OSErr doWriteFile(WindowPtr windowPtr);extern pascal OSErr FSpGetFullPath (const FSSpec*, short*, Handle*);extern Graphic_Ref gGReference[MAX_NUM_G_WIN + 1];extern SInt16 gAppResFileRefNum;SInt16 ConsolefileRefNum;FSSpec ConsolefileFSSpec;char InitFile[256];OSErr doRSave(Boolean *haveCancel){FILE *fp ;OSErr err;if (strlen(InitFile) == 0){err = doRSaveAs(haveCancel);}else{*haveCancel = false;err = noErr;fp = fopen(InitFile, "wb"); /* binary file */if (!fp)error("can't save data -- unable to open ./%s\n", InitFile);if (HASHTAB(R_GlobalEnv) != R_NilValue)R_SaveToFile(HASHTAB(R_GlobalEnv), fp, 0);elseR_SaveToFile(FRAME(R_GlobalEnv), fp, 0);fclose(fp);}return err;}/*Based on previous doRSaveAs of Ross Ihaka.Now handles correctly XDR. Jago Nov 2000 (Stefano M. Iacus)*/OSErr doRSaveAs(Boolean *haveCancel){StandardFileReply fileReply;OSType fileType;OSErr osError = 0;FILE *fp ;SInt16 pathLen;Handle pathName;char path[FILENAME_MAX],cur_path[FILENAME_MAX];StandardPutFile("\pSave as:","\p.RData",&fileReply);*haveCancel = !(fileReply.sfGood);if(fileReply.sfGood){if(!(fileReply.sfReplacing)){fileType = 'ROBJ';osError = FSpCreate(&fileReply.sfFile, R_ID,fileType,smSystemScript);if(osError != noErr)return(osError);}FSpGetFullPath(&fileReply.sfFile, &pathLen, &pathName);HLock((Handle) pathName);strncpy(InitFile, *pathName, pathLen);InitFile[pathLen] = '\0';HUnlock((Handle) pathName);fp = fopen(InitFile, "wb"); /* binary file */if (!fp)error("can't save data -- unable to open ./%s\n", InitFile);if (HASHTAB(R_GlobalEnv) != R_NilValue)R_SaveToFile(HASHTAB(R_GlobalEnv), fp, 0);elseR_SaveToFile(FRAME(R_GlobalEnv), fp, 0);fclose(fp);}return(osError);}/* ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× doSaveCommand*/OSErr doSaveGraCommand(void){WindowPtr windowPtr;SInt16 WinIndex;OSErr osError = 0;windowPtr = FrontWindow();WinIndex = isGraphicWindow(windowPtr);if(gGReference[WinIndex].fileRefNum)osError = doWriteFile(windowPtr);elseosError = doSaveAsGraCommand();return(osError);}/* ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× doSaveAsCommand*/OSErr doSaveAsGraCommand(void){WindowPtr windowPtr;SInt16 WinIndex;StandardFileReply fileReply;OSType fileType;SInt16 fileRefNum;OSErr osError = 0;windowPtr = FrontWindow();WinIndex = isGraphicWindow(windowPtr);StandardPutFile("\pSave as:","\pR Picture",&fileReply);if(fileReply.sfGood){if(!(fileReply.sfReplacing)){fileType = 'PICT';osError = FSpCreate(&fileReply.sfFile,'ABFF',fileType,smSystemScript);if(osError != noErr)return(osError);}gGReference[WinIndex].fileFSSpec = fileReply.sfFile;if(gGReference[WinIndex].fileRefNum != 0){osError = FSClose(gGReference[WinIndex].fileRefNum);gGReference[WinIndex].fileRefNum = 0;}if(osError == noErr)osError = FSpOpenDF(&gGReference[WinIndex].fileFSSpec,fsRdWrPerm,&fileRefNum);if(osError == noErr){gGReference[WinIndex].fileRefNum = fileRefNum;osError = doWriteFile(windowPtr);}}return(osError);}/* ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× doWritePictData*/OSErr doWritePictData(WindowPtr windowPtr,SInt16 tempFileRefNum){PicHandle pictureHdl;SInt32 numberOfBytes, dummyData;SInt16 volRefNum, WinIndex;OSErr osError;DevDesc *dd;GrafPtr picPort;WinIndex = isGraphicWindow(windowPtr);SetPort(windowPtr);HLock((Handle) pictureHdl);dd = (DevDesc*)gGReference[WinIndex].devdesc;pictureHdl = OpenPicture(&(windowPtr->portRect));GetPort(&picPort);playDisplayList(dd);SetPort(picPort);ClosePicture();HUnlock((Handle) pictureHdl);numberOfBytes = 512;dummyData = 0;osError = SetFPos(tempFileRefNum,fsFromStart,0);if(osError == noErr)osError = FSWrite(tempFileRefNum,&numberOfBytes,&dummyData);numberOfBytes = GetHandleSize((Handle)pictureHdl);if(osError == noErr){HLock((Handle)pictureHdl);osError = FSWrite(tempFileRefNum,&numberOfBytes,*pictureHdl);HUnlock((Handle)pictureHdl);}if(osError == noErr)osError = SetEOF(tempFileRefNum,512 + numberOfBytes);if(osError == noErr)osError = GetVRefNum(tempFileRefNum,&volRefNum);if(osError == noErr)osError = FlushVol(NULL,volRefNum);return(osError);}/* ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× doCopyAppNameResource*/OSErr doCopyAppNameResource(WindowPtr windowPtr){OSType fileType;OSErr osError;SInt16 fileRefNum, WinIndex;WinIndex = isGraphicWindow(windowPtr);fileType = 'PICT';FSpCreateResFile(&(gGReference[WinIndex].fileFSSpec),'ABFF',fileType,smSystemScript);osError = ResError();if(osError == noErr)fileRefNum = FSpOpenResFile(&gGReference[WinIndex].fileFSSpec,fsRdWrPerm);if(fileRefNum > 0)osError = doCopyGraResource('STR ',-16396,gAppResFileRefNum,fileRefNum);elseosError = ResError();if(osError == noErr)CloseResFile(fileRefNum);osError = ResError();return(osError);}/* ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× doCopyGraResource*/OSErr doCopyGraResource(ResType resourceType,SInt16 resourceID,SInt16 sourceFileRefNum,SInt16 destFileRefNum){Handle sourceResourceHdl;Str255 sourceResourceName;ResType ignoredType;SInt16 ignoredID;UseResFile(sourceFileRefNum);sourceResourceHdl = GetResource(resourceType,resourceID);if(sourceResourceHdl != NULL){GetResInfo(sourceResourceHdl,&ignoredID,&ignoredType,sourceResourceName);DetachResource(sourceResourceHdl);UseResFile(destFileRefNum);AddResource(sourceResourceHdl,resourceType,resourceID,sourceResourceName);if(ResError() == noErr)UpdateResFile(destFileRefNum);}ReleaseResource(sourceResourceHdl);return(ResError());}/* ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× doWriteFile*/OSErr doWriteFile(WindowPtr windowPtr){FSSpec fileSpecActual, fileSpecTemp;UInt32 currentTime;Str255 tempFileName;SInt16 tempFileVolNum, tempFileRefNum, WinIndex;SInt32 tempFileDirID;OSErr osError;WinIndex = isGraphicWindow(windowPtr);fileSpecActual = gGReference[WinIndex].fileFSSpec;GetDateTime(¤tTime);NumToString((SInt32) currentTime,tempFileName);osError = FindFolder(fileSpecActual.vRefNum,kTemporaryFolderType,kCreateFolder,&tempFileVolNum,&tempFileDirID);if(osError == noErr)osError = FSMakeFSSpec(tempFileVolNum,tempFileDirID,tempFileName,&fileSpecTemp);if(osError == noErr || osError == fnfErr)osError = FSpCreate(&fileSpecTemp,'trsh','trsh',smSystemScript);if(osError == noErr)osError = FSpOpenDF(&fileSpecTemp,fsRdWrPerm,&tempFileRefNum);if(osError == noErr){osError = doWritePictData(windowPtr,tempFileRefNum);}if(osError == noErr)osError = FSClose(tempFileRefNum);if(osError == noErr)osError = FSClose(gGReference[WinIndex].fileRefNum);if(osError == noErr)osError = FSpExchangeFiles(&fileSpecTemp,&fileSpecActual);if(osError == noErr)osError = FSpDelete(&fileSpecTemp);if(osError == noErr)osError = FSpOpenDF(&fileSpecActual,fsRdWrPerm,&gGReference[WinIndex].fileRefNum);/* if(osError == noErr){osError = doCopyAppNameResource(windowPtr);}*/return(osError);}