code: def ParseFileObject(self, parser_mediator, file_object):
      
      filename = parser_mediator.GetFilename()
      file_size = file_object.get_size()
  
      if file_size <= 0:
        raise errors.UnableToParseFile(
            'File size: {0:d} bytes is less equal 0.'.format(file_size))
  
      # 50MB is 10x larger than any plist seen to date.
      if file_size > 50000000:
        raise errors.UnableToParseFile(
            'File size: {0:d} bytes is larger than 50 MB.'.format(file_size))
  
      top_level_object = self.GetTopLevel(file_object)
      if not top_level_object:
        raise errors.UnableToParseFile(
            'Unable to parse: {0:s} skipping.'.format(filename))
  
      # TODO: add a parser filter.
      matching_plugin = None
      for plugin in self._plugins:
        try:
          plugin.UpdateChainAndProcess(
              parser_mediator, plist_name=filename, top_level=top_level_object)
          matching_plugin = plugin
  
        except errors.WrongPlistPlugin as exception:
          logger.debug('Wrong plugin: {0:s} for: {1:s}'.format(
              exception.args[0], exception.args[1]))
  
      if not matching_plugin and self._default_plugin:
        self._default_plugin.UpdateChainAndProcess(
            parser_mediator, plist_name=filename, top_level=top_level_object)
docs: Parses a plist file-like object.
  
      Args:
        parser_mediator (ParserMediator): mediates interactions between parsers
            and other components, such as storage and dfvfs.
        file_object (dfvfs.FileIO): a file-like object.
  
      Raises:
        UnableToParseFile: when the file cannot be parsed.