diff --git a/src/base/bittorrent/customstorage.cpp b/src/base/bittorrent/customstorage.cpp index e6c24785b..9466db666 100644 --- a/src/base/bittorrent/customstorage.cpp +++ b/src/base/bittorrent/customstorage.cpp @@ -209,7 +209,7 @@ void CustomDiskIOThread::handleCompleteFiles(lt::storage_index_t storage, const { const Path incompleteFilePath = savePath / filePath; Path completeFilePath = incompleteFilePath; - completeFilePath.removeExtension(); + completeFilePath.removeExtension(QB_EXT); if (completeFilePath.exists()) { Utils::Fs::removeFile(incompleteFilePath); diff --git a/src/base/bittorrent/torrentimpl.cpp b/src/base/bittorrent/torrentimpl.cpp index e90574808..c53af8777 100644 --- a/src/base/bittorrent/torrentimpl.cpp +++ b/src/base/bittorrent/torrentimpl.cpp @@ -294,8 +294,7 @@ TorrentImpl::TorrentImpl(Session *session, lt::session *nativeSession m_indexMap[nativeIndex] = i; Path filePath {fileStorage.file_path(nativeIndex)}; - if (filePath.hasExtension(QB_EXT)) - filePath.removeExtension(); + filePath.removeExtension(QB_EXT); m_filePaths.append(filePath); const auto priority = LT::fromNative(filePriorities[LT::toUnderlyingType(nativeIndex)]); @@ -1511,8 +1510,7 @@ void TorrentImpl::endReceivedMetadataHandling(const Path &savePath, const PathLi Path filePath = fileNames.at(i); p.renamed_files[nativeIndex] = filePath.toString().toStdString(); - if (filePath.hasExtension(QB_EXT)) - filePath.removeExtension(); + filePath.removeExtension(QB_EXT); m_filePaths.append(filePath); const auto priority = LT::fromNative(filePriorities[LT::toUnderlyingType(nativeIndex)]); diff --git a/src/base/path.cpp b/src/base/path.cpp index 8f72c97ba..292163c98 100644 --- a/src/base/path.cpp +++ b/src/base/path.cpp @@ -149,13 +149,15 @@ QString Path::extension() const const int slashIndex = m_pathStr.lastIndexOf(QLatin1Char('/')); const auto filename = QStringView(m_pathStr).mid(slashIndex + 1); - const int dotIndex = filename.lastIndexOf(QLatin1Char('.')); + const int dotIndex = filename.lastIndexOf(QLatin1Char('.'), -2); return ((dotIndex == -1) ? QString() : filename.mid(dotIndex).toString()); } bool Path::hasExtension(const QString &ext) const { - return (extension().compare(ext, Qt::CaseInsensitive) == 0); + Q_ASSERT(ext.startsWith(QLatin1Char('.')) && (ext.size() >= 2)); + + return m_pathStr.endsWith(ext, Qt::CaseInsensitive); } bool Path::hasAncestor(const Path &other) const @@ -181,6 +183,12 @@ void Path::removeExtension() m_pathStr.chop(extension().size()); } +void Path::removeExtension(const QString &ext) +{ + if (hasExtension(ext)) + m_pathStr.chop(ext.size()); +} + QString Path::data() const { return m_pathStr; diff --git a/src/base/path.h b/src/base/path.h index 0a4d7c1f8..1abef4e02 100644 --- a/src/base/path.h +++ b/src/base/path.h @@ -58,6 +58,7 @@ public: QString extension() const; bool hasExtension(const QString &ext) const; void removeExtension(); + void removeExtension(const QString &ext); bool hasAncestor(const Path &other) const; Path relativePathOf(const Path &childPath) const; diff --git a/src/gui/uithememanager.cpp b/src/gui/uithememanager.cpp index 295c92d97..4f033b63f 100644 --- a/src/gui/uithememanager.cpp +++ b/src/gui/uithememanager.cpp @@ -141,7 +141,7 @@ namespace if (themePath.filename() == CONFIG_FILE_NAME) return std::make_unique(themePath); - if ((themePath.extension() == QLatin1String(".qbtheme")) + if ((themePath.hasExtension(QLatin1String(".qbtheme"))) && QResource::registerResource(themePath.data(), QLatin1String("/uitheme"))) { return std::make_unique();