kutils: send mail from thread in KEMailDialog so it does not block

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2022-10-15 12:39:44 +03:00
parent b8f4e8f820
commit 7ddaa71a32
5 changed files with 97 additions and 34 deletions

View file

@ -68,12 +68,12 @@ QByteArray KEMailPrivate::makeData(const QString &subject, const QString &messag
QByteArray subjectbytes("Subject: ");
subjectbytes.append(subject.toAscii());
subjectbytes.append("\r\n\r\n");
subjectbytes.append("\n\n");
QByteArray result = subjectbytes;
result.append(message.toAscii());
result.append("\n");
result.replace('\n', "\r\n");
result.append("\r\n");
return result;
}
@ -82,7 +82,7 @@ size_t KEMailPrivate::curlReadCallback(char *ptr, size_t size, size_t nmemb, voi
KEMailPrivate* kemailprivate = static_cast<KEMailPrivate*>(userdata);
Q_ASSERT(kemailprivate);
Q_ASSERT(size == 1);
QByteArray kemailmessage = kemailprivate->m_data.left(qMin(int(nmemb), kemailprivate->m_data.size()));
const QByteArray kemailmessage = kemailprivate->m_data.left(qMin(int(nmemb), kemailprivate->m_data.size()));
if (kemailmessage.size() <= 0) {
kDebug() << "Message has been sent";
return 0;

View file

@ -29,6 +29,7 @@ class KEMailPrivate;
/*!
Class to send e-mail.
Example:
\code
KEMail kemail;
@ -37,7 +38,7 @@ class KEMailPrivate;
kemail.setPassword("mypass");
kemail.setFrom("myuser@myhost.com");
kemail.setTo(QStringList() << "otheruser@otherhost.com");
qDebug() << kemail.send("hello");
qDebug() << kemail.send("hello", "hi");
\endcode
@since 4.22

View file

@ -23,14 +23,32 @@
#include "ui_kemaildialog.h"
class KEMailDialogPrivate
#include <QThread>
#include <QProcess>
class KEMailDialogPrivate : public QThread
{
Q_OBJECT
public:
KEMailDialogPrivate();
~KEMailDialogPrivate();
KEMail* m_kemail;
Ui::KEMailDialogUI ui;
void sendMail(const QString &subject, const QString &message, const QStringList &attach);
Q_SIGNALS:
void sent();
void error(const QString &errorstring);
protected:
void run() final;
private:
QString m_subject;
QString m_message;
QStringList m_attach;
};
KEMailDialogPrivate::KEMailDialogPrivate()
@ -44,6 +62,25 @@ KEMailDialogPrivate::~KEMailDialogPrivate()
delete m_kemail;
}
void KEMailDialogPrivate::sendMail(const QString &subject, const QString &message, const QStringList &attach)
{
m_subject = subject;
m_message = message;
m_attach = attach;
start();
}
void KEMailDialogPrivate::run()
{
const bool result = m_kemail->send(m_subject, m_message, m_attach);
if (result) {
emit sent();
} else {
emit error(m_kemail->errorString());
}
}
KEMailDialog::KEMailDialog(QWidget *parent, Qt::WindowFlags flags)
: KDialog(parent, flags),
d(new KEMailDialogPrivate())
@ -52,7 +89,10 @@ KEMailDialog::KEMailDialog(QWidget *parent, Qt::WindowFlags flags)
d->ui.fromlineedit->setText(d->m_kemail->from());
d->ui.userlineedit->setText(d->m_kemail->user());
d->ui.passlineedit->setText(d->m_kemail->password());
// TODO: connect(d->ui.settingslabel)
connect(d->ui.settingslabel, SIGNAL(leftClickedUrl()), this, SLOT(_slotSettings()));
connect(d, SIGNAL(sent()), this, SLOT(_slotSent()));
connect(d, SIGNAL(error(QString)), this, SLOT(_slotError(QString)));
}
KEMailDialog::~KEMailDialog()
@ -60,11 +100,6 @@ KEMailDialog::~KEMailDialog()
delete d;
}
KEMail* KEMailDialog::kemail() const
{
return d->m_kemail;
}
void KEMailDialog::slotButtonClicked(int button)
{
if (button == KDialog::Ok) {
@ -88,16 +123,32 @@ void KEMailDialog::slotButtonClicked(int button)
KMessageBox::error(this, i18n("No message specified"));
return;
}
// TODO: do it in thread
const bool result = d->m_kemail->send(
d->sendMail(
d->ui.sibjectlineedit->text(),
d->ui.messagetextedit->textOrHtml(),
d->ui.attachlistwidget->items()
);
if (!result) {
KMessageBox::error(this, d->m_kemail->errorString());
return;
}
return;
}
KDialog::slotButtonClicked(button);
}
void KEMailDialog::_slotSettings()
{
QProcess::startDetached(
QString::fromLatin1("kcmshell4"),
QStringList() << QString::fromLatin1("useraccount")
);
}
void KEMailDialog::_slotSent()
{
KDialog::slotButtonClicked(KDialog::Ok);
}
void KEMailDialog::_slotError(const QString &errorstring)
{
KMessageBox::error(this, errorstring);
}
#include "kemaildialog.moc"

View file

@ -52,11 +52,14 @@ public:
KEMailDialog(QWidget *parent = nullptr, Qt::WindowFlags flags = 0);
~KEMailDialog();
KEMail* kemail() const;
protected Q_SLOTS:
virtual void slotButtonClicked(int button);
private Q_SLOTS:
void _slotSettings();
void _slotSent();
void _slotError(const QString &errorstring);
private:
Q_DISABLE_COPY(KEMailDialog);
KEMailDialogPrivate *d;

View file

@ -21,7 +21,11 @@
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="1">
<widget class="KLineEdit" name="sibjectlineedit"/>
<widget class="KLineEdit" name="sibjectlineedit">
<property name="placeholderText">
<string>Cannot be empty</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_4">
@ -46,7 +50,11 @@
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="1">
<widget class="KLineEdit" name="fromlineedit"/>
<widget class="KLineEdit" name="fromlineedit">
<property name="placeholderText">
<string>Cannot be empty</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="KLineEdit" name="userlineedit"/>
@ -103,30 +111,30 @@
</item>
<item row="0" column="1" rowspan="3">
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Attachments</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="3" column="0">
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Recipients</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="KEditListWidget" name="recipientslistwidget"/>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="KEditListWidget" name="attachlistwidget"/>
</item>
</layout>
</widget>
</item>
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Recipients</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="KEditListWidget" name="recipientslistwidget"/>
</item>
</layout>
</widget>
</item>
</layout>
</item>
</layout>