def print_to_logger(self, logger): e = self logger.error('ParseError: %s', e) logger.error('Caused by: %s', repr(e.cause)) logger.error('Path: %s', e.path) if e.treegroup is not None: logger.error('Treegroup: %s', e.treegroup) if e.record: logger.error('Record: %s', e.record['seqno']) logger.error('Record Payload:') for line in dumpbytes(e.record['payload'], True): logger.error(' %s', line) logger.error('Problem Offset: at %d (=0x%x)', e.offset, e.offset) if self.binevents: logger.error('Binary Parse Events:') from hwp5.bintype import log_events for ev, item in log_events(self.binevents, logger.error): pass logger.error('Model Stack:') for level, c in enumerate(reversed(e.parse_stack_traces)): model = c['model'] if isinstance(model, StructType): logger.error(' %s', model) parsed_members = c['parsed'] for member in parsed_members: offset = member.get('offset', 0) offset_end = member.get('offset_end', 1) name = member['name'] value = member['value'] logger.error(' %06x:%06x: %s = %s', offset, offset_end - 1, name, value) logger.error(' %06x: : %s', c['offset'], c['member']) pass else: logger.error(' %s%s', ' ' * level, c)
def print_to_logger(self, logger): e = self logger.error("ParseError: %s", e) logger.error("Caused by: %s", repr(e.cause)) logger.error("Path: %s", e.path) if e.treegroup is not None: logger.error("Treegroup: %s", e.treegroup) if e.record: logger.error("Record: %s", e.record["seqno"]) logger.error("Record Payload:") for line in dumpbytes(e.record["payload"], True): logger.error(" %s", line) logger.error("Problem Offset: at %d (=0x%x)", e.offset, e.offset) if self.binevents: logger.error("Binary Parse Events:") from hwp5.bintype import log_events for ev, item in log_events(self.binevents, logger.error): pass logger.error("Model Stack:") for level, c in enumerate(reversed(e.parse_stack_traces)): model = c["model"] if isinstance(model, StructType): logger.error(" %s", model) parsed_members = c["parsed"] for member in parsed_members: offset = member.get("offset", 0) offset_end = member.get("offset_end", 1) name = member["name"] value = member["value"] logger.error(" %06x:%06x: %s = %s", offset, offset_end - 1, name, value) logger.error(" %06x: : %s", c["offset"], c["member"]) pass else: logger.error(" %s%s", " " * level, c)
def print_model(model): printable_model = dict(model, type=model['type'].__name__) print fmt % printable_model if dump: from hwp5.binmodel import model_to_json print model_to_json(model, sort_keys=True, indent=2) def print_log(fmt, *args): print fmt % args from hwp5.bintype import log_events list(log_events(model['binevents'], print_log))
def main(args): filenames = args['<hwp5files>'] from hwp5.dataio import ParseError from hwp5.binmodel import Hwp5File conditions = [] if args['--model']: def with_model_name(model): return args['--model'] == model['type'].__name__ conditions.append(with_model_name) if args['--tag']: tag = args['--tag'] try: tag = int(tag) except ValueError: pass else: from hwp5.tagids import tagnames tag = tagnames[tag] def with_tag(model): return model['tagname'] == tag conditions.append(with_tag) if args['--incomplete']: def with_incomplete(model): return 'unparsed' in model conditions.append(with_incomplete) def flat_models(hwp5file, **kwargs): for model in hwp5file.docinfo.models(**kwargs): model['stream'] = 'DocInfo' yield model for section in hwp5file.bodytext: for model in hwp5file.bodytext[section].models(**kwargs): model['stream'] = 'BodyText/'+section yield model for filename in filenames: try: hwp5file = Hwp5File(filename) def with_filename(models): for model in models: model['filename'] = filename yield model models = flat_models(hwp5file) models = with_filename(models) for model in models: if all(condition(model) for condition in conditions): print '%s:%s(%s): %s' % (model['filename'], model['stream'], model['seqno'], model['type'].__name__) if args['--dump']: from hwp5.binmodel import model_to_json print model_to_json(model, sort_keys=True, indent=2) def print_log(fmt, *args): print fmt % args from hwp5.bintype import log_events list(log_events(model['binevents'], print_log)) except ParseError, e: from hwp5.proc import logger logger.error('---- On processing %s:', filename) e.print_to_logger(logger)