void SFtpFileEngine::initSFtp() { _fileInfoCache = FtpFileInfoCache::getInstance(); QString cacheEntry(getCachePath(_path)); QUrlInfo urlInfo = _fileInfoCache->findFileInfo(cacheEntry); if (urlInfo.isValid()) { // non-existent file ? if (urlInfo.permissions() == 0) { _fileFlags = QAbstractFileEngine::FileType; return; } _fileFlags = QAbstractFileEngine::ExistsFlag; _fileFlags |= urlInfo.isDir() ? QAbstractFileEngine::DirectoryType : QAbstractFileEngine::FileType; if (_path == "/") _fileFlags |= QAbstractFileEngine::RootFlag; _fileFlags |= QAbstractFileEngine::FileFlag(urlInfo.permissions()); _urlInfo = urlInfo; return; } refreshFileInfoCache(); }
QAbstractFileEngine::Iterator* SFtpFileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames) { qDebug() << "beginEntryList() : " << _fileName << _fileFlags; QString cachePath(getCachePath(_path, true)); FtpFileInfoCache::QUrlInfoList list = _fileInfoCache->findDirInfo(cachePath); if (list.size() == 0 && (_fileFlags & QAbstractFileEngine::DirectoryType) && sftpConnect()) { readDir(_path); sftpDisconnect(); } QMap<QString, QUrlInfo> entriesMap; list = _fileInfoCache->findDirInfo(cachePath); if (list.size() > 0) { FtpFileInfoCache::QUrlInfoListIterator it(list); while (it.hasNext()) { QUrlInfo urlInfo = it.next(); // exclude an empty entry inserted by us and a non-existent entry if (urlInfo.isValid() && urlInfo.permissions()) entriesMap.insert(urlInfo.name(), urlInfo); } } return new FtpFileEngineIterator(filters, filterNames, filterEntries(filters, filterNames, entriesMap)); }