1 /******************************************************************************
2 * Copyright (C) 2017 Kitsune Ral <kitsune-ral@users.sf.net>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 #include "eventcontent.h"
20
21 #include "converters.h"
22 #include "util.h"
23
24 #include <QtCore/QMimeDatabase>
25
26 using namespace Quotient::EventContent;
27
toJson() const28 QJsonObject Base::toJson() const
29 {
30 QJsonObject o;
31 fillJson(&o);
32 return o;
33 }
34
FileInfo(const QUrl & u,qint64 payloadSize,const QMimeType & mimeType,const QString & originalFilename)35 FileInfo::FileInfo(const QUrl& u, qint64 payloadSize, const QMimeType& mimeType,
36 const QString& originalFilename)
37 : mimeType(mimeType)
38 , url(u)
39 , payloadSize(payloadSize)
40 , originalName(originalFilename)
41 {}
42
FileInfo(const QUrl & u,const QJsonObject & infoJson,const QString & originalFilename)43 FileInfo::FileInfo(const QUrl& u, const QJsonObject& infoJson,
44 const QString& originalFilename)
45 : originalInfoJson(infoJson)
46 , mimeType(
47 QMimeDatabase().mimeTypeForName(infoJson["mimetype"_ls].toString()))
48 , url(u)
49 , payloadSize(fromJson<qint64>(infoJson["size"_ls]))
50 , originalName(originalFilename)
51 {
52 if (!mimeType.isValid())
53 mimeType = QMimeDatabase().mimeTypeForData(QByteArray());
54 }
55
isValid() const56 bool FileInfo::isValid() const
57 {
58 return url.scheme() == "mxc"
59 && (url.authority() + url.path()).count('/') == 1;
60 }
61
fillInfoJson(QJsonObject * infoJson) const62 void FileInfo::fillInfoJson(QJsonObject* infoJson) const
63 {
64 Q_ASSERT(infoJson);
65 if (payloadSize != -1)
66 infoJson->insert(QStringLiteral("size"), payloadSize);
67 if (mimeType.isValid())
68 infoJson->insert(QStringLiteral("mimetype"), mimeType.name());
69 }
70
ImageInfo(const QUrl & u,qint64 fileSize,QMimeType mimeType,const QSize & imageSize,const QString & originalFilename)71 ImageInfo::ImageInfo(const QUrl& u, qint64 fileSize, QMimeType mimeType,
72 const QSize& imageSize, const QString& originalFilename)
73 : FileInfo(u, fileSize, mimeType, originalFilename), imageSize(imageSize)
74 {}
75
ImageInfo(const QUrl & u,const QJsonObject & infoJson,const QString & originalFilename)76 ImageInfo::ImageInfo(const QUrl& u, const QJsonObject& infoJson,
77 const QString& originalFilename)
78 : FileInfo(u, infoJson, originalFilename)
79 , imageSize(infoJson["w"_ls].toInt(), infoJson["h"_ls].toInt())
80 {}
81
fillInfoJson(QJsonObject * infoJson) const82 void ImageInfo::fillInfoJson(QJsonObject* infoJson) const
83 {
84 FileInfo::fillInfoJson(infoJson);
85 if (imageSize.width() != -1)
86 infoJson->insert(QStringLiteral("w"), imageSize.width());
87 if (imageSize.height() != -1)
88 infoJson->insert(QStringLiteral("h"), imageSize.height());
89 }
90
Thumbnail(const QJsonObject & infoJson)91 Thumbnail::Thumbnail(const QJsonObject& infoJson)
92 : ImageInfo(infoJson["thumbnail_url"_ls].toString(),
93 infoJson["thumbnail_info"_ls].toObject())
94 {}
95
fillInfoJson(QJsonObject * infoJson) const96 void Thumbnail::fillInfoJson(QJsonObject* infoJson) const
97 {
98 if (url.isValid())
99 infoJson->insert(QStringLiteral("thumbnail_url"), url.toString());
100 if (!imageSize.isEmpty())
101 infoJson->insert(QStringLiteral("thumbnail_info"),
102 toInfoJson<ImageInfo>(*this));
103 }
104