File indexing completed on 2024-05-05 05:28:20

0001 /*
0002  * SPDX-FileCopyrightText: 2020 Dimitris Kardarakos <dimkard@posteo.net>
0003  * SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org>
0004  *
0005  * SPDX-License-Identifier: GPL-3.0-or-later
0006  */
0007 
0008 #include "datahandler.h"
0009 #include "calendarcontroller.h"
0010 #include <QNetworkAccessManager>
0011 #include <QNetworkRequest>
0012 #include <QNetworkReply>
0013 #include <QStandardPaths>
0014 #include <QFile>
0015 #include <QMimeData>
0016 #include <QMimeDatabase>
0017 #include <QUrl>
0018 
0019 DataHandler *DataHandler::s_instance {nullptr};
0020 
0021 DataHandler::DataHandler(QObject *parent) : QObject {parent}, m_network_manager {nullptr}
0022 {
0023     s_instance = this;
0024 }
0025 
0026 DataHandler::~DataHandler()
0027 {
0028     s_instance = nullptr;
0029 }
0030 
0031 DataHandler *DataHandler::instance()
0032 {
0033     return s_instance;
0034 }
0035 
0036 void DataHandler::importFromUrl(const QUrl &url)
0037 {
0038     if (!url.isValid()) {
0039         return;
0040     }
0041 
0042     if (url.isLocalFile() || url.scheme() == QLatin1String("content")) {
0043         importLocalFile(url);
0044         return;
0045     }
0046 
0047     if (url.scheme().startsWith(QLatin1String("http"))) {
0048         if (m_network_manager == nullptr) {
0049             m_network_manager = new QNetworkAccessManager {this};
0050         }
0051 
0052         auto reqUrl {url};
0053         reqUrl.setScheme(QLatin1String("https"));
0054         QNetworkRequest req {reqUrl};
0055         req.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);
0056         m_network_manager->get(req);
0057         connect(m_network_manager, &QNetworkAccessManager::finished, [this](QNetworkReply * reply) {
0058             if (reply->error() != QNetworkReply::NoError) {
0059                 qDebug() << reply->url() << reply->errorString();
0060                 return;
0061             }
0062             importData(reply->readAll());
0063         });
0064         return;
0065     }
0066 
0067     qDebug() << "Unhandled URL type:" << url;
0068 }
0069 
0070 void DataHandler::importLocalFile(const QUrl &url)
0071 {
0072     if (url.isEmpty()) {
0073         return;
0074     }
0075 
0076     QFile f(url.isLocalFile() ? url.toLocalFile() : url.toString());
0077 
0078     if (!f.open(QFile::ReadOnly)) {
0079         qDebug() << "Failed to open" << f.fileName() << f.errorString();
0080         return;
0081     }
0082 
0083     if (f.size() > 4000000) {
0084         qDebug() << "File too large, ignoring" << f.fileName() << f.size();
0085         return;
0086     }
0087 
0088     const auto data = f.readAll();
0089 
0090     QMimeDatabase db;
0091     const auto mt = db.mimeTypeForFileNameAndData(f.fileName(), data);
0092 
0093     if (mt.name() != QLatin1String("text/calendar")) {
0094         qDebug() << "The file given is not a valid calendar";
0095 
0096         return;
0097     }
0098 
0099     importData(data);
0100 }
0101 
0102 void DataHandler::importData(const QByteArray &data)
0103 {
0104     if (data.size() < 4) {
0105         return;
0106     }
0107 
0108     CalendarController::instance().importCalendarData(data);
0109 }