def menu_save(self): if not self.path: self.menu_save_as() return # Will call us recursively # # First save data # dhandle = self.ted.WEGetText() data = dhandle.data fp = open(self.path, 'wb') # NOTE: wb, because data has CR for end-of-line fp.write(data) if data[-1] <> '\r': fp.write('\r') fp.close() # # Now save style and soup # oldresfile = Res.CurResFile() try: rf = Res.FSpOpenResFile(self.path, 3) except Res.Error: Res.FSpCreateResFile(self.path, '????', 'TEXT', macfs.smAllScripts) rf = Res.FSpOpenResFile(self.path, 3) styles = Res.Resource('') soup = Res.Resource('') self.ted.WECopyRange(0, 0x3fffffff, None, styles, soup) styles.AddResource('styl', 128, '') soup.AddResource('SOUP', 128, '') Res.CloseResFile(rf) Res.UseResFile(oldresfile) self.ted.WEResetModCount()
def copyres(input, output, *args, **kwargs): openedin = openedout = 0 if type(input) == types.StringType: input = Res.FSpOpenResFile(input, 1) openedin = 1 if type(output) == types.StringType: output = Res.FSpOpenResFile(output, 3) openedout = 1 try: apply(buildtools.copyres, (input, output) + args, kwargs) finally: if openedin: Res.CloseResFile(input) if openedout: Res.CloseResFile(output)
def __init__(self, path, ttFont, res_id=None): self.file = cStringIO.StringIO() self.name = path self.closed = 0 fullname = ttFont['name'].getName( 4, 1, 0) # Full name, mac, default encoding familyname = ttFont['name'].getName( 1, 1, 0) # Fam. name, mac, default encoding psname = ttFont['name'].getName(6, 1, 0) # PostScript name, etc. if fullname is None or fullname is None or psname is None: from fontTools import ttLib raise ttLib.TTLibError, "can't make 'sfnt' resource, no Macintosh 'name' table found" self.fullname = fullname.string self.familyname = familyname.string self.psname = psname.string if self.familyname <> self.psname[:len(self.familyname)]: # ugh. force fam name to be the same as first part of ps name, # fondLib otherwise barfs. for i in range(min(len(self.psname), len(self.familyname))): if self.familyname[i] <> self.psname[i]: break self.familyname = self.psname[:i] self.ttFont = ttFont self.res_id = res_id if os.path.exists(self.name): os.remove(self.name) # XXX datafork support Res.FSpCreateResFile(self.name, 'DMOV', 'FFIL', 0) self.resref = Res.FSpOpenResFile(self.name, 3) # exclusive read/write permission
def mergecfmfiles(srclist, dst, architecture='fat'): srclist = list(srclist) for i in range(len(srclist)): srclist[i] = Carbon.File.pathname(srclist[i]) dst = Carbon.File.pathname(dst) dstfile = open(dst, 'wb') rf = Res.FSpOpenResFile(dst, 3) try: dstcfrg = CfrgResource() for src in srclist: srccfrg = CfrgResource(src) for frag in srccfrg.fragments: if frag.architecture == 'pwpc' and architecture == 'm68k': continue if frag.architecture == 'm68k' and architecture == 'pwpc': continue dstcfrg.append(frag) frag.copydata(dstfile) cfrgres = Res.Resource(dstcfrg.build()) Res.UseResFile(rf) cfrgres.AddResource('cfrg', 0, '') finally: dstfile.close() rf = Res.CloseResFile(rf)
def mergecfmfiles(srclist, dst, architecture='fat'): """Merge all files in srclist into a new file dst. If architecture is given, only code fragments of that type will be used: "pwpc" for PPC, "m68k" for cfm68k. This does not work for "classic" 68k code, since it does not use code fragments to begin with. If architecture is None, all fragments will be used, enabling FAT binaries. """ srclist = list(srclist) for i in range(len(srclist)): srclist[i] = Carbon.File.pathname(srclist[i]) dst = Carbon.File.pathname(dst) dstfile = open(dst, "wb") rf = Res.FSpOpenResFile(dst, 3) try: dstcfrg = CfrgResource() for src in srclist: srccfrg = CfrgResource(src) for frag in srccfrg.fragments: if frag.architecture == 'pwpc' and architecture == 'm68k': continue if frag.architecture == 'm68k' and architecture == 'pwpc': continue dstcfrg.append(frag) frag.copydata(dstfile) cfrgres = Res.Resource(dstcfrg.build()) Res.UseResFile(rf) cfrgres.AddResource('cfrg', 0, "") finally: dstfile.close() rf = Res.CloseResFile(rf)
def readLWFN(path, onlyHeader=0): """reads an LWFN font file, returns raw data""" resRef = Res.FSpOpenResFile(path, 1) # read-only try: Res.UseResFile(resRef) n = Res.Count1Resources('POST') data = [] for i in range(501, 501 + n): res = Res.Get1Resource('POST', i) code = ord(res.data[0]) if ord(res.data[1]) <> 0: raise T1Error, 'corrupt LWFN file' if code in [1, 2]: if onlyHeader and code == 2: break data.append(res.data[2:]) elif code in [3, 5]: break elif code == 4: f = open(path, "rb") data.append(f.read()) f.close() elif code == 0: pass # comment, ignore else: raise T1Error, 'bad chunk code: ' + `code` finally: Res.CloseResFile(resRef) data = string.join(data, '') assertType1(data) return data
def MyOpenResFile(path): mode = 1 # read only try: resref = Res.FSpOpenResFile(path, mode) except Res.Error: # try data fork resref = Res.FSOpenResourceFile(path, u'', mode) return resref
def writewindowsettings(self): try: resref = Res.FSpOpenResFile(self.path, 3) except Res.Error: Res.FSpCreateResFile(self.path, self._creator, 'TEXT', smAllScripts) resref = Res.FSpOpenResFile(self.path, 3) try: data = Res.Resource(marshal.dumps(self.settings)) Res.UseResFile(resref) try: temp = Res.Get1Resource('PyWS', 128) temp.RemoveResource() except Res.Error: pass data.AddResource('PyWS', 128, "window settings") finally: Res.UpdateResFile(resref) Res.CloseResFile(resref)
def writeestr(dst, edict): """Create Estr resource file given a dictionary of errors.""" os.unlink(dst.as_pathname()) Res.FSpCreateResFile(dst, 'RSED', 'rsrc', smAllScripts) output = Res.FSpOpenResFile(dst, WRITE) Res.UseResFile(output) for num in edict.keys(): res = Res.Resource(Pstring(edict[num][0])) res.AddResource('Estr', num, '') res.WriteResource() Res.CloseResFile(output)
def readwindowsettings(self): try: resref = Res.FSpOpenResFile(self.path, 1) except Res.Error: return try: Res.UseResFile(resref) data = Res.Get1Resource('PyWS', 128) self.settings = marshal.loads(data.data) except: pass Res.CloseResFile(resref)
def __init__(self, path, mode='r'): import macfs if mode == 'r': permission = 1 # read only elif mode == 'w': permission = 3 # exclusive r/w else: raise error, 'mode should be either "r" or "w"' self.mode = mode fss = macfs.FSSpec(path) self.resref = Res.FSpOpenResFile(fss, permission) Res.UseResFile(self.resref) self.path = path self.fonds = [] self.getFONDs()
def __init__(self, path=None): self.version = 1 self.fragments = [] self.path = path if path is not None and os.path.exists(path): currentresref = Res.CurResFile() resref = Res.FSpOpenResFile(path, 1) Res.UseResFile(resref) try: try: data = Res.Get1Resource('cfrg', 0).data except Res.Error: raise Res.Error, "no 'cfrg' resource found", sys.exc_traceback finally: Res.CloseResFile(resref) Res.UseResFile(currentresref) self.parse(data) if self.version != 1: raise error, "unknown 'cfrg' resource format"
def writeLWFN(path, data): Res.FSpCreateResFile(path, "just", "LWFN", 0) resRef = Res.FSpOpenResFile(path, 2) # write-only try: Res.UseResFile(resRef) resID = 501 chunks = findEncryptedChunks(data) for isEncrypted, chunk in chunks: if isEncrypted: code = 2 else: code = 1 while chunk: res = Res.Resource(chr(code) + '\0' + chunk[:LWFNCHUNKSIZE - 2]) res.AddResource('POST', resID, '') chunk = chunk[LWFNCHUNKSIZE - 2:] resID = resID + 1 res = Res.Resource(chr(5) + '\0') res.AddResource('POST', resID, '') finally: Res.CloseResFile(resRef)
def open_pathname(pathname, verbose=0): """Open a resource file given by pathname, possibly decoding an AppleSingle file""" try: refno = Res.FSpOpenResFile(pathname, 1) except Res.Error, arg: if arg[0] in (-37, -39): # No resource fork. We may be on OSX, and this may be either # a data-fork based resource file or a AppleSingle file # from the CVS repository. try: refno = Res.FSOpenResourceFile(pathname, u'', 1) except Res.Error, arg: if arg[0] != -199: # -199 is "bad resource map" raise else: return refno # Finally try decoding an AppleSingle file pathname = _decode(pathname, verbose=verbose) refno = Res.FSOpenResourceFile(pathname, u'', 1)
def getstylesoup(self, pathname): if not pathname: return None, None oldrf = Res.CurResFile() try: rf = Res.FSpOpenResFile(self.path, 1) except Res.Error: return None, None try: hstyle = Res.Get1Resource('styl', 128) hstyle.DetachResource() except Res.Error: hstyle = None try: hsoup = Res.Get1Resource('SOUP', 128) hsoup.DetachResource() except Res.Error: hsoup = None Res.CloseResFile(rf) Res.UseResFile(oldrf) return hstyle, hsoup
def resource_pathname(pathname, verbose=0): """Return the pathname for a resource file (either DF or RF based). If the pathname given already refers to such a file simply return it, otherwise first decode it.""" try: refno = Res.FSpOpenResFile(pathname, 1) Res.CloseResFile(refno) except Res.Error, arg: if arg[0] in (-37, -39): # No resource fork. We may be on OSX, and this may be either # a data-fork based resource file or a AppleSingle file # from the CVS repository. try: refno = Res.FSOpenResourceFile(pathname, u'', 1) except Res.Error, arg: if arg[0] != -199: # -199 is "bad resource map" raise else: return refno # Finally try decoding an AppleSingle file pathname = _decode(pathname, verbose=verbose)
def dataFromFile(pathOrFSSpec, nameOrID="", resType='NFNT'): from Carbon import Res import macfs if type(pathOrFSSpec) == types.StringType: fss = macfs.FSSpec(pathOrFSSpec) else: fss = pathOrFSSpec resref = Res.FSpOpenResFile(fss, 1) # readonly try: Res.UseResFile(resref) if not nameOrID: # just take the first in the file res = Res.Get1IndResource(resType, 1) elif type(nameOrID) == types.IntType: res = Res.Get1Resource(resType, nameOrID) else: res = Res.Get1NamedResource(resType, nameOrID) theID, theType, name = res.GetResInfo() data = res.data finally: Res.CloseResFile(resref) return data
import sys import macfs from Carbon import Res from Carbon import Ctl from Carbon import Dlg # Find macfreeze directory FREEZEDIR=os.path.join(sys.prefix, ":Mac:Tools:macfreeze") sys.path.append(FREEZEDIR) import macfreeze # # Resources for the dialog # RESFILE="macbuild.rsrc" h = Res.FSpOpenResFile(RESFILE, 0) DIALOG_ID=512 I_OK=1 I_CANCEL=2 I_G2PRO_FREEZE=4 I_G2PRO_BUILD=5 I_G2LITE_FREEZE=7 I_G2LITE_BUILD=8 I_PLAYER_FREEZE=10 I_PLAYER_BUILD=11 I_SMILPRO_FREEZE=13 I_SMILPRO_BUILD=14
# A minimal text editor.
"""BuildCGIApplet.py -- Create a CGI applet from a Python script.
del sys.path[0] print 'sys.path', sys.path print 'sys.argv[0]', sys.argv[0] # Workaround for a strange KeyboardInterrupt bug under Carbon import MacOS if MacOS.runtimemodel == 'carbon': MacOS.SchedParams(0) ID_SPLASH_DIALOG=513 # XXXX Debugging code: assure the resource file is available from Carbon import Res try: Res.GetResource('DLOG', ID_SPLASH_DIALOG) except: Res.FSpOpenResFile(':player.rsrc', 0) Res.FSpOpenResFile(':playercontrols.rsrc', 0) Res.FSpOpenResFile(':common.rsrc', 0) Res.FSpOpenResFile(':playerballoons.rsrc', 0) Res.GetResource('DLOG', ID_SPLASH_DIALOG) # Now time for real work. import os import string import macfs # # Set variable for standalone cmif: # try: import SR
"""Import a module while pretending its name is __main__. This
"""Parse sys/errno.h and Errors.h and create Estr resource"""
"""macgen_bin - Generate application from shared libraries"""
#
import buildtools from Carbon import Res import py_resource buildtools.DEBUG = 1 template = buildtools.findtemplate() ide_home = os.path.join(sys.exec_prefix, ":Mac:Tools:IDE") mainfilename = os.path.join(ide_home, "PythonIDE.py") dstfilename = os.path.join(sys.exec_prefix, "Python IDE") buildtools.process(template, mainfilename, dstfilename, 1) targetref = Res.FSpOpenResFile(dstfilename, 3) Res.UseResFile(targetref) files = os.listdir(ide_home) # skip this script and the main program files = filter( lambda x: x[-3:] == '.py' and x not in ("BuildIDE.py", "PythonIDE.py"), files) # add the modules as PYC resources for name in files: print "adding", name fullpath = os.path.join(ide_home, name) id, name = py_resource.frompyfile(fullpath, name[:-3],
def generate(input, output, module_dict=None, architecture='fat', debug=0): # try to remove old file try: os.remove(output) except: pass if module_dict is None: import macmodulefinder print "Searching for modules..." module_dict, missing = macmodulefinder.process(input, [], [], 1) if missing: import EasyDialogs missing.sort() answer = EasyDialogs.AskYesNoCancel( "Some modules could not be found; continue anyway?\n(%s)" % string.join(missing, ", ")) if answer <> 1: sys.exit(0) applettemplatepath = buildtools.findtemplate() corepath = findpythoncore() dynamicmodules, dynamicfiles, extraresfiles = findfragments( module_dict, architecture) print 'Adding "__main__"' buildtools.process(applettemplatepath, input, output, 0) outputref = Res.FSpOpenResFile(output, 3) try: Res.UseResFile(outputref) print "Adding Python modules" addpythonmodules(module_dict) print "Adding PythonCore resources" copyres(corepath, outputref, ['cfrg', 'Popt', 'GU\267I'], 1) print "Adding resources from shared libraries" for ppcpath, cfm68kpath in extraresfiles: if os.path.exists(ppcpath): copyres(ppcpath, outputref, ['cfrg'], 1) elif os.path.exists(cfm68kpath): copyres(cfm68kpath, outputref, ['cfrg'], 1) print "Fixing sys.path prefs" Res.UseResFile(outputref) try: res = Res.Get1Resource('STR#', 228) # from PythonCore except Res.Error: pass else: res.RemoveResource() # setting pref file name to empty string res = Res.Get1NamedResource('STR ', "PythonPreferenceFileName") res.data = Pstring("") res.ChangedResource() syspathpref = "$(APPLICATION)" res = Res.Resource("\000\001" + Pstring(syspathpref)) res.AddResource("STR#", 229, "sys.path preference") print "Creating 'PYD ' resources" for modname, (ppcfrag, cfm68kfrag) in dynamicmodules.items(): res = Res.Resource(Pstring(ppcfrag) + Pstring(cfm68kfrag)) id = 0 while id < 128: id = Res.Unique1ID('PYD ') res.AddResource('PYD ', id, modname) finally: Res.CloseResFile(outputref) print "Merging code fragments" cfmfile.mergecfmfiles([applettemplatepath, corepath] + dynamicfiles.keys(), output, architecture) print "done!"
"""macresource - Locate and open the resources needed for a script."""
else: import quietconsole quietconsole.install() # XXXX Temp: enable Navigation import macfsn macfsn._install() ID_SPLASH_DIALOG = 513 # XXXX Debugging code: assure the resource file is available from Carbon import Res try: Res.GetResource('DLOG', ID_SPLASH_DIALOG) except: Res.FSpOpenResFile(':macsmil2pro.rsrc', 0) Res.FSpOpenResFile(':editor.rsrc', 0) Res.FSpOpenResFile(':playercontrols.rsrc', 0) Res.FSpOpenResFile(':common.rsrc', 0) Res.FSpOpenResFile(':editorballoons.rsrc', 0) Res.GetResource('DLOG', ID_SPLASH_DIALOG) # Now time for real work. import os import string import macfs # # Set variable for standalone cmif: # try:
quietconsole=None else: import quietconsole quietconsole.install() # XXXX Temp: enable Navigation import macfsn macfsn._install() ID_SPLASH_DIALOG=513 # XXXX Debugging code: assure the resource file is available from Carbon import Res try: Res.GetResource('DLOG', ID_SPLASH_DIALOG) except: Res.FSpOpenResFile(':macg2lite.rsrc', 0) Res.FSpOpenResFile(':editor.rsrc', 0) Res.FSpOpenResFile(':playercontrols.rsrc', 0) Res.FSpOpenResFile(':common.rsrc', 0) Res.FSpOpenResFile(':editorballoons.rsrc', 0) Res.GetResource('DLOG', ID_SPLASH_DIALOG) # Now time for real work. import os import string import macfs # # Set variable for standalone cmif: # try: