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