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 }