def copy(self, dest): ''' Link the registered XPTs and place the resulting linked XPT at the destination given as a string or a Dest instance. Avoids an expensive XPT linking if the interfaces in an existing destination match those of the individual XPTs to link. ''' if isinstance(dest, basestring): dest = Dest(dest) assert isinstance(dest, Dest) from xpt import xpt_link, Typelib, Interface all_typelibs = [Typelib.read(f.open()) for f in self._files] if dest.exists(): # Typelib.read() needs to seek(), so use a BytesIO for dest # content. dest_interfaces = \ dict((i.name, i) for i in Typelib.read(BytesIO(dest.read())).interfaces if i.iid != Interface.UNRESOLVED_IID) identical = True for f in self._files: typelib = Typelib.read(f.open()) for i in typelib.interfaces: if i.iid != Interface.UNRESOLVED_IID and \ not (i.name in dest_interfaces and i == dest_interfaces[i.name]): identical = False break if identical: return False s = BytesIO() xpt_link(all_typelibs).write(s) dest.write(s.getvalue()) return True
def copy(self, dest, skip_if_older=True): ''' Link the registered XPTs and place the resulting linked XPT at the destination given as a string or a Dest instance. Avoids an expensive XPT linking if the interfaces in an existing destination match those of the individual XPTs to link. skip_if_older is ignored. ''' if isinstance(dest, basestring): dest = Dest(dest) assert isinstance(dest, Dest) from xpt import xpt_link, Typelib, Interface all_typelibs = [Typelib.read(f.open()) for f in self._files] if dest.exists(): # Typelib.read() needs to seek(), so use a BytesIO for dest # content. dest_interfaces = \ dict((i.name, i) for i in Typelib.read(BytesIO(dest.read())).interfaces if i.iid != Interface.UNRESOLVED_IID) identical = True for f in self._files: typelib = Typelib.read(f.open()) for i in typelib.interfaces: if i.iid != Interface.UNRESOLVED_IID and \ not (i.name in dest_interfaces and i == dest_interfaces[i.name]): identical = False break if identical: return False s = BytesIO() xpt_link(all_typelibs).write(s) dest.write(s.getvalue()) return True
def read_interfaces(file): return dict((i.name, i) for i in Typelib.read(file).interfaces)