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"