| /* |
| * 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 <[email protected]> |
| * 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; |
| } |