def createFields(self): # Read boot seector boot = Boot(self, "boot", "Boot sector") yield boot self.sector_size = boot["sector_size"].value if self.version == 32: for field in sorted(( (boot["inf_sector"].value, lambda: FSInfo(self, "fsinfo")), (boot["boot_copy"].value, lambda: Boot(self, "bkboot", "Copy of the boot sector")), )): if field[0]: padding = self.seekByte(field[0] * self.sector_size) if padding: yield padding yield field[1]() padding = self.seekByte(boot["reserved_sectors"].value * self.sector_size) if padding: yield padding # Read the two FAT fat_size = boot["fat_size"].value if fat_size == 0: fat_size = boot["fat32_size"].value fat_size *= self.sector_size * 8 for i in xrange(boot["fat_nb"].value): yield FAT(self, "fat[]", "File Allocation Table", size=fat_size) # Read inode table (Directory) self.cluster_size = boot["cluster_size"].value * self.sector_size * 8 self.fat = self["fat[0]"] if "root_start" in boot: self.target_size = 0 self.getCluster = lambda: boot["root_start"].value yield InodeLink(self, "root", "root") else: yield Directory(self, "root[]", size=boot["max_root"].value * 32 * 8) self.data_start = self.current_size - 2 * self.cluster_size sectors = boot["sectors1"].value if not sectors: sectors = boot["sectors2"].value # Create one big padding field for the end size = sectors * self.sector_size if self._size: size = min(size, self.size // 8) padding = self.seekByte(size) if padding: yield padding
def exportPlaintext(self, priority=None, human=True, line_prefix=u"- ", title=None): r""" Convert metadata to multi-line Unicode string and skip datas with priority lower than specified priority. Default priority is Metadata.MAX_PRIORITY. If human flag is True, data key are translated to better human name (eg. "bit_rate" becomes "Bit rate") which may be translated using gettext. If priority is too small, metadata are empty and so None is returned. >>> print RootMetadata().exportPlaintext() None >>> meta = RootMetadata() >>> meta.copyright = unicode("© Hachoir", "UTF-8") >>> print repr(meta.exportPlaintext()) [u'Metadata:', u'- Copyright: \xa9 Hachoir'] @see __str__() and __unicode__() """ if priority is not None: priority = max(priority, MIN_PRIORITY) priority = min(priority, MAX_PRIORITY) else: priority = MAX_PRIORITY if not title: title = self.header text = ["%s:" % title] for data in sorted(self): if priority < data.priority: break if not data.values: continue if human: title = data.description else: title = data.key for item in data.values: if human: value = item.text else: value = makeUnicode(item.value) text.append("%s%s: %s" % (line_prefix, title, value)) if 1 < len(text): return text else: return None
def createFields(self): # Read boot seector boot = Boot(self, "boot", "Boot sector") yield boot self.sector_size = boot["sector_size"].value if self.version == 32: for field in sorted(( (boot["inf_sector"].value, lambda: FSInfo(self, "fsinfo")), (boot["boot_copy"].value, lambda: Boot(self, "bkboot", "Copy of the boot sector")), )): if field[0]: padding = self.seekByte(field[0] * self.sector_size) if padding: yield padding yield field[1]() padding = self.seekByte(boot["reserved_sectors"].value * self.sector_size) if padding: yield padding # Read the two FAT fat_size = boot["fat_size"].value if fat_size == 0: fat_size = boot["fat32_size"].value fat_size *= self.sector_size * 8 for i in xrange(boot["fat_nb"].value): yield FAT(self, "fat[]", "File Allocation Table", size=fat_size) # Read inode table (Directory) self.cluster_size = boot["cluster_size"].value * self.sector_size * 8 self.fat = self["fat[0]"] if "root_start" in boot: self.target_size = 0 self.getCluster = lambda: boot["root_start"].value yield InodeLink(self, "root", "root") else: yield Directory(self, "root[]", size=boot["max_root"].value * 32 * 8) self.data_start = self.current_size - 2 * self.cluster_size sectors = boot["sectors1"].value if not sectors: sectors = boot["sectors2"].value # Create one big padding field for the end size = sectors * self.sector_size if self._size: size = min(size, self.size//8) padding = self.seekByte(size) if padding: yield padding