'Iterates over the ``installed-files.txt`` entries and returns a tuple
``(path, hash, size)`` for each line.
:returns: a list of (path, hash, size)'

def list_installed_files(self):

    def _md5(path):
        f = open(path, u'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, u'installed-files.txt')
    result = []
    if os.path.exists(record_path):
        with codecs.open(record_path, u'r', encoding=u'utf-8') as f:
            for line in f:
                line = line.strip()
                p = os.path.normpath(os.path.join(self.path, line))
                if (not os.path.exists(p)):
                    logger.warning(u'Non-existent    file:    %s', p)
                    if p.endswith((u'.pyc', u'.pyo')):
                        continue
                if (not os.path.isdir(p)):
                    result.append((p, _md5(p), _size(p)))
        result.append((record_path, None, None))
    return result
