void tst_QDirModel::initTestCase()
{
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
    QString dataPath = SRCDIR;
    QString resourceSourcePath = QStringLiteral(":/android_testdata");
    QDirIterator it(resourceSourcePath, QDirIterator::Subdirectories);
    while (it.hasNext()) {
        it.next();

        QFileInfo fileInfo = it.fileInfo();
        if (!fileInfo.isDir()) {
            QString destination = dataPath + QLatin1Char('/') + fileInfo.filePath().mid(resourceSourcePath.length());
            QFileInfo destinationFileInfo(destination);
            if (!destinationFileInfo.exists()) {
                QDir().mkpath(destinationFileInfo.path());
                if (!QFile::copy(fileInfo.filePath(), destination))
                    qWarning("Failed to copy %s", qPrintable(fileInfo.filePath()));
            }
        }
    }
#endif
}
void tst_QTemporaryFile::initTestCase()
{
    // For QTBUG_4796
    QVERIFY(QDir("test-XXXXXX").exists() || QDir().mkdir("test-XXXXXX"));
    QCoreApplication::setApplicationName("tst_qtemporaryfile");

#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
    QString sourceDir(":/android_testdata/");
    QDirIterator it(sourceDir, QDirIterator::Subdirectories);
    while (it.hasNext()) {
        it.next();

        QFileInfo sourceFileInfo = it.fileInfo();
        if (!sourceFileInfo.isDir()) {
            QFileInfo destinationFileInfo(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + QLatin1Char('/') + sourceFileInfo.filePath().mid(sourceDir.length()));

            if (!destinationFileInfo.exists()) {
                QVERIFY(QDir().mkpath(destinationFileInfo.path()));
                QVERIFY(QFile::copy(sourceFileInfo.filePath(), destinationFileInfo.filePath()));
            }
        }
    }
#endif
}
void FileSignAndEncryption::on_okButton2_clicked()
{
    ui->warningLabel2->setText("");
    if (ui->sourceFileEdit2->text().startsWith("~/") || ui->destinationFileEdit2->text().startsWith("~/")) {
        ui->warningLabel2->setText("Seul les chemins absolus sont autorisés.");
        return;
    }

    if (ui->sourceFileEdit2->text() == ui->destinationFileEdit2->text()) {
        ui->warningLabel2->setText("Vous ne pouvez pas utiliser le même fichier source et destination.");
        return;
    }

    QFile sourcefile(ui->sourceFileEdit2->text());
    if (!sourcefile.exists()) {
        ui->warningLabel2->setText("Le fichier source n'existe pas.");
        return;
    }

    QFileInfo sourceFileInfo(sourcefile);
    if (!sourceFileInfo.isReadable()) {
        ui->warningLabel2->setText("Vous n'avez pas les droits de lecture sur le fichier source.");
        return;
    }

    QFile destinationfile(ui->destinationFileEdit2->text());
    if (destinationfile.exists()) {
        if (!destinationfile.remove()) {
            ui->warningLabel2->setText("Impossible d'écraser le fichier existant. Veuillez modifier la destination.");
            return;
        }
    }

    QFileInfo destinationFileInfo(destinationfile);
    QFileInfo destinationDirInfo(destinationFileInfo.absoluteDir().path());
    if (!destinationDirInfo.isWritable()) {
        ui->warningLabel2->setText("Vous n'avez pas les droits d'écriture sur le dossier destination.");
        return;
    }

    // On récupère l'indice des lignes selectionnées
    QModelIndexList selectedIndex = ui->tableWidgetRecipient2->selectionModel()->selectedIndexes();
    QList<int> rowIndexes;
    for (QModelIndex index : selectedIndex) {
        if (!rowIndexes.contains(index.row())) {
            rowIndexes.append(index.row());
        }
    }

    // On récupère l'indice des lignes selectionnées pour le signataire
    QModelIndexList selectedIndexSign = ui->tableWidgetSign->selectionModel()->selectedIndexes();
    QList<int> rowIndexesSign;
    for (QModelIndex index : selectedIndexSign) {
        if (!rowIndexesSign.contains(index.row())) {
            rowIndexesSign.append(index.row());
        }
    }

    if (rowIndexes.count() == 0) {
        ui->warningLabel2->setText("Vous devez sélectionner au moins un destinaire.");
        return;
    }

    if (rowIndexesSign.count() == 0) {
        ui->warningLabel2->setText("Vous devez sélectionner un signataire.");
        return;
    }

    /* Utilisé pour paramétré les intéractions car gpg est tellement
     * intelligent qu'il les demandes dans l'ordre inverse pour le cas anonyme
     */
    QList<int> reverseRowIndexes;
    reverseRowIndexes.reserve(rowIndexes.size());
    std::reverse_copy(rowIndexes.begin(), rowIndexes.end(), std::back_inserter(reverseRowIndexes));

    QStringList opt;
    opt << "--command-fd=0"
        << "--status-fd=1"
        << "-a"
        << "--sign"
        << "--default-key " + ui->tableWidgetSign->item(rowIndexesSign[0], 0)->text()
        << "--output" << ui->destinationFileEdit2->text();
    QString cmd = "-e";
    QStringList arg;
    arg << ui->sourceFileEdit2->text();
    QStringList interactions;

    if (ui->anonymousCheckBox->isChecked()) {
        for (int i : rowIndexes) {
            opt << "-R \""
                   + ui->tableWidgetRecipient2->item(i, 0)->text()
                   + " <"
                   + ui->tableWidgetRecipient2->item(i, 1)->text()
                   + ">\"";
        }

        for (int i : reverseRowIndexes) {
            if (ui->tableWidgetRecipient2->item(i, 3)->text() == GpgObject::validityToStr(VALIDITY_NO_VALUE) ||
                    ui->tableWidgetRecipient2->item(i, 3)->text() == GpgObject::validityToStr(VALIDITY_UNDEFINED)) {
                interactions << "y";
            }
        }
    } else {
        for (int i : rowIndexes) {
            interactions << ui->tableWidgetRecipient2->item(i, 0)->text()
                           + " <"
                           + ui->tableWidgetRecipient2->item(i, 1)->text()
                           + ">";
            if (ui->tableWidgetRecipient2->item(i, 3)->text() == GpgObject::validityToStr(VALIDITY_NO_VALUE) ||
                    ui->tableWidgetRecipient2->item(i, 3)->text() == GpgObject::validityToStr(VALIDITY_UNDEFINED)) {
                interactions << "y";
            }
        }
        interactions << "";
    }


    Action action(cmd, arg, opt, interactions);
    m_manager->setAction(action);
    connect(m_manager, &GPGManager::finished, this, &FileSignAndEncryption::onEncryptionCompleted);
    m_manager->execute();
}