def _ParseFileEntryWithParser(
      self, parser_mediator, parser, file_entry, file_object=None):
    """Parses a file entry with a specific parser.

    Args:
      parser_mediator (ParserMediator): parser mediator.
      parser (BaseParser): parser.
      file_entry (dfvfs.FileEntry): file entry.
      file_object (Optional[file]): file-like object to parse.
          If not set the parser will use the parser mediator to open
          the file entry's default data stream as a file-like object.

    Returns:
      int: parse result which is _PARSE_RESULT_FAILURE if the file entry
          could not be parsed, _PARSE_RESULT_SUCCESS if the file entry
          successfully was parsed or _PARSE_RESULT_UNSUPPORTED when
          UnableToParseFile was raised.

    Raises:
      TypeError: if parser object is not a supported parser type.
    """
    if not isinstance(parser, (
        parsers_interface.FileEntryParser, parsers_interface.FileObjectParser)):
      raise TypeError('Unsupported parser object type.')

    parser_mediator.ClearParserChain()

    reference_count = (
        parser_mediator.resolver_context.GetFileObjectReferenceCount(
            file_entry.path_spec))

    parser_mediator.SampleStartTiming(parser.NAME)

    try:
      if isinstance(parser, parsers_interface.FileEntryParser):
        parser.Parse(parser_mediator)
      elif isinstance(parser, parsers_interface.FileObjectParser):
        parser.Parse(parser_mediator, file_object)
      result = self._PARSE_RESULT_SUCCESS

    # We catch IOError so we can determine the parser that generated the error.
    except (IOError, dfvfs_errors.BackEndError) as exception:
      display_name = parser_mediator.GetDisplayName(file_entry)
      logger.warning(
          '{0:s} unable to parse file: {1:s} with error: {2!s}'.format(
              parser.NAME, display_name, exception))
      result = self._PARSE_RESULT_FAILURE

    except errors.UnableToParseFile as exception:
      display_name = parser_mediator.GetDisplayName(file_entry)
      logger.debug(
          '{0:s} unable to parse file: {1:s} with error: {2!s}'.format(
              parser.NAME, display_name, exception))
      result = self._PARSE_RESULT_UNSUPPORTED

    finally:
      parser_mediator.SampleStopTiming(parser.NAME)
      parser_mediator.SampleMemoryUsage(parser.NAME)

      new_reference_count = (
          parser_mediator.resolver_context.GetFileObjectReferenceCount(
              file_entry.path_spec))
      if reference_count != new_reference_count:
        display_name = parser_mediator.GetDisplayName(file_entry)
        logger.warning((
            '[{0:s}] did not explicitly close file-object for file: '
            '{1:s}.').format(parser.NAME, display_name))

    return result
def _ParseFileEntryWithParser ( self , parser_mediator , parser , file_entry , file_object = None ) : if not isinstance ( parser , ( parsers_interface . FileEntryParser , parsers_interface . FileObjectParser ) ) : raise TypeError ( 'Unsupported parser object type.' ) parser_mediator . ClearParserChain ( ) reference_count = ( parser_mediator . resolver_context . GetFileObjectReferenceCount ( file_entry . path_spec ) ) parser_mediator . SampleStartTiming ( parser . NAME ) try : if isinstance ( parser , parsers_interface . FileEntryParser ) : parser . Parse ( parser_mediator ) elif isinstance ( parser , parsers_interface . FileObjectParser ) : parser . Parse ( parser_mediator , file_object ) result = self . _PARSE_RESULT_SUCCESS except ( IOError , dfvfs_errors . BackEndError ) as exception : display_name = parser_mediator . GetDisplayName ( file_entry ) logger . warning ( '{0:s} unable to parse file: {1:s} with error: {2!s}' . format ( parser . NAME , display_name , exception ) ) result = self . _PARSE_RESULT_FAILURE except errors . UnableToParseFile as exception : display_name = parser_mediator . GetDisplayName ( file_entry ) logger . debug ( '{0:s} unable to parse file: {1:s} with error: {2!s}' . format ( parser . NAME , display_name , exception ) ) result = self . _PARSE_RESULT_UNSUPPORTED finally : parser_mediator . SampleStopTiming ( parser . NAME ) parser_mediator . SampleMemoryUsage ( parser . NAME ) new_reference_count = ( parser_mediator . resolver_context . GetFileObjectReferenceCount ( file_entry . path_spec ) ) if reference_count != new_reference_count : display_name = parser_mediator . GetDisplayName ( file_entry ) logger . warning ( ( '[{0:s}] did not explicitly close file-object for file: ' '{1:s}.' ) . format ( parser . NAME , display_name ) ) return result
Parses a file entry with a specific parser.

    Args:
      parser_mediator (ParserMediator): parser mediator.
      parser (BaseParser): parser.
      file_entry (dfvfs.FileEntry): file entry.
      file_object (Optional[file]): file-like object to parse.
          If not set the parser will use the parser mediator to open
          the file entry's default data stream as a file-like object.

    Returns:
      int: parse result which is _PARSE_RESULT_FAILURE if the file entry
          could not be parsed, _PARSE_RESULT_SUCCESS if the file entry
          successfully was parsed or _PARSE_RESULT_UNSUPPORTED when
          UnableToParseFile was raised.

    Raises:
      TypeError: if parser object is not a supported parser type.