Integrated macfsn into macfs, and made the Standard File calls return the
correct FSSpec implementations.
This commit is contained in:
parent
315e9bebcd
commit
6dd561bdfd
145
Mac/Lib/macfs.py
145
Mac/Lib/macfs.py
|
@ -2,6 +2,10 @@
|
|||
macfs and MACFS.
|
||||
"""
|
||||
import sys
|
||||
import struct
|
||||
import Carbon.Res
|
||||
import Carbon.File
|
||||
import Nav
|
||||
|
||||
# First step: ensure we also emulate the MACFS module, which contained
|
||||
# all the constants
|
||||
|
@ -11,19 +15,19 @@ sys.modules['MACFS'] = sys.modules[__name__]
|
|||
# Import all those constants
|
||||
from Carbon.Files import *
|
||||
from Carbon.Folders import *
|
||||
# Another method:
|
||||
from Carbon.Folder import FindFolder
|
||||
|
||||
# For some obscure historical reason these are here too:
|
||||
READ = 1
|
||||
WRITE = 2
|
||||
smAllScripts = -3
|
||||
|
||||
|
||||
import Carbon.File
|
||||
# The old name of the error object:
|
||||
error = Carbon.File.Error
|
||||
|
||||
#
|
||||
# The various objects macfs used to export. We override them here, because some
|
||||
# of the method names are subtly different.
|
||||
#
|
||||
class FSSpec(Carbon.File.FSSpec):
|
||||
def as_fsref(self):
|
||||
return FSRef(self)
|
||||
|
@ -73,11 +77,13 @@ class Alias(Carbon.File.Alias):
|
|||
|
||||
from Carbon.File import FInfo
|
||||
|
||||
# Backward-compatible type names:
|
||||
FSSpecType = FSSpec
|
||||
FSRefType = FSRef
|
||||
AliasType = Alias
|
||||
FInfoType = FInfo
|
||||
|
||||
# Global functions:
|
||||
def ResolveAliasFile(fss, chain=1):
|
||||
fss, isdir, isalias = Carbon.File.ResolveAliasFile(fss, chain)
|
||||
return FSSpec(fss), isdir, isalias
|
||||
|
@ -94,5 +100,132 @@ def FindApplication(*args):
|
|||
def NewAliasMinimalFromFullPath(path):
|
||||
return Alias(Carbon.File.NewAliasMinimalFromFullPath(path, '', ''))
|
||||
|
||||
# Finally, install nav services
|
||||
import macfsn
|
||||
# Another global function:
|
||||
from Carbon.Folder import FindFolder
|
||||
|
||||
#
|
||||
# Finally the old Standard File routine emulators.
|
||||
#
|
||||
|
||||
_movablemodal = 0
|
||||
_curfolder = None
|
||||
|
||||
def _mktypelist(typelist):
|
||||
# Workaround for OSX typeless files:
|
||||
if 'TEXT' in typelist and not '\0\0\0\0' in typelist:
|
||||
typelist = typelist + ('\0\0\0\0',)
|
||||
if not typelist:
|
||||
return None
|
||||
data = 'Pyth' + struct.pack("hh", 0, len(typelist))
|
||||
for type in typelist:
|
||||
data = data+type
|
||||
return Carbon.Res.Handle(data)
|
||||
|
||||
def StandardGetFile(*typelist):
|
||||
"""Ask for an input file, optionally specifying 4-char file types that are
|
||||
allowable"""
|
||||
return apply(PromptGetFile, (None,)+typelist)
|
||||
|
||||
def PromptGetFile(prompt, *typelist):
|
||||
"""Ask for an input file giving the user a prompt message. Optionally you can
|
||||
specifying 4-char file types that are allowable"""
|
||||
args = {}
|
||||
flags = 0x56
|
||||
typehandle = _mktypelist(typelist)
|
||||
if typehandle:
|
||||
args['typeList'] = typehandle
|
||||
else:
|
||||
flags = flags | 0x01
|
||||
if prompt:
|
||||
args['message'] = prompt
|
||||
args['preferenceKey'] = 'PyMC'
|
||||
if _movablemodal:
|
||||
args['eventProc'] = None
|
||||
args['dialogOptionFlags'] = flags
|
||||
_handleSetFolder(args)
|
||||
try:
|
||||
rr = Nav.NavChooseFile(args)
|
||||
good = 1
|
||||
except Nav.error, arg:
|
||||
if arg[0] != -128: # userCancelledErr
|
||||
raise Nav.error, arg
|
||||
good = 0
|
||||
fss = None
|
||||
else:
|
||||
if rr.selection:
|
||||
fss = FSSpec(rr.selection[0])
|
||||
else:
|
||||
fss = None
|
||||
good = 0
|
||||
## if typehandle:
|
||||
## typehandle.DisposeHandle()
|
||||
return fss, good
|
||||
|
||||
def StandardPutFile(prompt, default=None):
|
||||
"""Ask the user for an output file, with a prompt. Optionally you cn supply a
|
||||
default output filename"""
|
||||
args = {}
|
||||
flags = 0x07
|
||||
if prompt:
|
||||
args['message'] = prompt
|
||||
args['preferenceKey'] = 'PyMC'
|
||||
if _movablemodal:
|
||||
args['eventProc'] = None
|
||||
if default:
|
||||
args['savedFileName'] = default
|
||||
args['dialogOptionFlags'] = flags
|
||||
_handleSetFolder(args)
|
||||
try:
|
||||
rr = Nav.NavPutFile(args)
|
||||
good = 1
|
||||
except Nav.error, arg:
|
||||
if arg[0] != -128: # userCancelledErr
|
||||
raise Nav.error, arg
|
||||
good = 0
|
||||
fss = None
|
||||
else:
|
||||
fss = FSSpec(rr.selection[0])
|
||||
return fss, good
|
||||
|
||||
def SetFolder(folder):
|
||||
global _curfolder
|
||||
if _curfolder:
|
||||
rv = _curfolder
|
||||
else:
|
||||
rv = None
|
||||
_curfolder = FSSpec(folder)
|
||||
return rv
|
||||
|
||||
def _handleSetFolder(args):
|
||||
global _curfolder
|
||||
if not _curfolder:
|
||||
return
|
||||
import aepack
|
||||
fss = _curfolder
|
||||
aedesc = aepack.pack(fss)
|
||||
args['defaultLocation'] = aedesc
|
||||
_curfolder = None
|
||||
|
||||
def GetDirectory(prompt=None):
|
||||
"""Ask the user to select a folder. Optionally you can give a prompt."""
|
||||
args = {}
|
||||
flags = 0x17
|
||||
if prompt:
|
||||
args['message'] = prompt
|
||||
args['preferenceKey'] = 'PyMC'
|
||||
if _movablemodal:
|
||||
args['eventProc'] = None
|
||||
args['dialogOptionFlags'] = flags
|
||||
_handleSetFolder(args)
|
||||
try:
|
||||
rr = Nav.NavChooseFolder(args)
|
||||
good = 1
|
||||
except Nav.error, arg:
|
||||
if arg[0] != -128: # userCancelledErr
|
||||
raise Nav.error, arg
|
||||
good = 0
|
||||
fss = None
|
||||
else:
|
||||
fss = FSSpec(rr.selection[0])
|
||||
return fss, good
|
||||
|
||||
|
|
|
@ -1,162 +0,0 @@
|
|||
"""StandardFile compatability module: implement macfs StandardFile
|
||||
API calls with Navigation Services"""
|
||||
import macfs
|
||||
import struct
|
||||
from Carbon import Res
|
||||
try:
|
||||
import Nav
|
||||
except ImportError:
|
||||
Nav = None
|
||||
|
||||
_curfolder = None
|
||||
_movablemodal = 1
|
||||
|
||||
def _mktypelist(typelist):
|
||||
# Workaround for OSX typeless files:
|
||||
if 'TEXT' in typelist and not '\0\0\0\0' in typelist:
|
||||
typelist = typelist + ('\0\0\0\0',)
|
||||
if not typelist:
|
||||
return None
|
||||
data = 'Pyth' + struct.pack("hh", 0, len(typelist))
|
||||
for type in typelist:
|
||||
data = data+type
|
||||
return Res.Handle(data)
|
||||
|
||||
def _StandardGetFile(*typelist):
|
||||
return apply(_PromptGetFile, (None,)+typelist)
|
||||
|
||||
def _PromptGetFile(prompt, *typelist):
|
||||
args = {}
|
||||
flags = 0x56
|
||||
typehandle = _mktypelist(typelist)
|
||||
if typehandle:
|
||||
args['typeList'] = typehandle
|
||||
else:
|
||||
flags = flags | 0x01
|
||||
if prompt:
|
||||
args['message'] = prompt
|
||||
args['preferenceKey'] = 'PyMC'
|
||||
if _movablemodal:
|
||||
args['eventProc'] = None
|
||||
args['dialogOptionFlags'] = flags
|
||||
_handleSetFolder(args)
|
||||
try:
|
||||
rr = Nav.NavChooseFile(args)
|
||||
good = 1
|
||||
except Nav.error, arg:
|
||||
if arg[0] != -128: # userCancelledErr
|
||||
raise Nav.error, arg
|
||||
good = 0
|
||||
fss = None
|
||||
else:
|
||||
if rr.selection:
|
||||
fss = rr.selection[0]
|
||||
else:
|
||||
fss = None
|
||||
good = 0
|
||||
## if typehandle:
|
||||
## typehandle.DisposeHandle()
|
||||
return fss, good
|
||||
|
||||
def _StandardPutFile(prompt, default=None):
|
||||
args = {}
|
||||
flags = 0x07
|
||||
if prompt:
|
||||
args['message'] = prompt
|
||||
args['preferenceKey'] = 'PyMC'
|
||||
if _movablemodal:
|
||||
args['eventProc'] = None
|
||||
if default:
|
||||
args['savedFileName'] = default
|
||||
args['dialogOptionFlags'] = flags
|
||||
_handleSetFolder(args)
|
||||
try:
|
||||
rr = Nav.NavPutFile(args)
|
||||
good = 1
|
||||
except Nav.error, arg:
|
||||
if arg[0] != -128: # userCancelledErr
|
||||
raise Nav.error, arg
|
||||
good = 0
|
||||
fss = None
|
||||
else:
|
||||
fss = rr.selection[0]
|
||||
return fss, good
|
||||
|
||||
def _SetFolder(folder):
|
||||
global _curfolder
|
||||
if _curfolder:
|
||||
rv = _curfolder
|
||||
else:
|
||||
rv = None
|
||||
_curfolder = macfs.FSSpec(folder)
|
||||
return rv
|
||||
|
||||
def _handleSetFolder(args):
|
||||
global _curfolder
|
||||
if not _curfolder:
|
||||
return
|
||||
import aepack
|
||||
fss = macfs.FSSpec(_curfolder)
|
||||
aedesc = aepack.pack(fss)
|
||||
args['defaultLocation'] = aedesc
|
||||
_curfolder = None
|
||||
|
||||
def _GetDirectory(prompt=None):
|
||||
args = {}
|
||||
flags = 0x17
|
||||
if prompt:
|
||||
args['message'] = prompt
|
||||
args['preferenceKey'] = 'PyMC'
|
||||
if _movablemodal:
|
||||
args['eventProc'] = None
|
||||
args['dialogOptionFlags'] = flags
|
||||
_handleSetFolder(args)
|
||||
try:
|
||||
rr = Nav.NavChooseFolder(args)
|
||||
good = 1
|
||||
except Nav.error, arg:
|
||||
if arg[0] != -128: # userCancelledErr
|
||||
raise Nav.error, arg
|
||||
good = 0
|
||||
fss = None
|
||||
else:
|
||||
fss = rr.selection[0]
|
||||
return fss, good
|
||||
|
||||
def _install():
|
||||
macfs.StandardGetFile = StandardGetFile
|
||||
macfs.PromptGetFile = PromptGetFile
|
||||
macfs.StandardPutFile = StandardPutFile
|
||||
macfs.SetFolder = SetFolder
|
||||
macfs.GetDirectory = GetDirectory
|
||||
|
||||
if Nav and Nav.NavServicesAvailable():
|
||||
StandardGetFile = _StandardGetFile
|
||||
PromptGetFile = _PromptGetFile
|
||||
StandardPutFile = _StandardPutFile
|
||||
SetFolder = _SetFolder
|
||||
GetDirectory = _GetDirectory
|
||||
_install()
|
||||
else:
|
||||
from macfs import StandardGetFile, PromptGetFile, StandardPutFile, SetFolder, GetDirectory
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print 'Testing StandardGetFile'
|
||||
fss, ok = StandardGetFile()
|
||||
print '->', fss, ok
|
||||
print 'Testing StandardGetFile("TEXT")'
|
||||
fss, ok = StandardGetFile("TEXT")
|
||||
print '->', fss, ok
|
||||
print 'Testing PromptGetFile'
|
||||
fss, ok = PromptGetFile("prompt")
|
||||
print '->', fss, ok
|
||||
print 'Testing StandardPutFile("the prompt", "default")'
|
||||
fss, ok = StandardPutFile("the prompt", "default")
|
||||
print '->', fss, ok
|
||||
print 'Testing GetDirectory("another prompt")'
|
||||
fss, ok = GetDirectory("Another prompt")
|
||||
print '->', fss, ok
|
||||
import sys
|
||||
sys.exit(1)
|
||||
|
Loading…
Reference in New Issue