summaryrefslogtreecommitdiffstats
path: root/Mac/Contrib/BBPy/source/BBPy_lauch.c
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/Contrib/BBPy/source/BBPy_lauch.c')
-rw-r--r--Mac/Contrib/BBPy/source/BBPy_lauch.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/Mac/Contrib/BBPy/source/BBPy_lauch.c b/Mac/Contrib/BBPy/source/BBPy_lauch.c
new file mode 100644
index 0000000..f9b964c
--- /dev/null
+++ b/Mac/Contrib/BBPy/source/BBPy_lauch.c
@@ -0,0 +1,94 @@
+/*
+ * 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;
+}