From 5d54d48f7031d54da21bb583040551fc56f818a8 Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 3 Jan 2015 02:44:34 +0300 Subject: [PATCH] mime types hack added for webp --- Telegram/SourceFiles/history.cpp | 4 +- Telegram/SourceFiles/localimageloader.cpp | 7 ++- .../SourceFiles/qmime/freedesktop.org.xml | 5 ++ Telegram/SourceFiles/types.cpp | 54 +++++++++++++++++++ Telegram/SourceFiles/types.h | 27 ++++++++++ 5 files changed, 91 insertions(+), 6 deletions(-) diff --git a/Telegram/SourceFiles/history.cpp b/Telegram/SourceFiles/history.cpp index cf970a145..190f981b5 100644 --- a/Telegram/SourceFiles/history.cpp +++ b/Telegram/SourceFiles/history.cpp @@ -651,7 +651,7 @@ void DocumentOpenLink::onClick(Qt::MouseButton button) const { if (data->status != FileReady) return; QString name = data->name, filter; - QMimeType mimeType = QMimeDatabase().mimeTypeForName(data->mime); + MimeType mimeType = mimeTypeForName(data->mime); QStringList p = mimeType.globPatterns(); QString pattern = p.isEmpty() ? QString() : p.front(); if (name.isEmpty()) { @@ -682,7 +682,7 @@ void DocumentSaveLink::doSave(bool forceSavingAs) const { } else { QDir alreadyDir(already.isEmpty() ? QDir() : QFileInfo(already).dir()); QString name = already.isEmpty() ? data->name : already, filter; - QMimeType mimeType = QMimeDatabase().mimeTypeForName(data->mime); + MimeType mimeType = mimeTypeForName(data->mime); QStringList p = mimeType.globPatterns(); QString pattern = p.isEmpty() ? QString() : p.front(); if (name.isEmpty()) { diff --git a/Telegram/SourceFiles/localimageloader.cpp b/Telegram/SourceFiles/localimageloader.cpp index b94ec9913..99286eab3 100644 --- a/Telegram/SourceFiles/localimageloader.cpp +++ b/Telegram/SourceFiles/localimageloader.cpp @@ -76,7 +76,7 @@ void LocalImageLoaderPrivate::prepareImages() { img = App::readImage(file, 0, true, &animated); } if (type == ToPrepareDocument) { - mime = QMimeDatabase().mimeTypeForFile(info).name(); + mime = mimeTypeForFile(info).name(); } filename = info.fileName(); filesize = info.size(); @@ -91,7 +91,7 @@ void LocalImageLoaderPrivate::prepareImages() { img = QImage(); } } - QMimeType mimeType = QMimeDatabase().mimeTypeForData(data); + MimeType mimeType = mimeTypeForData(data); if (type == ToPrepareDocument) { mime = mimeType.name(); } @@ -105,8 +105,7 @@ void LocalImageLoaderPrivate::prepareImages() { } else { if (type == ToPrepareDocument) { filename = filedialogDefaultName(qsl("image"), qsl(".png"), QString(), true); - QMimeType mimeType = QMimeDatabase().mimeTypeForName("image/png"); - mime = mimeType.name(); + mime = mimeTypeForName("image/png").name(); data = QByteArray(); { QBuffer b(&data); diff --git a/Telegram/SourceFiles/qmime/freedesktop.org.xml b/Telegram/SourceFiles/qmime/freedesktop.org.xml index a59288028..1f4742875 100644 --- a/Telegram/SourceFiles/qmime/freedesktop.org.xml +++ b/Telegram/SourceFiles/qmime/freedesktop.org.xml @@ -21233,6 +21233,11 @@ Ảnh WebP WebP 图像 WebP 影像 + + + + + diff --git a/Telegram/SourceFiles/types.cpp b/Telegram/SourceFiles/types.cpp index b5aa1e2dc..3438b605b 100644 --- a/Telegram/SourceFiles/types.cpp +++ b/Telegram/SourceFiles/types.cpp @@ -922,3 +922,57 @@ QString rusKeyboardLayoutSwitch(const QString &from) { } return result; } + +QStringList MimeType::globPatterns() const { + switch (_type) { + case WebP: return QStringList(qsl("*.webp")); + default: break; + } + return _typeStruct.globPatterns(); +} +QString MimeType::filterString() const { + switch (_type) { + case WebP: return qsl("WebP image (*.webp)"); + default: break; + } + return _typeStruct.filterString(); +} +QString MimeType::name() const { + switch (_type) { + case WebP: return qsl("image/webp"); + default: break; + } + return _typeStruct.name(); +} + +MimeType mimeTypeForName(const QString &mime) { + if (mime == qsl("image/webp")) return MimeType(MimeType::WebP); + return MimeType(QMimeDatabase().mimeTypeForName(mime)); +} + +MimeType mimeTypeForFile(const QFileInfo &file) { + QString path = file.absoluteFilePath(); + if (path.endsWith(qsl(".webp"), Qt::CaseInsensitive)) return MimeType(MimeType::WebP); + { + QFile f(path); + if (f.open(QIODevice::ReadOnly)) { + QByteArray magic = f.read(12); + if (magic.size() >= 12) { + if (!memcmp(magic.constData(), "RIFF", 4) && !memcmp(magic.constData() + 8, "WEBP", 4)) { + return MimeType(MimeType::WebP); + } + } + f.close(); + } + } + return MimeType(QMimeDatabase().mimeTypeForFile(file)); +} + +MimeType mimeTypeForData(const QByteArray &data) { + if (data.size() >= 12) { + if (!memcmp(data.constData(), "RIFF", 4) && !memcmp(data.constData() + 8, "WEBP", 4)) { + return MimeType(MimeType::WebP); + } + } + return MimeType(QMimeDatabase().mimeTypeForData(data)); +} diff --git a/Telegram/SourceFiles/types.h b/Telegram/SourceFiles/types.h index 22a145175..019413f25 100644 --- a/Telegram/SourceFiles/types.h +++ b/Telegram/SourceFiles/types.h @@ -353,3 +353,30 @@ inline QString strMakeFromLetters(const uint32 *letters, int32 len) { } return result; } + +class MimeType { +public: + + enum TypeEnum { + Unknown, + WebP, + }; + + MimeType(const QMimeType &type) : _type(Unknown), _typeStruct(type) { + } + MimeType(TypeEnum type) : _type(type) { + } + QStringList globPatterns() const; + QString filterString() const; + QString name() const; + +private: + + QMimeType _typeStruct; + TypeEnum _type; + +}; + +MimeType mimeTypeForName(const QString &mime); +MimeType mimeTypeForFile(const QFileInfo &file); +MimeType mimeTypeForData(const QByteArray &data);