Commit dde800ec authored by Jack Jansen's avatar Jack Jansen

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.
parent 430b1563
...@@ -27,6 +27,15 @@ import MacOS ...@@ -27,6 +27,15 @@ import MacOS
import string import string
from Carbon.ControlAccessor import * # Also import Controls constants from Carbon.ControlAccessor import * # Also import Controls constants
import macfs import macfs
import macresource
_initialized = 0
def _initialize():
global _initialized
if _initialized: return
macresource.need("DLOG", 260, "dialogs.rsrc", __name__)
def cr2lf(text): def cr2lf(text):
if '\r' in text: if '\r' in text:
...@@ -47,7 +56,7 @@ def Message(msg, id=260, ok=None): ...@@ -47,7 +56,7 @@ def Message(msg, id=260, ok=None):
The MESSAGE string can be at most 255 characters long. The MESSAGE string can be at most 255 characters long.
""" """
_initialize()
d = GetNewDialog(id, -1) d = GetNewDialog(id, -1)
if not d: if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)" 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): ...@@ -79,6 +88,7 @@ def AskString(prompt, default = "", id=261, ok=None, cancel=None):
can be at most 255 characters long. can be at most 255 characters long.
""" """
_initialize()
d = GetNewDialog(id, -1) d = GetNewDialog(id, -1)
if not d: if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)" 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): ...@@ -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, The PROMPT and DEFAULT strings, as well as the return value,
can be at most 255 characters long. can be at most 255 characters long.
""" """
_initialize()
d = GetNewDialog(id, -1) d = GetNewDialog(id, -1)
if not d: if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)" 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 ...@@ -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. The QUESTION string can be at most 255 characters.
""" """
_initialize()
d = GetNewDialog(id, -1) d = GetNewDialog(id, -1)
if not d: if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)" print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
...@@ -221,6 +233,7 @@ class ProgressBar: ...@@ -221,6 +233,7 @@ class ProgressBar:
def __init__(self, title="Working...", maxval=0, label="", id=263): def __init__(self, title="Working...", maxval=0, label="", id=263):
self.w = None self.w = None
self.d = None self.d = None
_initialize()
self.d = GetNewDialog(id, -1) self.d = GetNewDialog(id, -1)
self.w = self.d.GetDialogWindow() self.w = self.d.GetDialogWindow()
self.label(label) self.label(label)
...@@ -391,6 +404,7 @@ def _selectoption(d, optionlist, idx): ...@@ -391,6 +404,7 @@ def _selectoption(d, optionlist, idx):
def GetArgv(optionlist=None, commandlist=None, addoldfile=1, addnewfile=1, addfolder=1, id=ARGV_ID): def GetArgv(optionlist=None, commandlist=None, addoldfile=1, addnewfile=1, addfolder=1, id=ARGV_ID):
_initialize()
d = GetNewDialog(id, -1) d = GetNewDialog(id, -1)
if not d: if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)" print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
......
...@@ -353,58 +353,31 @@ def process_common_macho(template, progress, code, rsrcname, destname, is_update ...@@ -353,58 +353,31 @@ def process_common_macho(template, progress, code, rsrcname, destname, is_update
ofp.close() 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 # Copy the resources from the target specific resource template, if any
typesfound, ownertype = [], None typesfound, ownertype = [], None
try: try:
input = macresource.open_pathname(rsrcname) input = macresource.open_pathname(rsrcname)
except (MacOS.Error, ValueError): except (MacOS.Error, ValueError):
pass
if progress: if progress:
progress.inc(50) progress.inc(50)
else: 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) typesfound, ownertype = copyres(input, output, [], 0, progress)
Res.CloseResFile(input) Res.CloseResFile(input)
Res.CloseResFile(output)
# 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)
if code: if code:
if raw: if raw:
......
...@@ -95,6 +95,11 @@ def open_pathname(pathname, verbose=0): ...@@ -95,6 +95,11 @@ def open_pathname(pathname, verbose=0):
raise raise
return refno 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): def _decode(pathname, verbose=0):
# Decode an AppleSingle resource file, return the new pathname. # Decode an AppleSingle resource file, return the new pathname.
newpathname = pathname + '.df.rsrc' newpathname = pathname + '.df.rsrc'
......
...@@ -37,16 +37,11 @@ LDFLAGS=-F$(builddir) -framework System -framework Python -framework Carbon \ ...@@ -37,16 +37,11 @@ LDFLAGS=-F$(builddir) -framework System -framework Python -framework Carbon \
-framework Foundation -framework Foundation
CC=cc CC=cc
LD=cc LD=cc
REZ=/Developer/Tools/Rez
DEREZ=/Developer/Tools/DeRez
CPMAC=/Developer/Tools/CpMac CPMAC=/Developer/Tools/CpMac
PYTHON=$(builddir)/python.exe PYTHON=$(builddir)/python.exe
APPTEMPLATE=$(srcdir)/Mac/OSXResources/app APPTEMPLATE=$(srcdir)/Mac/OSXResources/app
APPSUBDIRS=MacOS Resources Resources/English.lproj 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 CACHERSRC=$(srcdir)/Mac/scripts/cachersrc.py
installapps: install_PythonLauncher install_Python install_BuildApplet install_IDE install_IDLE installapps: install_PythonLauncher install_Python install_BuildApplet install_IDE install_IDLE
...@@ -94,29 +89,6 @@ install_Python: $(PYTHON) ...@@ -94,29 +89,6 @@ install_Python: $(PYTHON)
done; \ done; \
done done
$(INSTALL_PROGRAM) $(STRIPFLAG) $(PYTHON) $(APPINSTALLDIR)/Contents/MacOS/python $(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 # Finally create the documentation symlink
$(LN) -fsn ../../../../English.lproj/Documentation $(APPINSTALLDIR)/Contents/Resources/English.lproj/Documentation $(LN) -fsn ../../../../English.lproj/Documentation $(APPINSTALLDIR)/Contents/Resources/English.lproj/Documentation
...@@ -205,11 +177,11 @@ installmacsubtree: ...@@ -205,11 +177,11 @@ installmacsubtree:
echo $(INSTALL_DATA) $$i $(MACLIBDEST); \ echo $(INSTALL_DATA) $$i $(MACLIBDEST); \
fi; \ fi; \
done done
## @for i in $(MACLIBSRC)/*.rsrc; \ @for i in $(MACLIBSRC)/*.rsrc; \
## do \ do \
## echo $(CPMAC) $$i $$b ; \ echo $(CPMAC) $$i $(MACLIBDEST) ; \
## $(CPMAC) $$i $$b ; \ $(CPMAC) $$i $(MACLIBDEST) ; \
## done done
@for d in $(MACLIBSUBDIRS); \ @for d in $(MACLIBSUBDIRS); \
do \ do \
a=$(MACLIBSRC)/$$d; \ a=$(MACLIBSRC)/$$d; \
......
...@@ -81,8 +81,42 @@ char *PyMac_StrError(int err) ...@@ -81,8 +81,42 @@ char *PyMac_StrError(int err)
static char buf[256]; static char buf[256];
Handle h; Handle h;
char *str; char *str;
static int errors_loaded;
h = GetResource('Estr', err); 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 ) { if ( h ) {
HLock(h); HLock(h);
str = (char *)*h; str = (char *)*h;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment