def testSetCreatorAndType(self): if not os.path.exists('/Developer/Tools/GetFileInfo'): return try: fp = open(test_support.TESTFN, 'w') fp.write('\n') fp.close() MacOS.SetCreatorAndType(test_support.TESTFN, 'ABCD', 'EFGH') cr, tp = MacOS.GetCreatorAndType(test_support.TESTFN) self.assertEquals(cr, 'ABCD') self.assertEquals(tp, 'EFGH') data = subprocess.Popen( ["/Developer/Tools/GetFileInfo", test_support.TESTFN], stdout=subprocess.PIPE).communicate()[0] tp = None cr = None for ln in data.splitlines(): if ln.startswith('type:'): tp = ln.split()[-1][1:-1] if ln.startswith('creator:'): cr = ln.split()[-1][1:-1] self.assertEquals(cr, 'ABCD') self.assertEquals(tp, 'EFGH') finally: os.unlink(test_support.TESTFN)
def getMacCreatorAndType(path): """Returns file creator and file type codes for a path. Args: path (str): A file path. Returns: A tuple of two :py:class:`fontTools.py23.Tag` objects, the first representing the file creator and the second representing the file type. """ if xattr is not None: try: finderInfo = xattr.getxattr(path, 'com.apple.FinderInfo') except (KeyError, IOError): pass else: fileType = Tag(finderInfo[:4]) fileCreator = Tag(finderInfo[4:8]) return fileCreator, fileType if MacOS is not None: fileCreator, fileType = MacOS.GetCreatorAndType(path) if sys.version_info[:2] < (2, 7) and sys.byteorder == "little": # work around bug in MacOS.GetCreatorAndType() on intel: # http://bugs.python.org/issue1594 # (fixed with Python 2.7) fileCreator = _reverseString(fileCreator) fileType = _reverseString(fileType) return fileCreator, fileType else: return None, None
def getappterminology(fullname, verbose=None): """Get application terminology by sending an AppleEvent""" # First check that we actually can send AppleEvents if not MacOS.WMAvailable(): raise RuntimeError, "Cannot send AppleEvents, no access to window manager" # Next, a workaround for a bug in MacOS 10.2: sending events will hang unless # you have created an event loop first. import Carbon.Evt Carbon.Evt.WaitNextEvent(0, 0) if os.path.isdir(fullname): # Now get the signature of the application, hoping it is a bundle pkginfo = os.path.join(fullname, 'Contents', 'PkgInfo') if not os.path.exists(pkginfo): raise RuntimeError, "No PkgInfo file found" tp_cr = open(pkginfo, 'rb').read() cr = tp_cr[4:8] else: # Assume it is a file cr, tp = MacOS.GetCreatorAndType(fullname) # Let's talk to it and ask for its AETE talker = aetools.TalkTo(cr) try: talker._start() except (MacOS.Error, aetools.Error), arg: if verbose: print >> verbose, 'Warning: start() failed, continuing anyway:', arg
def find(dir, maxlevel=5): hits = [] cur = CurResFile() names = os.listdir(dir) tuples = map(lambda x: (os.path.normcase(x), x), names) tuples.sort() names = map(lambda (x, y): y, tuples) for name in names: if name in (os.curdir, os.pardir): continue fullname = os.path.join(dir, name) if os.path.islink(fullname): pass if os.path.isdir(fullname): if maxlevel > 0: sys.stderr.write(" %s\n" % ` fullname `) hits = hits + find(fullname, maxlevel - 1) else: ctor, type = MacOS.GetCreatorAndType(fullname) if type in ('APPL', 'FNDR', 'zsys', 'INIT', 'scri', 'cdev'): sys.stderr.write(" %s\n" % ` fullname `) try: rf = OpenRFPerm(fullname, 0, '\1') except MacOS.Error, msg: print "Error:", fullname, msg continue UseResFile(rf) n = Count1Resources('aete') if rf <> cur: CloseResFile(rf) UseResFile(cur) if n > 1: hits.append(fullname) sys.stderr.write("YES! %d in %s\n" % (n, ` fullname `)) list(fullname)
def opendoc(self, path): fcreator, ftype = MacOS.GetCreatorAndType(path) if ftype == 'TEXT': self.openscript(path) elif ftype == '\0\0\0\0' and path[-3:] == '.py': self.openscript(path) else: W.Message("Can't open file of type '%s'." % ftype)
def getMacCreatorAndType(path): if MacOS is not None: fileCreator, fileType = MacOS.GetCreatorAndType(path) if sys.byteorder == "little": # work around bug in MacOS.GetCreatorAndType() on intel: # http://bugs.python.org/issue1594 fileCreator = _reverseString(fileCreator) fileType = _reverseString(fileType) return fileCreator, fileType else: return None, None
def build_app(self, filename): print filename template = buildtools.findtemplate() dstfilename = None rsrcfilename = None raw = 0 extras = [] verbose = None destroot = '' cr, tp = MacOS.GetCreatorAndType(filename) if tp == 'APPL': buildtools.update(template, filename, dstfilename) else: buildtools.process(template, filename, dstfilename, 1, rsrcname=rsrcfilename, others=extras, raw=raw, progress=verbose, destroot=destroot)
def copyres(src, dst): """Copy resource from src file to dst file.""" cur = CurResFile() ctor, type = MacOS.GetCreatorAndType(src) input = FSpOpenResFile(src, READ) try: FSpCreateResFile(dst, ctor, type, smAllScripts) except: raw_input("%s already exists... CR to write anyway! " % dst) output = FSpOpenResFile(dst, WRITE) UseResFile(input) ntypes = Count1Types() for itype in range(1, 1 + ntypes): type = Get1IndType(itype) nresources = Count1Resources(type) for ires in range(1, 1 + nresources): res = Get1IndResource(type, ires) res.LoadResource() id, type, name = res.GetResInfo() size = res.SizeResource() attrs = res.GetResAttrs() print id, type, name, size, hex(attrs) res.DetachResource() UseResFile(output) try: res2 = Get1Resource(type, id) except (RuntimeError, Res.Error), msg: res2 = None if res2: print "Duplicate type+id, not copied" print(res2.size, res2.data) print res2.GetResInfo() if res2.HomeResFile() == output: 'OK' elif res2.HomeResFile() == input: 'BAD!' else: print 'Home:', res2.HomeResFile() else: res.AddResource(type, id, name) #res.SetResAttrs(attrs) res.WriteResource() UseResFile(input)
def mimetype(url): cache = urlcache[url] if not cache.has_key('mimetype'): checkext = settings.get('checkext') mtype = None if checkext: mtype = MMmimetypes.guess_type(url)[0] if not mtype: try: u = MMurl.urlopen(url) except (IOError, OSError): pass else: mtype = u.headers.type if not mtype and sys.platform in ('mac', 'darwin'): # On the mac we do something extra: for local files we attempt to # get creator and type, and if they are us we assume we're looking # at a SMIL file. import urlparse utype, host, path, params, query, fragment = urlparse.urlparse(url) if (not utype or utype == 'file') and \ (not host or host == 'localhost'): # local file import MacOS fn = MMurl.url2pathname(path) try: ct, tp = MacOS.GetCreatorAndType(fn) except: pass else: if ct == 'GRIN' and tp == 'TEXT': mtype = 'application/x-grins-project' if not mtype and not checkext: # last resort, try extension if not done so already mtype = MMmimetypes.guess_type(url)[0] if not mtype: # failed, don't cache return None if mtype.count('/') != 1: # don't cache bad MIME type return None cache['mimetype'] = mtype return cache['mimetype']
def testGetCreatorAndType(self): if not os.path.exists('/Developer/Tools/SetFile'): return try: fp = open(test_support.TESTFN, 'w') fp.write('\n') fp.close() subprocess.call([ '/Developer/Tools/SetFile', '-t', 'ABCD', '-c', 'EFGH', test_support.TESTFN ]) cr, tp = MacOS.GetCreatorAndType(test_support.TESTFN) self.assertEquals(tp, 'ABCD') self.assertEquals(cr, 'EFGH') finally: os.unlink(test_support.TESTFN)
def getMacCreatorAndType(path): if xattr is not None: try: finderInfo = xattr.getxattr(path, 'com.apple.FinderInfo') except (KeyError, IOError): pass else: fileType = Tag(finderInfo[:4]) fileCreator = Tag(finderInfo[4:8]) return fileCreator, fileType if MacOS is not None: fileCreator, fileType = MacOS.GetCreatorAndType(path) if sys.version_info[:2] < (2, 7) and sys.byteorder == "little": # work around bug in MacOS.GetCreatorAndType() on intel: # http://bugs.python.org/issue1594 # (fixed with Python 2.7) fileCreator = _reverseString(fileCreator) fileType = _reverseString(fileType) return fileCreator, fileType else: return None, None
def getappterminology(fullname, verbose=None): if not MacOS.WMAvailable(): raise RuntimeError, 'Cannot send AppleEvents, no access to window manager' import Carbon.Evt Carbon.Evt.WaitNextEvent(0, 0) if os.path.isdir(fullname): pkginfo = os.path.join(fullname, 'Contents', 'PkgInfo') if not os.path.exists(pkginfo): raise RuntimeError, 'No PkgInfo file found' tp_cr = open(pkginfo, 'rb').read() cr = tp_cr[4:8] else: cr, tp = MacOS.GetCreatorAndType(fullname) talker = aetools.TalkTo(cr) try: talker._start() except (MacOS.Error, aetools.Error) as arg: if verbose: print >> verbose, 'Warning: start() failed, continuing anyway:', arg reply = talker.send('ascr', 'gdte') return (reply[1]['----'], cr)
def guessFileType(fileName): if not os.path.exists(fileName): return None base, ext = os.path.splitext(fileName) ext = ext.lower() if not have_broken_macsupport: try: import MacOS except ImportError: pass else: cr, tp = MacOS.GetCreatorAndType(fileName) if tp in ("sfnt", "FFIL"): return "TTF" if tp == "LWFN": return "Type 1" if ext == ".dfont": return "TTF" if ext in (".otf", ".ttf"): return "TTF" if ext in (".pfb", ".pfa"): return "Type 1" return None
# Look for scriptable applications -- that is, applications with an 'aete' resource
def guess_type(url): # On the mac we can have serious conflicts between the # extension and the cretor/type of the file. As there is # no 100% correct way to solve this we let the extension # override the creator/type. This will only lead to unexpected # results when a file is given an extension _and_ that extension # belongs to files with a different mimetype. type, encoding = mimetypes.guess_type(url) if type: return type, encoding if not _ic_instance: return type, encoding # # Next step is to see whether the extension is known to Internet Config # try: descr = _ic_instance.mapfile(url) except ic.error: descr = None else: mimetype = descr[8] if mimetype: if not '/' in mimetype: mimetype = mimetype + '/unknown' return mimetype, None # # Final step, for urls pointing to existing local files, we use # the creator/type code and give a warning # utype, host, path, params, query, fragment = urlparse.urlparse(url) if (utype and utype != 'file') or (host and host != 'localhost'): return None, None import windowinterface filename = MMurl.url2pathname(path) filename_lastpart = os.path.split(filename)[-1] try: creator, type = MacOS.GetCreatorAndType(filename) except MacOS.Error: # File doesn't exist. Give the long talk. if not warned_names.has_key(filename_lastpart): windowinterface.showmessage( 'Extension for "%s" not recognized.\nFor use with GRiNS (and for use on the web in general) please give your file the correct extension.' % filename_lastpart, identity='nomimetype') warned_names[filename_lastpart] = 1 return None, None try: descr = _ic_instance.maptypecreator(type, creator, url) except: descr = None if not descr: if not warned_names.has_key(filename_lastpart): windowinterface.showmessage( 'Extension for "%s" not recognized.\nFor use with GRiNS (and for use on the web in general) please give your file the correct extension.' % filename_lastpart, identity='nomimetype') warned_names[filename_lastpart] = 1 return None, None import windowinterface if not warned_names.has_key(filename_lastpart): windowinterface.showmessage( 'Incorrect extension for "%s"\nThis may cause problems on the web' % filename_lastpart, identity='mimetypemismatch') warned_names[filename_lastpart] = 1 mimetype = descr[8] if mimetype: if not '/' in mimetype: mimetype = mimetype + '/unknown' else: # it may be an empty string, turn into None mimetype = None return mimetype, None
def __init__(self, path = "", title = ""): defaultfontsettings, defaulttabsettings, defaultwindowsize = geteditorprefs() global _scriptuntitledcounter if not path: if title: self.title = title else: self.title = "Untitled Script %r" % (_scriptuntitledcounter,) _scriptuntitledcounter = _scriptuntitledcounter + 1 text = "" self._creator = W._signature self._eoln = os.linesep elif os.path.exists(path): path = resolvealiases(path) dir, name = os.path.split(path) self.title = name f = open(path, "rb") text = f.read() f.close() self._creator, filetype = MacOS.GetCreatorAndType(path) self.addrecentfile(path) if '\n' in text: if string.find(text, '\r\n') >= 0: self._eoln = '\r\n' else: self._eoln = '\n' text = string.replace(text, self._eoln, '\r') else: self._eoln = '\r' else: raise IOError, "file '%s' does not exist" % path self.path = path self.settings = {} if self.path: self.readwindowsettings() if self.settings.has_key("windowbounds"): bounds = self.settings["windowbounds"] else: bounds = defaultwindowsize if self.settings.has_key("fontsettings"): self.fontsettings = self.settings["fontsettings"] else: self.fontsettings = defaultfontsettings if self.settings.has_key("tabsize"): try: self.tabsettings = (tabsize, tabmode) = self.settings["tabsize"] except: self.tabsettings = defaulttabsettings else: self.tabsettings = defaulttabsettings W.Window.__init__(self, bounds, self.title, minsize = (330, 120), tabbable = 0) self.setupwidgets(text) if self.settings.has_key("selection"): selstart, selend = self.settings["selection"] self.setselection(selstart, selend) self.open() self.setinfotext() self.globals = {} self._buf = "" # for write method self.debugging = 0 self.profiling = 0 self.run_as_main = self.settings.get("run_as_main", 0) self.run_with_interpreter = self.settings.get("run_with_interpreter", 0) self.run_with_cl_interpreter = self.settings.get("run_with_cl_interpreter", 0)
def buildapplet(): buildtools.DEBUG = 1 # Find the template # (there's no point in proceeding if we can't find it) template = buildtools.findtemplate() # Ask for source text if not specified in sys.argv[1:] if not sys.argv[1:]: filename = EasyDialogs.AskFileForOpen( message='Select Python source or applet:', typeList=('TEXT', 'APPL')) if not filename: return tp, tf = os.path.split(filename) if tf[-3:] == '.py': tf = tf[:-3] else: tf = tf + '.applet' dstfilename = EasyDialogs.AskFileForSave( message='Save application as:', savedFileName=tf) if not dstfilename: return cr, tp = MacOS.GetCreatorAndType(filename) if tp == 'APPL': buildtools.update(template, filename, dstfilename) else: buildtools.process(template, filename, dstfilename, 1) else: SHORTOPTS = "o:r:ne:v?PR" LONGOPTS = ("output=", "resource=", "noargv", "extra=", "verbose", "help", "python=", "destroot=") try: options, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS) except getopt.error: usage() if options and len(args) > 1: sys.stderr.write( "Cannot use options when specifying multiple input files") sys.exit(1) dstfilename = None rsrcfilename = None raw = 0 extras = [] verbose = None destroot = '' for opt, arg in options: if opt in ('-o', '--output'): dstfilename = arg elif opt in ('-r', '--resource'): rsrcfilename = arg elif opt in ('-n', '--noargv'): raw = 1 elif opt in ('-e', '--extra'): if ':' in arg: arg = arg.split(':') extras.append(arg) elif opt in ('-P', '--python'): # This is a very dirty trick. We set sys.executable # so that bundlebuilder will use this in the #! line # for the applet bootstrap. sys.executable = arg elif opt in ('-v', '--verbose'): verbose = Verbose() elif opt in ('-?', '--help'): usage() elif opt in ('-d', '--destroot'): destroot = arg # On OS9 always be verbose if sys.platform == 'mac' and not verbose: verbose = 'default' # Loop over all files to be processed for filename in args: cr, tp = MacOS.GetCreatorAndType(filename) if tp == 'APPL': buildtools.update(template, filename, dstfilename) else: buildtools.process(template, filename, dstfilename, 1, rsrcname=rsrcfilename, others=extras, raw=raw, progress=verbose, destroot=destroot)
"""Create an applet from a Python script.
def getcreatorandtype(path): return MacOS.GetCreatorAndType(path)
def setfiletype(self, filename): if MacOS and (self.filecreator or self.filetype): creator, type = MacOS.GetCreatorAndType(filename) if self.filecreator: creator = self.filecreator if self.filetype: type = self.filetype MacOS.SetCreatorAndType(filename, creator, type)
def compileaete(aete, resinfo, fname, output = None, basepkgname = None, edit_modnames = None, creatorsignature = None, verbose = None): """Generate code for a full aete resource. fname passed for doc purposes""" version, language, script, suites = aete major, minor = divmod(version, 256) if not creatorsignature: creatorsignature, dummy = MacOS.GetCreatorAndType(fname) packagename = identify(os.path.splitext(os.path.basename(fname))[0]) if language: packagename = packagename + '_lang%d' % language if script: packagename = packagename + '_script%d' % script if len(packagename) > 27: packagename = packagename[:27] if output: if not os.path.exists(output): os.mkdir(output) pathname = output else: pathname = EasyDialogs.AskFolder(message='Create and select package folder for %s' % packagename, defaultLocation=DEFAULT_USER_PACKAGEFOLDER) output = pathname if not pathname: return else: packagename = os.path.split(os.path.normpath(pathname))[1] if not basepkgname: basepkgname = EasyDialogs.AskFolder(message='Package folder for base suite (usually StdSuites)', defaultLocation=DEFAULT_STANDARD_PACKAGEFOLDER) if basepkgname: dirname, basepkgname = os.path.split(os.path.normpath(basepkgname)) if dirname and dirname not in sys.path: sys.path.insert(0, dirname) basepackage = __import__(basepkgname) else: basepackage = None suitelist = [] allprecompinfo = [] allsuites = [] for suite in suites: compiler = SuiteCompiler(suite, basepackage, output, edit_modnames, verbose) code, modname, precompinfo = compiler.precompilesuite() if not code: continue allprecompinfo = allprecompinfo + precompinfo suiteinfo = (suite, pathname, modname) suitelist.append((code, modname)) allsuites.append(compiler) for compiler in allsuites: compiler.compilesuite(major, minor, language, script, fname, allprecompinfo) initfilename = os.path.join(output, '__init__.py') fp = open(initfilename, 'w') MacOS.SetCreatorAndType(initfilename, 'Pyth', 'TEXT') fp.write('"""\n') fp.write('Package generated from %s\n' % ascii(fname)) if resinfo: fp.write('Resource %s resid %d %s\n' % (ascii(resinfo[1]), resinfo[0], ascii(resinfo[2]))) fp.write('"""\n') fp.write('import aetools\n') fp.write('Error = aetools.Error\n') suitelist.sort() for code, modname in suitelist: fp.write('import %s\n' % modname) fp.write('\n\n_code_to_module = {\n') for code, modname in suitelist: fp.write(" '%s' : %s,\n" % (ascii(code), modname)) fp.write('}\n\n') fp.write('\n\n_code_to_fullname = {\n') for code, modname in suitelist: fp.write(" '%s' : ('%s.%s', '%s'),\n" % (ascii(code), packagename, modname, modname)) fp.write('}\n\n') for code, modname in suitelist: fp.write('from %s import *\n' % modname) fp.write('\ndef getbaseclasses(v):\n') fp.write(" if not getattr(v, '_propdict', None):\n") fp.write(' v._propdict = {}\n') fp.write(' v._elemdict = {}\n') fp.write(" for superclassname in getattr(v, '_superclassnames', []):\n") fp.write(' superclass = eval(superclassname)\n') fp.write(' getbaseclasses(superclass)\n') fp.write(" v._propdict.update(getattr(superclass, '_propdict', {}))\n") fp.write(" v._elemdict.update(getattr(superclass, '_elemdict', {}))\n") fp.write(" v._propdict.update(getattr(v, '_privpropdict', {}))\n") fp.write(" v._elemdict.update(getattr(v, '_privelemdict', {}))\n") fp.write('\n') fp.write('import StdSuites\n') allprecompinfo.sort() if allprecompinfo: fp.write('\n#\n# Set property and element dictionaries now that all classes have been defined\n#\n') for codenamemapper in allprecompinfo: for k, v in codenamemapper.getall('class'): fp.write('getbaseclasses(%s)\n' % v) application_class = None if allprecompinfo: fp.write('\n#\n# Indices of types declared in this module\n#\n') fp.write('_classdeclarations = {\n') for codenamemapper in allprecompinfo: for k, v in codenamemapper.getall('class'): fp.write(' %r : %s,\n' % (k, v)) if k == 'capp': application_class = v fp.write('}\n') if suitelist: fp.write('\n\nclass %s(%s_Events' % (packagename, suitelist[0][1])) for code, modname in suitelist[1:]: fp.write(',\n %s_Events' % modname) fp.write(',\n aetools.TalkTo):\n') fp.write(' _signature = %r\n\n' % (creatorsignature,)) fp.write(" _moduleName = '%s'\n\n" % packagename) if application_class: fp.write(' _elemdict = %s._elemdict\n' % application_class) fp.write(' _propdict = %s._propdict\n' % application_class) fp.close() return
"""\