]> granicus.if.org Git - python/commitdiff
When installing resource files whose name ends in .rsrc use the
authorJack Jansen <jack.jansen@cwi.nl>
Mon, 17 Feb 2003 16:47:12 +0000 (16:47 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Mon, 17 Feb 2003 16:47:12 +0000 (16:47 +0000)
"copy anything to a data fork based resource file" trick of macresource.
Fixes #688007.

Lib/plat-mac/bundlebuilder.py
Lib/plat-mac/macresource.py

index d8c55575d8930ac3df6ebd8d56c7bb7d72f621ba..9d50f9116f5066a0b5ff2aa857701e04d093fc39 100755 (executable)
@@ -36,6 +36,7 @@ from copy import deepcopy
 import getopt
 from plistlib import Plist
 from types import FunctionType as function
+import macresource
 
 
 class BundleBuilderError(Exception): pass
@@ -188,6 +189,8 @@ class BundleBuilder(Defaults):
                        dst = pathjoin(self.bundlepath, dst)
                        if self.symlink:
                                symlink(src, dst, mkdirs=1)
+                       elif os.path.splitext(src)[1] == '.rsrc':
+                               macresource.install(src, dst, mkdirs=1)
                        else:
                                copy(src, dst, mkdirs=1)
 
index 7e99c00a695694d72eecc79c38ea0c7767e96831..16eed00f4980ef97b96f2b1ef5910582472bac11 100644 (file)
@@ -3,6 +3,8 @@
 from Carbon import Res
 import os
 import sys
+import MacOS
+import macostools
 
 class ArgumentError(TypeError): pass
 class ResourceFileNotFoundError(ImportError): pass
@@ -99,16 +101,51 @@ def open_error_resource():
        mapping."""
        need('Estr', 1, filename="errors.rsrc", modname=__name__)
        
-def _decode(pathname, verbose=0):
+def _decode(pathname, verbose=0, newpathname=None):
        # Decode an AppleSingle resource file, return the new pathname.
-       newpathname = pathname + '.df.rsrc'
-       if os.path.exists(newpathname) and \
+       if not newpathname:
+               newpathname = pathname + '.df.rsrc'
+               if os.path.exists(newpathname) and \
                        os.stat(newpathname).st_mtime >= os.stat(pathname).st_mtime:
-               return newpathname
+                       return newpathname
        if verbose:
                print 'Decoding', pathname
        import applesingle
        applesingle.decode(pathname, newpathname, resonly=1)
        return newpathname
        
-       
\ No newline at end of file
+def install(src, dst, mkdirs=0):
+       """Copy a resource file. The result will always be a datafork-based
+       resource file, whether the source is datafork-based, resource-fork
+       based or AppleSingle-encoded."""
+       if mkdirs:
+               macostools.mkdirs(os.path.split(dst)[0])
+       try:
+               refno = Res.FSOpenResourceFile(src, u'', 1)
+       except Res.Error, arg:
+               if arg[0] != -199:
+                       # -199 is "bad resource map"
+                       raise
+       else:
+               # Resource-fork based. Simply copy.
+               Res.CloseResFile(refno)
+               macostools.copy(src, dst)
+               
+       try:
+               refno = Res.FSpOpenResFile(src, 1)
+       except Res.Error, arg:
+               if not arg[0] in (-37, -39):
+                       raise
+       else:
+               Res.CloseResFile(refno)
+               BUFSIZ=0x80000      # Copy in 0.5Mb chunks
+               ifp = MacOS.openrf(src, '*rb')
+               ofp = open(dst, 'wb')
+               d = ifp.read(BUFSIZ)
+               while d:
+                       ofp.write(d)
+                       d = ifp.read(BUFSIZ)
+               ifp.close()
+               ofp.close()
+               
+       _decode(src, newpathname=dst)