mirror of https://github.com/python/cpython
95 lines
2.7 KiB
C
95 lines
2.7 KiB
C
|
/*
|
||
|
* Launch the PythonSlave.py script.
|
||
|
* This works exactly as if you'd double clicked on the file in the Finder, which
|
||
|
* not surprisingly is how its implemented (via the AppleEvents route of course).
|
||
|
*
|
||
|
* Largely based on code submitted by Mark Roseman <roseman@cpsc.ucalgary.ca>
|
||
|
* Thanks!
|
||
|
*/
|
||
|
|
||
|
#include "BBPy.h"
|
||
|
|
||
|
pascal Boolean MyFileFilter(CInfoPBPtr PB);
|
||
|
FileFilterUPP gMyFileFilterUPP = NULL;
|
||
|
|
||
|
Boolean GetPythonSlaveSpec(FSSpec * docSpec) {
|
||
|
StandardFileReply reply;
|
||
|
SFTypeList typeList;
|
||
|
|
||
|
typeList[0] = 'TEXT';
|
||
|
|
||
|
//if (!gMyFileFilterUPP)
|
||
|
gMyFileFilterUPP = NewFileFilterProc( MyFileFilter );
|
||
|
|
||
|
StandardGetFile(gMyFileFilterUPP, 0, typeList, &reply);
|
||
|
|
||
|
DisposePtr((Ptr)gMyFileFilterUPP);
|
||
|
|
||
|
if(!reply.sfGood)
|
||
|
return 0; /* user cancelled */
|
||
|
|
||
|
docSpec->vRefNum = reply.sfFile.vRefNum;
|
||
|
docSpec->parID = reply.sfFile.parID;
|
||
|
BlockMove(reply.sfFile.name, docSpec->name, 64);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
pascal Boolean MyFileFilter(CInfoPBPtr PB) {
|
||
|
OSType fType; /* file type */
|
||
|
OSType fCreator; /* file creator */
|
||
|
|
||
|
fType =((HParmBlkPtr)PB)->fileParam.ioFlFndrInfo.fdType;
|
||
|
fCreator = ((HParmBlkPtr)PB)->fileParam.ioFlFndrInfo.fdCreator;
|
||
|
|
||
|
if (fType == 'TEXT' &&
|
||
|
fCreator == 'Pyth')
|
||
|
return 0;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
OSErr LaunchPythonSlave(FSSpec * docSpec) {
|
||
|
OSErr err;
|
||
|
FSSpec dirSpec;
|
||
|
AEAddressDesc finderAddress;
|
||
|
AppleEvent theEvent, theReply;
|
||
|
OSType finderSig = 'MACS';
|
||
|
AliasHandle DirAlias, FileAlias;
|
||
|
AEDesc fileList;
|
||
|
AEDesc aeDirDesc, listElem;
|
||
|
|
||
|
err = AECreateDesc(typeApplSignature, (Ptr)&finderSig, 4, &finderAddress);
|
||
|
if(err != noErr) return err;
|
||
|
|
||
|
err = AECreateAppleEvent('FNDR', 'sope', &finderAddress,
|
||
|
kAutoGenerateReturnID, kAnyTransactionID, &theEvent);
|
||
|
if(err != noErr) return err;
|
||
|
|
||
|
FSMakeFSSpec(docSpec->vRefNum, docSpec->parID, NULL, &dirSpec);
|
||
|
NewAlias(NULL, &dirSpec, &DirAlias);
|
||
|
NewAlias(NULL, docSpec, &FileAlias);
|
||
|
err = AECreateList(NULL, 0, 0, &fileList);
|
||
|
HLock((Handle)DirAlias);
|
||
|
AECreateDesc(typeAlias, (Ptr)*DirAlias, GetHandleSize((Handle)DirAlias), &aeDirDesc);
|
||
|
HUnlock((Handle)DirAlias);
|
||
|
if ((err = AEPutParamDesc(&theEvent, keyDirectObject, &aeDirDesc)) == noErr) {
|
||
|
AEDisposeDesc(&aeDirDesc);
|
||
|
HLock((Handle)FileAlias);
|
||
|
AECreateDesc(typeAlias, (Ptr)*FileAlias, GetHandleSize((Handle)FileAlias), &listElem);
|
||
|
HLock((Handle)FileAlias);
|
||
|
err = AEPutDesc(&fileList, 0, &listElem);
|
||
|
}
|
||
|
AEDisposeDesc(&listElem);
|
||
|
err = AEPutParamDesc(&theEvent, 'fsel', &fileList);
|
||
|
AEDisposeDesc(&fileList);
|
||
|
|
||
|
err = AESend(&theEvent, &theReply, kAENoReply+kAENeverInteract,
|
||
|
kAENormalPriority, kAEDefaultTimeout, 0L, 0L);
|
||
|
if(err != noErr) return err;
|
||
|
|
||
|
err = AEDisposeDesc(&theEvent);
|
||
|
if(err != noErr) return err;
|
||
|
|
||
|
err = AEDisposeDesc(&theReply);
|
||
|
return err;
|
||
|
}
|