summaryrefslogtreecommitdiffstats
path: root/Mac/Python
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>1996-09-20 15:25:16 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>1996-09-20 15:25:16 (GMT)
commit924ca855da687484ba8ac1a81913777b5204797f (patch)
tree565809bddb09abc33b0bd984e0e9700249b8a02d /Mac/Python
parentbdf03a0072ff662be72f5a72ae7f69a9e466c076 (diff)
downloadcpython-924ca855da687484ba8ac1a81913777b5204797f.zip
cpython-924ca855da687484ba8ac1a81913777b5204797f.tar.gz
cpython-924ca855da687484ba8ac1a81913777b5204797f.tar.bz2
Added macfs.FindApplication() to find application FSSpec given signature.
Diffstat (limited to 'Mac/Python')
-rw-r--r--Mac/Python/getapplbycreator.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/Mac/Python/getapplbycreator.c b/Mac/Python/getapplbycreator.c
new file mode 100644
index 0000000..3370f31
--- /dev/null
+++ b/Mac/Python/getapplbycreator.c
@@ -0,0 +1,128 @@
+/*
+** FindApplicationFromCreator uses the Desktop Database to
+** locate the creator application for the given document
+**
+** this routine will check the desktop database of all local
+** disks, then the desktop databases of all server volumes
+** (so up to two passes will be made)
+**
+** This code was created from FindApplicationFromDocument
+** routine, origin unknown.
+*/
+
+#include <Types.h>
+#include <Files.h>
+#include <Errors.h>
+#include "getapplbycreator.h"
+
+
+OSErr FindApplicationFromCreator(OSType creator,
+ FSSpecPtr applicationFSSpecPtr)
+{
+ enum { localPass, remotePass, donePass } volumePass;
+ DTPBRec desktopParams;
+ HParamBlockRec hfsParams;
+ short volumeIndex;
+ Boolean foundFlag;
+ GetVolParmsInfoBuffer volumeInfoBuffer;
+ OSErr retCode;
+
+/* dkj 12/94 initialize flag to false (thanks to Peter Baral for pointing out this bug) */
+ foundFlag = false;
+
+ volumePass = localPass;
+ volumeIndex = 0;
+
+ do {
+ /*
+ ** first, find the vRefNum of the volume whose Desktop Database
+ ** we're checking this time
+ */
+
+ volumeIndex++;
+
+ /* convert the volumeIndex into a vRefNum */
+
+ hfsParams.volumeParam.ioNamePtr = nil;
+ hfsParams.volumeParam.ioVRefNum = 0;
+ hfsParams.volumeParam.ioVolIndex = volumeIndex;
+ retCode = PBHGetVInfoSync(&hfsParams);
+
+ /* a nsvErr indicates that the current pass is over */
+ if (retCode == nsvErr) goto SkipThisVolume;
+ if (retCode != noErr) goto Bail;
+
+ /*
+ ** call GetVolParms to determine if this volume is a server
+ ** (a remote volume)
+ */
+
+ hfsParams.ioParam.ioBuffer = (Ptr) &volumeInfoBuffer;
+ hfsParams.ioParam.ioReqCount = sizeof(GetVolParmsInfoBuffer);
+ retCode = PBHGetVolParmsSync(&hfsParams);
+ if (retCode != noErr) goto Bail;
+
+ /*
+ ** if the vMServerAdr field of the volume information buffer
+ ** is zero, this is a local volume; skip this volume
+ ** if it's local on a remote pass or remote on a local pass
+ */
+
+ if ((volumeInfoBuffer.vMServerAdr != 0) !=
+ (volumePass == remotePass)) goto SkipThisVolume;
+
+ /* okay, now we've found the vRefNum for our desktop database call */
+
+ desktopParams.ioVRefNum = hfsParams.volumeParam.ioVRefNum;
+
+ /*
+ ** find the path refNum for the desktop database for
+ ** the volume we're interested in
+ */
+
+ desktopParams.ioNamePtr = nil;
+
+ retCode = PBDTGetPath(&desktopParams);
+ if (retCode == noErr && desktopParams.ioDTRefNum != 0) {
+
+ /*
+ ** use the GetAPPL call to find the preferred application
+ ** for opening any document with this one's creator
+ */
+
+ desktopParams.ioIndex = 0;
+ desktopParams.ioFileCreator = creator;
+ desktopParams.ioNamePtr = applicationFSSpecPtr->name;
+ retCode = PBDTGetAPPLSync(&desktopParams);
+
+ if (retCode == noErr) {
+ /*
+ ** okay, found it; fill in the application file spec
+ ** and set the flag indicating we're done
+ */
+
+ applicationFSSpecPtr->parID = desktopParams.ioAPPLParID;
+ applicationFSSpecPtr->vRefNum = desktopParams.ioVRefNum;
+ foundFlag = true;
+
+ }
+ }
+
+ SkipThisVolume:
+ /*
+ ** if retCode indicates a no such volume error or if this
+ ** was the first pass, it's time to move on to the next pass
+ */
+
+ if (retCode == nsvErr) {
+ volumePass++;
+ volumeIndex = 0;
+ }
+
+ } while (foundFlag == false && volumePass != donePass);
+
+Bail:
+ if (retCode == nsvErr)
+ return fnfErr; /* More logical than "No such volume" */
+ return retCode;
+}