diff --git a/src/filemetadataprovider.h b/src/filemetadataprovider.h --- a/src/filemetadataprovider.h +++ b/src/filemetadataprovider.h @@ -116,18 +116,37 @@ void slotLoadingFinished(KJob* job); void slotFileFetchFinished(KJob* job); + +private: void insertBasicData(); void insertEditableData(); + + void setFileItem(); + void setFileItems(); + + /** + * Insert intersection of common data of \p files + */ + void insertCommonData(const QList& files); -private: + /** + * Insert basic data of a single file + */ + void insertSingleFileBasicData(); + + /** + * Insert basic data of a list of files + */ + void insertFilesListBasicData(); + /** * Checks for the existance of \p uri in \p allProperties, and accordingly * inserts the total integer value of that property in m_data. On completion * it removes \p uri from \p allProperties */ void totalPropertyAndInsert(const QString& prop, const QList& resources, QSet& allProperties); - + /* * @return The number of subdirectories for the directory \a path. */ diff --git a/src/filemetadataprovider.cpp b/src/filemetadataprovider.cpp --- a/src/filemetadataprovider.cpp +++ b/src/filemetadataprovider.cpp @@ -103,6 +103,7 @@ return v; } + } void FileMetaDataProvider::totalPropertyAndInsert(const QString& prop, @@ -132,52 +133,14 @@ { FileFetchJob* fetchJob = static_cast(job); QList files = fetchJob->data(); - - if (files.size() == 1) { + + Q_ASSERT(!files.isEmpty()); + + if (files.size() > 1) { + insertCommonData(files); + } else { m_data = files.first(); - insertBasicData(); - } - else { - // - // Only report the stuff that is common to all the files - // - QSet allProperties; - QList propertyList; - foreach (const QVariantMap& fileData, files) { - propertyList << fileData; - allProperties.unite(fileData.uniqueKeys().toSet()); - } - - // Special handling for certain properties - totalPropertyAndInsert("duration", propertyList, allProperties); - totalPropertyAndInsert("characterCount", propertyList, allProperties); - totalPropertyAndInsert("wordCount", propertyList, allProperties); - totalPropertyAndInsert("lineCount", propertyList, allProperties); - - foreach (const QString& propUri, allProperties) { - foreach (const QVariantMap& map, propertyList) { - QVariantMap::const_iterator it = map.find( propUri ); - if( it == map.constEnd() ) { - m_data.remove( propUri ); - break; - } - else { - QVariantMap::iterator dit = m_data.find( it.key() ); - if( dit == m_data.end() ) { - m_data.insert( propUri, it.value() ); - } - else { - QVariant finalValue = intersect( it.value(), dit.value() ); - if( finalValue.isValid() ) - m_data[propUri] = finalValue; - else { - m_data.remove( propUri ); - break; - } - } - } - } - } + insertSingleFileBasicData(); } insertEditableData(); @@ -192,59 +155,78 @@ emit loadingFinished(); } -void FileMetaDataProvider::insertBasicData() +void FileMetaDataProvider::insertSingleFileBasicData() { - KFormat format; + // TODO: Handle case if remote URLs are used properly. isDir() does + // not work, the modification date needs also to be adjusted... + Q_ASSERT(m_fileItems.count() <= 1); if (m_fileItems.count() == 1) { - // TODO: Handle case if remote URLs are used properly. isDir() does - // not work, the modification date needs also to be adjusted... - const KFileItem& item = m_fileItems.first(); - - if (item.isDir()) { - const int count = subDirectoriesCount(item.url().path()); - if (count == -1) { - m_data.insert("kfileitem#size", i18nc("unknown file size", "Unknown")); - } else { - const QString itemCountString = i18ncp("@item:intable", "%1 item", "%1 items", count); - m_data.insert("kfileitem#size", itemCountString); - } - } else { - m_data.insert("kfileitem#size", format.formatByteSize(item.size())); + KFormat format; + const KFileItem& item = m_fileItems.first(); + + if (item.isDir()) { + const int count = subDirectoriesCount(item.url().path()); + if (count == -1) { + m_data.insert("kfileitem#size", i18nc("unknown file size", "Unknown")); + } else { + const QString itemCountString = i18ncp("@item:intable", "%1 item", "%1 items", count); + m_data.insert("kfileitem#size", itemCountString); + } + } else { + m_data.insert("kfileitem#size", format.formatByteSize(item.size())); + } + + m_data.insert("kfileitem#type", item.mimeComment()); + m_data.insert("kfileitem#modified", + format.formatRelativeDateTime(item.time(KFileItem::ModificationTime), QLocale::LongFormat)); + m_data.insert("kfileitem#owner", item.user()); + m_data.insert("kfileitem#permissions", item.permissionsString()); + } + +} + +void FileMetaDataProvider::insertFilesListBasicData() +{ + + KFormat format; + // If all directories + Q_ASSERT(m_fileItems.count() > 1); + bool allDirectories = true; + for (const KFileItem& item : m_fileItems) { + allDirectories &= item.isDir(); + if (!allDirectories) { + break; } + } - m_data.insert("kfileitem#type", item.mimeComment()); - m_data.insert("kfileitem#modified", format.formatRelativeDateTime(item.time(KFileItem::ModificationTime), QLocale::LongFormat) ); - m_data.insert("kfileitem#owner", item.user()); - m_data.insert("kfileitem#permissions", item.permissionsString()); - - - } else if (m_fileItems.count() > 1) { - // If all directories - bool allDirectories = true; + if (allDirectories) { + int count = 0; for (const KFileItem& item : m_fileItems) { - allDirectories &= item.isDir(); + count += subDirectoriesCount(item.url().path()); } - if (allDirectories) { - int count = 0; - for (const KFileItem& item : m_fileItems) { - count += subDirectoriesCount(item.url().path()); - } - - if (count) { - const QString itemCountString = i18ncp("@item:intable", "%1 item", "%1 items", count); - m_data.insert("kfileitem#totalSize", itemCountString); - } - } else { - // Calculate the size of all items - quint64 totalSize = 0; - for (const KFileItem& item : m_fileItems) { - if (!item.isDir() && !item.isLink()) { - totalSize += item.size(); - } + if (count) { + const QString itemCountString = i18ncp("@item:intable", "%1 item", "%1 items", count); + m_data.insert("kfileitem#totalSize", itemCountString); + } + } else { + // Calculate the size of all items + quint64 totalSize = 0; + for (const KFileItem& item : m_fileItems) { + if (!item.isDir() && !item.isLink()) { + totalSize += item.size(); } - m_data.insert("kfileitem#totalSize", format.formatByteSize(totalSize)); } + m_data.insert("kfileitem#totalSize", format.formatByteSize(totalSize)); + } +} + +void FileMetaDataProvider::insertBasicData() +{ + if (m_fileItems.count() > 1) { + insertFilesListBasicData(); + } else { + insertSingleFileBasicData(); } } @@ -263,6 +245,48 @@ } } +void FileMetaDataProvider::insertCommonData(const QList& files) +{ + // + // Only report the stuff that is common to all the files + // + QSet allProperties; + QList propertyList; + foreach (const QVariantMap& fileData, files) { + propertyList << fileData; + allProperties.unite(fileData.uniqueKeys().toSet()); + } + + // Special handling for certain properties + totalPropertyAndInsert("duration", propertyList, allProperties); + totalPropertyAndInsert("characterCount", propertyList, allProperties); + totalPropertyAndInsert("wordCount", propertyList, allProperties); + totalPropertyAndInsert("lineCount", propertyList, allProperties); + + foreach (const QString& propUri, allProperties) { + foreach (const QVariantMap& map, propertyList) { + QVariantMap::const_iterator it = map.find(propUri); + if (it == map.constEnd()) { + m_data.remove(propUri); + break; + } + + QVariantMap::iterator dit = m_data.find(it.key()); + if (dit == m_data.end()) { + m_data.insert(propUri, it.value()); + } else { + QVariant finalValue = intersect(it.value(), dit.value()); + if (finalValue.isValid()) { + m_data[propUri] = finalValue; + } else { + m_data.remove(propUri); + break; + } + } + } + } +} + FileMetaDataProvider::FileMetaDataProvider(QObject* parent) : QObject(parent) , m_readOnly(false) @@ -274,74 +298,79 @@ { } -void FileMetaDataProvider::setItems(const KFileItemList& items) +void FileMetaDataProvider::setFileItem() { - m_fileItems = items; - m_data.clear(); - m_realTimeIndexing = false; - - if (items.isEmpty()) { + // There are 3 code paths - + // Remote file + // Single local file - + // * Not Indexed + // * Indexed + // + const QUrl url = m_fileItems.first().targetUrl(); + if (!url.isLocalFile()) { + insertBasicData(); emit loadingFinished(); return; } - // There are 4 code paths - - // Single File - - // * Not Indexed - // * Indexed - // - if (items.size() == 1) { - const QUrl url = items.first().targetUrl(); - if (!url.isLocalFile()) { - insertBasicData(); - emit loadingFinished(); - return; - } + // Not Indexed + const QString filePath = url.toLocalFile(); + if (!m_config.fileIndexingEnabled() || !m_config.shouldBeIndexed(filePath)) { + m_realTimeIndexing = true; - // Not Indexed - const QString filePath = url.toLocalFile(); - if (!m_config.fileIndexingEnabled() || !m_config.shouldBeIndexed(filePath)) { - m_realTimeIndexing = true; - - IndexedDataRetriever *ret = new IndexedDataRetriever(filePath, this); - connect(ret, SIGNAL(finished(KJob*)), this, SLOT(slotLoadingFinished(KJob*))); - ret->start(); - - insertBasicData(); - insertEditableData(); - emit loadingFinished(); - - } else { - FileFetchJob* job = new FileFetchJob(QStringList() << filePath, this); - connect(job, SIGNAL(finished(KJob*)), this, SLOT(slotFileFetchFinished(KJob*))); - job->start(); - } + IndexedDataRetriever *ret = new IndexedDataRetriever(filePath, this); + connect(ret, SIGNAL(finished(KJob*)), this, SLOT(slotLoadingFinished(KJob*))); + ret->start(); + + insertBasicData(); + insertEditableData(); + emit loadingFinished(); + } else { - // Multiple Files - - // * Not Indexed - // * Indexed - QStringList urls; - Q_FOREACH (const KFileItem& item, items) { - const QUrl url = item.targetUrl(); - // Only extract data from indexed files, - // it would be too expensive otherwise. - if (url.isLocalFile()) { - urls << url.toLocalFile(); - } - } + FileFetchJob* job = new FileFetchJob(QStringList() << filePath, this); + connect(job, SIGNAL(finished(KJob*)), this, SLOT(slotFileFetchFinished(KJob*))); + job->start(); + } +} - if (urls.isEmpty()) { - insertBasicData(); - emit loadingFinished(); - return; +void FileMetaDataProvider::setFileItems() +{ + // Multiple Files - + // * Not Indexed + // * Indexed + + QStringList urls; + // Only extract data from indexed files, + // it would be too expensive otherwise. + Q_FOREACH (const KFileItem& item, m_fileItems) { + const QUrl url = item.targetUrl(); + if (url.isLocalFile()) { + urls << url.toLocalFile(); } + } + if (!urls.isEmpty()) { FileFetchJob* job = new FileFetchJob(urls, this); connect(job, SIGNAL(finished(KJob*)), this, SLOT(slotFileFetchFinished(KJob*))); job->start(); + } - insertBasicData(); + insertBasicData(); + emit loadingFinished(); +} + +void FileMetaDataProvider::setItems(const KFileItemList& items) +{ + m_fileItems = items; + m_data.clear(); + m_realTimeIndexing = false; + + if (items.isEmpty()) { emit loadingFinished(); + } else if (items.size() == 1) { + setFileItem(); + } else { + setFileItems(); } }