| 193 | } |
| 194 | |
| 195 | static KCompressionDevice::CompressionType compressionTypeFor(const QString &mime_to_check) |
| 196 | { |
| 197 | // The compressedMimeMap is here in case you have a very old shared mime database |
| 198 | // that doesn't have inheritance info for things like gzeps, etc |
| 199 | // Otherwise the "is()" calls below are just good enough |
| 200 | static QHash<QString, KCompressionDevice::CompressionType> compressedMimeMap; |
| 201 | static bool supportBzip = false; |
| 202 | static bool supportXz = false; |
| 203 | static bool supportZstd = false; |
| 204 | |
| 205 | const QString app_gzip(QStringLiteral("application/x-gzip")); |
| 206 | const QString app_bzip(QStringLiteral("application/x-bzip")); |
| 207 | const QString app_xz(QStringLiteral("application/x-xz")); |
| 208 | const QString app_zstd(QStringLiteral("application/zstd")); |
| 209 | if (compressedMimeMap.isEmpty()) { |
| 210 | std::unique_ptr<KFilterBase> f; |
| 211 | compressedMimeMap[QStringLiteral("image/x-gzeps")] = KCompressionDevice::GZip; |
| 212 | // check we can read bzip2-compressed files |
| 213 | f.reset(KCompressionDevice::filterForCompressionType(KCompressionDevice::BZip2)); |
| 214 | if (f.get()) { |
| 215 | supportBzip = true; |
| 216 | compressedMimeMap[QStringLiteral("application/x-bzpdf")] = KCompressionDevice::BZip2; |
| 217 | compressedMimeMap[QStringLiteral("application/x-bzpostscript")] = KCompressionDevice::BZip2; |
| 218 | compressedMimeMap[QStringLiteral("application/x-bzdvi")] = KCompressionDevice::BZip2; |
| 219 | compressedMimeMap[QStringLiteral("image/x-bzeps")] = KCompressionDevice::BZip2; |
| 220 | } |
| 221 | // check if we can read XZ-compressed files |
| 222 | f.reset(KCompressionDevice::filterForCompressionType(KCompressionDevice::Xz)); |
| 223 | if (f.get()) { |
| 224 | supportXz = true; |
| 225 | } |
| 226 | // check if we can read zstd-compressed files |
| 227 | f.reset(KCompressionDevice::filterForCompressionType(KCompressionDevice::Zstd)); |
| 228 | if (f.get()) { |
| 229 | supportZstd = true; |
| 230 | } |
| 231 | } |
| 232 | QHash<QString, KCompressionDevice::CompressionType>::const_iterator it = compressedMimeMap.constFind(mime_to_check); |
| 233 | if (it != compressedMimeMap.constEnd()) { |
| 234 | return it.value(); |
| 235 | } |
| 236 | |
| 237 | QMimeDatabase db; |
| 238 | QMimeType mime = db.mimeTypeForName(mime_to_check); |
| 239 | if (mime.isValid()) { |
| 240 | if (mime.inherits(app_gzip)) { |
| 241 | return KCompressionDevice::GZip; |
| 242 | } else if (supportBzip && mime.inherits(app_bzip)) { |
| 243 | return KCompressionDevice::BZip2; |
| 244 | } else if (supportXz && mime.inherits(app_xz)) { |
| 245 | return KCompressionDevice::Xz; |
| 246 | } else if (supportZstd && mime.inherits(app_zstd)) { |
| 247 | return KCompressionDevice::Zstd; |
| 248 | } |
| 249 | } |
| 250 | |
| 251 | return KCompressionDevice::None; |
| 252 | } |