#include "systemController.h" #include #include #include #include #include #include #include #include #include #ifdef Q_OS_ANDROID #include "platforms/android/android_controller.h" #endif #ifdef Q_OS_IOS #include "platforms/ios/MobileUtils.h" #include #endif SystemController::SystemController(const std::shared_ptr &settings, QObject *parent) : QObject(parent), m_settings(settings) { } void SystemController::saveFile(QString fileName, const QString &data) { #if defined Q_OS_ANDROID AndroidController::instance()->saveFile(fileName, data); return; #endif #ifdef Q_OS_IOS QUrl fileUrl = QDir::tempPath() + "/" + fileName; QFile file(fileUrl.toString()); #else QFile file(fileName); #endif // todo check if save successful file.open(QIODevice::WriteOnly); file.write(data.toUtf8()); file.close(); #ifdef Q_OS_IOS QStringList filesToSend; filesToSend.append(fileUrl.toString()); MobileUtils mobileUtils; // todo check if save successful mobileUtils.shareText(filesToSend); return; #else QFileInfo fi(fileName); QDesktopServices::openUrl(fi.absoluteDir().absolutePath()); #endif } QString SystemController::getFileName(const QString &acceptLabel, const QString &nameFilter, const QString &selectedFile, const bool isSaveMode, const QString &defaultSuffix) { QString fileName; #ifdef Q_OS_IOS MobileUtils mobileUtils; fileName = mobileUtils.openFile(); if (fileName.isEmpty()) { return fileName; } CFURLRef url = CFURLCreateWithFileSystemPath( kCFAllocatorDefault, CFStringCreateWithCharacters(0, reinterpret_cast(fileName.unicode()), fileName.length()), kCFURLPOSIXPathStyle, 0); if (!CFURLStartAccessingSecurityScopedResource(url)) { qDebug() << "Could not access path " << QUrl::fromLocalFile(fileName).toString(); } return fileName; #endif QObject *mainFileDialog = m_qmlRoot->findChild("mainFileDialog").parent(); if (!mainFileDialog) { return ""; } mainFileDialog->setProperty("acceptLabel", QVariant::fromValue(acceptLabel)); mainFileDialog->setProperty("nameFilters", QVariant::fromValue(QStringList(nameFilter))); if (!selectedFile.isEmpty()) { mainFileDialog->setProperty("selectedFile", QVariant::fromValue(selectedFile)); } mainFileDialog->setProperty("isSaveMode", QVariant::fromValue(isSaveMode)); mainFileDialog->setProperty("defaultSuffix", QVariant::fromValue(defaultSuffix)); QMetaObject::invokeMethod(mainFileDialog, "open"); bool isFileDialogAccepted = false; QEventLoop wait; QObject::connect(this, &SystemController::fileDialogClosed, [&wait, &isFileDialogAccepted](const bool isAccepted) { isFileDialogAccepted = isAccepted; wait.quit(); }); wait.exec(); QObject::disconnect(this, &SystemController::fileDialogClosed, nullptr, nullptr); if (!isFileDialogAccepted) { return ""; } fileName = mainFileDialog->property("selectedFile").toString(); #ifdef Q_OS_ANDROID // patch for files containing spaces etc const QString sep { "raw%3A%2F" }; if (fileName.startsWith("content://") && fileName.contains(sep)) { QString contentUrl = fileName.split(sep).at(0); QString rawUrl = fileName.split(sep).at(1); rawUrl.replace(" ", "%20"); fileName = contentUrl + sep + rawUrl; } return fileName; #endif return QUrl(fileName).toLocalFile(); } void SystemController::setQmlRoot(QObject *qmlRoot) { m_qmlRoot = qmlRoot; }