File indexing completed on 2024-06-23 05:18:32

0001 /*
0002  * SPDX-FileCopyrightText: 2010 Thomas McGuire <mcguire@kde.org>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-or-later
0005  */
0006 #include "inserttextfilejob.h"
0007 
0008 #include <QTextEdit>
0009 
0010 #include "messagecomposer_debug.h"
0011 #include <KIO/TransferJob>
0012 
0013 #include <QPointer>
0014 #include <QStringDecoder>
0015 
0016 using namespace MessageComposer;
0017 class MessageComposer::InsertTextFileJobPrivate
0018 {
0019 public:
0020     InsertTextFileJobPrivate(QTextEdit *editor, const QUrl &url)
0021         : mEditor(editor)
0022         , mUrl(url)
0023     {
0024     }
0025 
0026     QPointer<QTextEdit> mEditor;
0027     QUrl mUrl;
0028     QString mEncoding;
0029     QByteArray mFileData;
0030 };
0031 
0032 InsertTextFileJob::InsertTextFileJob(QTextEdit *editor, const QUrl &url)
0033     : KJob(editor)
0034     , d(new MessageComposer::InsertTextFileJobPrivate(editor, url))
0035 {
0036 }
0037 
0038 InsertTextFileJob::~InsertTextFileJob() = default;
0039 
0040 void InsertTextFileJob::slotFileData(KIO::Job *job, const QByteArray &data)
0041 {
0042     Q_UNUSED(job)
0043     d->mFileData += data;
0044 }
0045 
0046 void InsertTextFileJob::slotGetJobFinished(KJob *job)
0047 {
0048     if (job->error()) {
0049         qCWarning(MESSAGECOMPOSER_LOG) << job->errorString();
0050         setError(job->error());
0051         setErrorText(job->errorText());
0052         emitResult();
0053         return;
0054     }
0055 
0056     if (d->mEditor) {
0057         if (!d->mEncoding.isEmpty()) {
0058             QStringDecoder fileCodec(d->mEncoding.toLatin1().constData());
0059             if (fileCodec.isValid()) {
0060                 d->mEditor->textCursor().insertText(fileCodec.decode(d->mFileData.data()));
0061             } else {
0062                 d->mEditor->textCursor().insertText(QString::fromLocal8Bit(d->mFileData.data()));
0063             }
0064         } else {
0065             d->mEditor->textCursor().insertText(QString::fromLocal8Bit(d->mFileData.data()));
0066         }
0067     }
0068 
0069     emitResult();
0070 }
0071 
0072 void InsertTextFileJob::setEncoding(const QString &encoding)
0073 {
0074     d->mEncoding = encoding;
0075 }
0076 
0077 void InsertTextFileJob::start()
0078 {
0079     KIO::TransferJob *job = KIO::get(d->mUrl);
0080     connect(job, &KIO::TransferJob::result, this, &InsertTextFileJob::slotGetJobFinished);
0081     connect(job, &KIO::TransferJob::data, this, &InsertTextFileJob::slotFileData);
0082     job->start();
0083 }
0084 
0085 #include "moc_inserttextfilejob.cpp"