File indexing completed on 2024-05-12 16:16:03

0001 /*
0002    SPDX-FileCopyrightText: 2019-2023 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "languagetoolresultjob.h"
0008 #include "textgrammarcheck_debug.h"
0009 
0010 #include <QNetworkAccessManager>
0011 #include <QNetworkReply>
0012 using namespace TextGrammarCheck;
0013 LanguageToolResultJob::LanguageToolResultJob(QObject *parent)
0014     : QObject(parent)
0015 {
0016 }
0017 
0018 LanguageToolResultJob::~LanguageToolResultJob() = default;
0019 
0020 static bool hasNotEmptyText(const QString &text)
0021 {
0022     for (int i = 0; i < text.length(); ++i) {
0023         if (!text.at(i).isSpace()) {
0024             return true;
0025         }
0026     }
0027     return false;
0028 }
0029 
0030 bool LanguageToolResultJob::canStart() const
0031 {
0032     return canStartError() == LanguageToolResultJob::JobError::NotError;
0033 }
0034 
0035 LanguageToolResultJob::JobError LanguageToolResultJob::canStartError() const
0036 {
0037     if (!mNetworkAccessManager) {
0038         return LanguageToolResultJob::JobError::NetworkManagerNotDefined;
0039     }
0040     if (!hasNotEmptyText(mText)) {
0041         return LanguageToolResultJob::JobError::EmptyText;
0042     }
0043     if (mUrl.isEmpty()) {
0044         return LanguageToolResultJob::JobError::UrlNotDefined;
0045     }
0046     if (mLanguage.isEmpty()) {
0047         return LanguageToolResultJob::JobError::LanguageNotDefined;
0048     }
0049     return LanguageToolResultJob::JobError::NotError;
0050 }
0051 
0052 void LanguageToolResultJob::start()
0053 {
0054     const LanguageToolResultJob::JobError errorType = canStartError();
0055     switch (errorType) {
0056     case LanguageToolResultJob::JobError::EmptyText:
0057         return;
0058     case LanguageToolResultJob::JobError::UrlNotDefined:
0059     case LanguageToolResultJob::JobError::NetworkManagerNotDefined:
0060     case LanguageToolResultJob::JobError::LanguageNotDefined:
0061         qCWarning(TEXTGRAMMARCHECK_LOG) << "Impossible to start language tool";
0062         return;
0063     case LanguageToolResultJob::JobError::NotError:
0064         break;
0065     }
0066     QNetworkRequest request(QUrl::fromUserInput(mUrl));
0067     addRequestAttribute(request);
0068     const QByteArray ba = "text=" + mText.toUtf8() + "&language=" + mLanguage.toLatin1();
0069     QNetworkReply *reply = mNetworkAccessManager->post(request, ba);
0070     connect(reply, &QNetworkReply::finished, this, &LanguageToolResultJob::slotCheckGrammarFinished);
0071     connect(mNetworkAccessManager, &QNetworkAccessManager::finished, this, &LanguageToolResultJob::slotFinish);
0072 }
0073 
0074 void LanguageToolResultJob::slotFinish(QNetworkReply *reply)
0075 {
0076     if (reply->error() != QNetworkReply::NoError) {
0077         qCWarning(TEXTGRAMMARCHECK_LOG) << " Error reply - " << reply->errorString();
0078         Q_EMIT error(reply->errorString());
0079     }
0080 }
0081 
0082 void LanguageToolResultJob::slotCheckGrammarFinished()
0083 {
0084     auto reply = qobject_cast<QNetworkReply *>(sender());
0085     if (reply) {
0086         const QByteArray data = reply->readAll();
0087         Q_EMIT finished(QString::fromUtf8(data));
0088         reply->deleteLater();
0089     }
0090     deleteLater();
0091 }
0092 
0093 void LanguageToolResultJob::addRequestAttribute(QNetworkRequest &request) const
0094 {
0095     request.setHeader(QNetworkRequest::ContentTypeHeader, QStringLiteral("application/x-www-form-urlencoded"));
0096 }
0097 
0098 QString LanguageToolResultJob::language() const
0099 {
0100     return mLanguage;
0101 }
0102 
0103 void LanguageToolResultJob::setLanguage(const QString &language)
0104 {
0105     mLanguage = language;
0106 }
0107 
0108 QString LanguageToolResultJob::url() const
0109 {
0110     return mUrl;
0111 }
0112 
0113 void LanguageToolResultJob::setUrl(const QString &url)
0114 {
0115     mUrl = url;
0116 }
0117 
0118 QStringList LanguageToolResultJob::arguments() const
0119 {
0120     return mArguments;
0121 }
0122 
0123 void LanguageToolResultJob::setArguments(const QStringList &arguments)
0124 {
0125     mArguments = arguments;
0126 }
0127 
0128 QNetworkAccessManager *LanguageToolResultJob::networkAccessManager() const
0129 {
0130     return mNetworkAccessManager;
0131 }
0132 
0133 void LanguageToolResultJob::setNetworkAccessManager(QNetworkAccessManager *networkAccessManager)
0134 {
0135     mNetworkAccessManager = networkAccessManager;
0136 }
0137 
0138 QString LanguageToolResultJob::text() const
0139 {
0140     return mText;
0141 }
0142 
0143 void LanguageToolResultJob::setText(const QString &text)
0144 {
0145     mText = text;
0146 }
0147 
0148 #include "moc_languagetoolresultjob.cpp"