code: def list_installed_files(self):
          
  
          def _md5(path):
              f = open(path, 'rb')
              try:
                  content = f.read()
              finally:
                  f.close()
              return hashlib.md5(content).hexdigest()
  
          def _size(path):
              return os.stat(path).st_size
  
          record_path = os.path.join(self.path, 'installed-files.txt')
          result = []
          if os.path.exists(record_path):
              with codecs.open(record_path, 'r', encoding='utf-8') as f:
                  for line in f:
                      line = line.strip()
                      p = os.path.normpath(os.path.join(self.path, line))
                      # "./" is present as a marker between installed files
                      # and installation metadata files
                      if not os.path.exists(p):
                          logger.warning('Non-existent file: %s', p)
                          if p.endswith(('.pyc', '.pyo')):
                              continue
                          #otherwise fall through and fail
                      if not os.path.isdir(p):
                          result.append((p, _md5(p), _size(p)))
              result.append((record_path, None, None))
          return result
docs: Iterates over the ``installed-files.txt`` entries and returns a tuple
          ``(path, hash, size)`` for each line.
  
          :returns: a list of (path, hash, size)