Got rid of the python.rsrc resource file. The error message strings and

dialogs are now stored in Mac/Lib, and loaded on demand through macresource.
Not only does this simplify a MacPython based on Apple's Python, but
it also makes Mac error codes come out symbolically when running command
line python (if you have Mac/Lib in your path).

The resource files are copied from Mac/Resources. The old ones will disappear
after the OS9 build procedure has been adjusted.
This commit is contained in:
Jack Jansen 2002-11-07 23:07:05 +00:00
parent 430b1563dd
commit dde800ec4e
7 changed files with 74 additions and 76 deletions

View File

@ -27,6 +27,15 @@ import MacOS
import string
from Carbon.ControlAccessor import * # Also import Controls constants
import macfs
import macresource
_initialized = 0
def _initialize():
global _initialized
if _initialized: return
macresource.need("DLOG", 260, "dialogs.rsrc", __name__)
def cr2lf(text):
if '\r' in text:
@ -47,7 +56,7 @@ def Message(msg, id=260, ok=None):
The MESSAGE string can be at most 255 characters long.
"""
_initialize()
d = GetNewDialog(id, -1)
if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
@ -79,6 +88,7 @@ def AskString(prompt, default = "", id=261, ok=None, cancel=None):
can be at most 255 characters long.
"""
_initialize()
d = GetNewDialog(id, -1)
if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
@ -119,6 +129,7 @@ def AskPassword(prompt, default='', id=264, ok=None, cancel=None):
The PROMPT and DEFAULT strings, as well as the return value,
can be at most 255 characters long.
"""
_initialize()
d = GetNewDialog(id, -1)
if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
@ -161,6 +172,7 @@ def AskYesNoCancel(question, default = 0, yes=None, no=None, cancel=None, id=262
The QUESTION string can be at most 255 characters.
"""
_initialize()
d = GetNewDialog(id, -1)
if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
@ -221,6 +233,7 @@ class ProgressBar:
def __init__(self, title="Working...", maxval=0, label="", id=263):
self.w = None
self.d = None
_initialize()
self.d = GetNewDialog(id, -1)
self.w = self.d.GetDialogWindow()
self.label(label)
@ -391,6 +404,7 @@ def _selectoption(d, optionlist, idx):
def GetArgv(optionlist=None, commandlist=None, addoldfile=1, addnewfile=1, addfolder=1, id=ARGV_ID):
_initialize()
d = GetNewDialog(id, -1)
if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"

View File

@ -353,58 +353,31 @@ def process_common_macho(template, progress, code, rsrcname, destname, is_update
ofp.close()
if progress:
progress.label("Copy resources...")
progress.set(20)
resfilename = 'python.rsrc' # XXXX later: '%s.rsrc' % shortname
try:
output = Res.FSOpenResourceFile(
os.path.join(destname, 'Contents', 'Resources', resfilename),
u'', WRITE)
except MacOS.Error:
fsr, dummy = Res.FSCreateResourceFile(
os.path.join(destname, 'Contents', 'Resources'),
unicode(resfilename), '')
output = Res.FSOpenResourceFile(fsr, u'', WRITE)
# Copy the resources from the target specific resource template, if any
typesfound, ownertype = [], None
try:
input = macresource.open_pathname(rsrcname)
except (MacOS.Error, ValueError):
pass
if progress:
progress.inc(50)
else:
if progress:
progress.label("Copy resources...")
progress.set(20)
resfilename = 'python.rsrc' # XXXX later: '%s.rsrc' % shortname
try:
output = Res.FSOpenResourceFile(
os.path.join(destname, 'Contents', 'Resources', resfilename),
u'', WRITE)
except MacOS.Error:
fsr, dummy = Res.FSCreateResourceFile(
os.path.join(destname, 'Contents', 'Resources'),
unicode(resfilename), '')
output = Res.FSOpenResourceFile(fsr, u'', WRITE)
typesfound, ownertype = copyres(input, output, [], 0, progress)
Res.CloseResFile(input)
# Check which resource-types we should not copy from the template
skiptypes = []
## if 'vers' in typesfound: skiptypes.append('vers')
## if 'SIZE' in typesfound: skiptypes.append('SIZE')
## if 'BNDL' in typesfound: skiptypes = skiptypes + ['BNDL', 'FREF', 'icl4',
## 'icl8', 'ics4', 'ics8', 'ICN#', 'ics#']
## if not copy_codefragment:
## skiptypes.append('cfrg')
## skipowner = (ownertype <> None)
# Copy the resources from the template
input = Res.FSOpenResourceFile(
os.path.join(template, 'Contents', 'Resources', 'python.rsrc'), u'', READ)
if progress:
progress.label("Copy standard resources...")
progress.inc(0)
## dummy, tmplowner = copyres(input, output, skiptypes, 1, progress)
dummy, tmplowner = copyres(input, output, skiptypes, 1, None)
Res.CloseResFile(input)
## if ownertype == None:
## raise BuildError, "No owner resource found in either resource file or template"
# Make sure we're manipulating the output resource file now
Res.CloseResFile(output)
Res.CloseResFile(output)
if code:
if raw:

BIN
Mac/Lib/dialogs.rsrc Normal file

Binary file not shown.

BIN
Mac/Lib/errors.rsrc Normal file

Binary file not shown.

View File

@ -95,6 +95,11 @@ def open_pathname(pathname, verbose=0):
raise
return refno
def open_error_resource():
"""Open the resource file containing the error code to error message
mapping."""
need('Estr', 1, filename="errors.rsrc", modname=__name__)
def _decode(pathname, verbose=0):
# Decode an AppleSingle resource file, return the new pathname.
newpathname = pathname + '.df.rsrc'

View File

@ -37,16 +37,11 @@ LDFLAGS=-F$(builddir) -framework System -framework Python -framework Carbon \
-framework Foundation
CC=cc
LD=cc
REZ=/Developer/Tools/Rez
DEREZ=/Developer/Tools/DeRez
CPMAC=/Developer/Tools/CpMac
PYTHON=$(builddir)/python.exe
APPTEMPLATE=$(srcdir)/Mac/OSXResources/app
APPSUBDIRS=MacOS Resources Resources/English.lproj
RESOURCEDIR=$(srcdir)/Mac/Resources
RESOURCEFILE=python.rsrc
RFCONVERTER=$(srcdir)/Mac/Lib/applesingle.py
CACHERSRC=$(srcdir)/Mac/scripts/cachersrc.py
installapps: install_PythonLauncher install_Python install_BuildApplet install_IDE install_IDLE
@ -94,29 +89,6 @@ install_Python: $(PYTHON)
done; \
done
$(INSTALL_PROGRAM) $(STRIPFLAG) $(PYTHON) $(APPINSTALLDIR)/Contents/MacOS/python
# Create a temporary version of the resources here
# Note that the resource files can either be real 2-fork resource files
# or AppleSingle encoded files.
@if test -s $(RESOURCEDIR)/dialogs.rsrc; then \
echo $(PYTHON) $(RFCONVERTER) -r $(RESOURCEDIR)/dialogs.rsrc dialogs.rsrc ;\
$(PYTHON) $(RFCONVERTER) -r $(RESOURCEDIR)/dialogs.rsrc dialogs.rsrc ; \
echo $(DEREZ) -useDF -skip ckid dialogs.rsrc > dialogs.r ; \
$(DEREZ) -useDF -skip ckid dialogs.rsrc > dialogs.r ; \
else \
echo $(DEREZ) -skip ckid $(RESOURCEDIR)/dialogs.rsrc > dialogs.r ; \
$(DEREZ) -skip ckid $(RESOURCEDIR)/dialogs.rsrc > dialogs.r ; \
fi
@if test -s $(RESOURCEDIR)/errors.rsrc; then \
echo $(PYTHON) $(RFCONVERTER) -r $(RESOURCEDIR)/errors.rsrc errors.rsrc ;\
$(PYTHON) $(RFCONVERTER) -r $(RESOURCEDIR)/errors.rsrc errors.rsrc ; \
echo $(DEREZ) -useDF -skip ckid errors.rsrc > errors.r ; \
$(DEREZ) -useDF -skip ckid errors.rsrc > errors.r ; \
else \
echo $(DEREZ) -skip ckid $(RESOURCEDIR)/errors.rsrc > errors.r ; \
$(DEREZ) -skip ckid $(RESOURCEDIR)/errors.rsrc > errors.r ; \
fi
$(REZ) -useDF -o $(RESOURCEFILE) dialogs.r errors.r
$(INSTALL_DATA) $(RESOURCEFILE) $(APPINSTALLDIR)/Contents/Resources/$(RESOURCEFILE)
# Finally create the documentation symlink
$(LN) -fsn ../../../../English.lproj/Documentation $(APPINSTALLDIR)/Contents/Resources/English.lproj/Documentation
@ -205,11 +177,11 @@ installmacsubtree:
echo $(INSTALL_DATA) $$i $(MACLIBDEST); \
fi; \
done
## @for i in $(MACLIBSRC)/*.rsrc; \
## do \
## echo $(CPMAC) $$i $$b ; \
## $(CPMAC) $$i $$b ; \
## done
@for i in $(MACLIBSRC)/*.rsrc; \
do \
echo $(CPMAC) $$i $(MACLIBDEST) ; \
$(CPMAC) $$i $(MACLIBDEST) ; \
done
@for d in $(MACLIBSUBDIRS); \
do \
a=$(MACLIBSRC)/$$d; \

View File

@ -81,8 +81,42 @@ char *PyMac_StrError(int err)
static char buf[256];
Handle h;
char *str;
static int errors_loaded;
h = GetResource('Estr', err);
if (!h && !errors_loaded) {
/*
** Attempt to open the resource file containing the
** Estr resources. We ignore all errors. We also try
** this only once.
*/
errors_loaded = 1;
PyObject *m, *rv;
m = PyImport_ImportModule("macresource");
if (!m) {
if (Py_VerboseFlag)
PyErr_Print();
PyErr_Clear();
} else {
rv = PyObject_CallMethod(m, "open_error_resource", "");
if (!rv) {
if (Py_VerboseFlag)
PyErr_Print();
PyErr_Clear();
} else {
Py_DECREF(rv);
/* And try again... */
h = GetResource('Estr', err);
}
}
}
/*
** Whether the code above succeeded or not, we won't try
** again.
*/
errors_loaded = 1;
if ( h ) {
HLock(h);
str = (char *)*h;