Added 'description' class attribute to every command class (to help the
[python/dscho.git] / Mac / Contrib / BBPy / source / BBPy_lauch.c
blobf9b964cee19d67a0785d97b339b2054976b2d3bc
1 /*
2 * Launch the PythonSlave.py script.
3 * This works exactly as if you'd double clicked on the file in the Finder, which
4 * not surprisingly is how its implemented (via the AppleEvents route of course).
5 *
6 * Largely based on code submitted by Mark Roseman <roseman@cpsc.ucalgary.ca>
7 * Thanks!
8 */
10 #include "BBPy.h"
12 pascal Boolean MyFileFilter(CInfoPBPtr PB);
13 FileFilterUPP gMyFileFilterUPP = NULL;
15 Boolean GetPythonSlaveSpec(FSSpec * docSpec) {
16 StandardFileReply reply;
17 SFTypeList typeList;
19 typeList[0] = 'TEXT';
21 //if (!gMyFileFilterUPP)
22 gMyFileFilterUPP = NewFileFilterProc( MyFileFilter );
24 StandardGetFile(gMyFileFilterUPP, 0, typeList, &reply);
26 DisposePtr((Ptr)gMyFileFilterUPP);
28 if(!reply.sfGood)
29 return 0; /* user cancelled */
31 docSpec->vRefNum = reply.sfFile.vRefNum;
32 docSpec->parID = reply.sfFile.parID;
33 BlockMove(reply.sfFile.name, docSpec->name, 64);
34 return 1;
37 pascal Boolean MyFileFilter(CInfoPBPtr PB) {
38 OSType fType; /* file type */
39 OSType fCreator; /* file creator */
41 fType =((HParmBlkPtr)PB)->fileParam.ioFlFndrInfo.fdType;
42 fCreator = ((HParmBlkPtr)PB)->fileParam.ioFlFndrInfo.fdCreator;
44 if (fType == 'TEXT' &&
45 fCreator == 'Pyth')
46 return 0;
47 return 1;
50 OSErr LaunchPythonSlave(FSSpec * docSpec) {
51 OSErr err;
52 FSSpec dirSpec;
53 AEAddressDesc finderAddress;
54 AppleEvent theEvent, theReply;
55 OSType finderSig = 'MACS';
56 AliasHandle DirAlias, FileAlias;
57 AEDesc fileList;
58 AEDesc aeDirDesc, listElem;
60 err = AECreateDesc(typeApplSignature, (Ptr)&finderSig, 4, &finderAddress);
61 if(err != noErr) return err;
63 err = AECreateAppleEvent('FNDR', 'sope', &finderAddress,
64 kAutoGenerateReturnID, kAnyTransactionID, &theEvent);
65 if(err != noErr) return err;
67 FSMakeFSSpec(docSpec->vRefNum, docSpec->parID, NULL, &dirSpec);
68 NewAlias(NULL, &dirSpec, &DirAlias);
69 NewAlias(NULL, docSpec, &FileAlias);
70 err = AECreateList(NULL, 0, 0, &fileList);
71 HLock((Handle)DirAlias);
72 AECreateDesc(typeAlias, (Ptr)*DirAlias, GetHandleSize((Handle)DirAlias), &aeDirDesc);
73 HUnlock((Handle)DirAlias);
74 if ((err = AEPutParamDesc(&theEvent, keyDirectObject, &aeDirDesc)) == noErr) {
75 AEDisposeDesc(&aeDirDesc);
76 HLock((Handle)FileAlias);
77 AECreateDesc(typeAlias, (Ptr)*FileAlias, GetHandleSize((Handle)FileAlias), &listElem);
78 HLock((Handle)FileAlias);
79 err = AEPutDesc(&fileList, 0, &listElem);
81 AEDisposeDesc(&listElem);
82 err = AEPutParamDesc(&theEvent, 'fsel', &fileList);
83 AEDisposeDesc(&fileList);
85 err = AESend(&theEvent, &theReply, kAENoReply+kAENeverInteract,
86 kAENormalPriority, kAEDefaultTimeout, 0L, 0L);
87 if(err != noErr) return err;
89 err = AEDisposeDesc(&theEvent);
90 if(err != noErr) return err;
92 err = AEDisposeDesc(&theReply);
93 return err;