mirror of https://github.com/python/cpython
Changed PyMac_GetPythonDir to use a preferences file to store the
alias resource. Also added a few comments.
This commit is contained in:
parent
fc0ff42034
commit
6cfab2346c
|
@ -28,6 +28,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include <OSUtils.h> /* for Set(Current)A5 */
|
#include <OSUtils.h> /* for Set(Current)A5 */
|
||||||
#include <Files.h>
|
#include <Files.h>
|
||||||
#include <Aliases.h>
|
#include <Aliases.h>
|
||||||
|
#include <Folders.h>
|
||||||
#include <StandardFile.h>
|
#include <StandardFile.h>
|
||||||
#include <Resources.h>
|
#include <Resources.h>
|
||||||
#include <Memory.h>
|
#include <Memory.h>
|
||||||
|
@ -378,18 +379,50 @@ PyMac_GetPythonDir()
|
||||||
AliasHandle handle;
|
AliasHandle handle;
|
||||||
FSSpec dirspec;
|
FSSpec dirspec;
|
||||||
int ok = 0, exists = 0;
|
int ok = 0, exists = 0;
|
||||||
Boolean modified = 0;
|
Boolean modified = 0, cannotmodify = 0;
|
||||||
StandardFileReply sfreply;
|
StandardFileReply sfreply;
|
||||||
|
short oldrh, prefrh;
|
||||||
|
short prefdirRefNum;
|
||||||
|
long prefdirDirID;
|
||||||
|
|
||||||
handle = (AliasHandle)GetResource('alis', 128);
|
/*
|
||||||
|
** Remember old resource file and try to open preferences file
|
||||||
|
** in the preferences folder. If it doesn't exist we try to create
|
||||||
|
** it. If anything fails here we limp on, but set cannotmodify so
|
||||||
|
** we don't try to store things later on.
|
||||||
|
*/
|
||||||
|
oldrh = CurResFile();
|
||||||
|
if ( FindFolder(kOnSystemDisk, 'pref', kDontCreateFolder, &prefdirRefNum,
|
||||||
|
&prefdirDirID) != noErr ) {
|
||||||
|
/* Something wrong with preferences folder */
|
||||||
|
cannotmodify = 1;
|
||||||
|
} else {
|
||||||
|
(void)FSMakeFSSpec(prefdirRefNum, prefdirDirID, "\pPython Preferences", &dirspec);
|
||||||
|
prefrh = FSpOpenResFile(&dirspec, fsRdWrShPerm);
|
||||||
|
if ( prefrh == -1 ) {
|
||||||
|
/* It doesn't exist. Try to create it */
|
||||||
|
FSpCreateResFile(&dirspec, 'PYTH', 'pref', NULL);
|
||||||
|
prefrh = FSpOpenResFile(&dirspec, fsRdWrShPerm);
|
||||||
|
if ( prefrh == -1 ) {
|
||||||
|
cannotmodify = 1;
|
||||||
|
} else {
|
||||||
|
UseResFile(prefrh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* So, we've opened our preferences file, we hope. Look for the alias */
|
||||||
|
handle = (AliasHandle)Get1Resource('alis', 128);
|
||||||
if ( handle ) {
|
if ( handle ) {
|
||||||
|
/* It exists. Resolve it (possibly updating it) */
|
||||||
if ( ResolveAlias(NULL, handle, &dirspec, &modified) == noErr )
|
if ( ResolveAlias(NULL, handle, &dirspec, &modified) == noErr )
|
||||||
ok = 1;
|
ok = 1;
|
||||||
exists = 1;
|
exists = 1;
|
||||||
}
|
}
|
||||||
if ( !ok ) {
|
if ( !ok ) {
|
||||||
|
/* No luck, so far. ask the user for help */
|
||||||
item = Alert(NOPYTHON_ALERT, NULL);
|
item = Alert(NOPYTHON_ALERT, NULL);
|
||||||
if ( item == YES_ITEM ) {
|
if ( item == YES_ITEM ) {
|
||||||
|
/* The user wants to point us to a directory. Let her do so */
|
||||||
StandardGetFile(NULL, 0, NULL, &sfreply);
|
StandardGetFile(NULL, 0, NULL, &sfreply);
|
||||||
if ( sfreply.sfGood ) {
|
if ( sfreply.sfGood ) {
|
||||||
if ( sfreply.sfIsFolder ) {
|
if ( sfreply.sfIsFolder ) {
|
||||||
|
@ -406,6 +439,7 @@ PyMac_GetPythonDir()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if ( item == CURWD_ITEM ) {
|
} else if ( item == CURWD_ITEM ) {
|
||||||
|
/* The user told us the current directory is fine. Build an FSSpec for it */
|
||||||
if ( getwd(name) ) {
|
if ( getwd(name) ) {
|
||||||
if ( FSMakeFSSpec(0, 0, Pstring(name), &dirspec) == 0 ) {
|
if ( FSMakeFSSpec(0, 0, Pstring(name), &dirspec) == 0 ) {
|
||||||
ok = 1;
|
ok = 1;
|
||||||
|
@ -414,15 +448,23 @@ PyMac_GetPythonDir()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( ok && modified ) {
|
if ( ok && modified && !cannotmodify) {
|
||||||
|
/* We have a new, valid fsspec and we can update the preferences file. Do so. */
|
||||||
if ( !exists ) {
|
if ( !exists ) {
|
||||||
if (NewAlias(NULL, &dirspec, &handle) == 0 )
|
if (NewAlias(NULL, &dirspec, &handle) == 0 )
|
||||||
AddResource((Handle)handle, 'alis', 128, "\p");
|
AddResource((Handle)handle, 'alis', 128, "\p");
|
||||||
} else {
|
} else {
|
||||||
ChangedResource((Handle)handle);
|
ChangedResource((Handle)handle);
|
||||||
}
|
}
|
||||||
UpdateResFile(CurResFile());
|
UpdateResFile(prefrh);
|
||||||
}
|
}
|
||||||
|
if ( !cannotmodify ) {
|
||||||
|
/* This means we have the resfile open. Close it. */
|
||||||
|
CloseResFile(prefrh);
|
||||||
|
}
|
||||||
|
/* Back to the old resource file */
|
||||||
|
UseResFile(oldrh);
|
||||||
|
/* Now turn the fsspec into a path to give back to our caller */
|
||||||
if ( ok ) {
|
if ( ok ) {
|
||||||
ok = (nfullpath(&dirspec, name) == 0);
|
ok = (nfullpath(&dirspec, name) == 0);
|
||||||
if ( ok ) strcat(name, ":");
|
if ( ok ) strcat(name, ":");
|
||||||
|
|
Loading…
Reference in New Issue