Messagelib
composerviewbase.cpp
2 SPDX-FileCopyrightText: 2010 Klaralvdalens Datakonsult AB, a KDAB Group company, [email protected]
116 bool resultTooManyRecipients = m_recipientsEditor->setRecipientString(m_msg->to()->mailboxes(), MessageComposer::Recipient::To);
118 resultTooManyRecipients = m_recipientsEditor->setRecipientString(m_msg->cc()->mailboxes(), MessageComposer::Recipient::Cc);
121 resultTooManyRecipients = m_recipientsEditor->setRecipientString(m_msg->bcc()->mailboxes(), MessageComposer::Recipient::Bcc);
124 resultTooManyRecipients = m_recipientsEditor->setRecipientString(m_msg->replyTo()->mailboxes(), MessageComposer::Recipient::ReplyTo);
206 const MailTransport::Transport *transport = MailTransport::TransportManager::self()->transportById(transportId);
220 htmlContent.replace(QRegularExpression(QStringLiteral("<div\\s*id=\".*\">")), QStringLiteral("<div>"));
312 void ComposerViewBase::send(MessageComposer::MessageSender::SendMethod method, MessageComposer::MessageSender::SaveIn saveIn, bool checkMailDispatcher)
330 m_encrypt ? m_sign ? i18n("&Keep markup, do not sign/encrypt") : i18n("&Keep markup, do not encrypt") : i18n("&Keep markup, do not sign");
331 const QString yesBtnText = m_encrypt ? m_sign ? i18n("Sign/Encrypt (delete markup)") : i18n("Encrypt (delete markup)") : i18n("Sign (delete markup)");
361 qCWarning(MESSAGECOMPOSER_LOG) << "Impossible to set sendmaildispatcher online. Please verify it";
384 qCDebug(MESSAGECOMPOSER_LOG) << "ready for sending: Called while composer active; ignoring. Number of composer " << m_composers.count();
400 connect(job, &MessageComposer::EmailAddressResolveJob::result, this, &ComposerViewBase::slotEmailAddressResolved);
407 qCWarning(MESSAGECOMPOSER_LOG) << "An error occurred while resolving the email addresses:" << job->errorString();
412 bool autoresizeImage = MessageComposer::MessageComposerSettings::self()->autoResizeImageEnabled();
414 const MessageComposer::EmailAddressResolveJob *resolveJob = qobject_cast<MessageComposer::EmailAddressResolveJob *>(job);
503 if (m_neverEncrypt && mSaveIn != MessageComposer::MessageSender::SaveInNone && !mSendLaterInfo) {
547 connect(composer, &MessageComposer::Composer::result, this, &ComposerViewBase::slotSendComposeResult);
562 const int num = MessageComposer::MessageComposerSettings::self()->cryptoWarnOwnEncrKeyNearExpiryThresholdDays();
571 const int num = MessageComposer::MessageComposerSettings::self()->cryptoWarnEncrKeyNearExpiryThresholdDays();
580 const int num = MessageComposer::MessageComposerSettings::self()->cryptoWarnEncrRootNearExpiryThresholdDays();
589 const int num = MessageComposer::MessageComposerSettings::self()->cryptoWarnEncrChaincertNearExpiryThresholdDays();
657 qCWarning(MESSAGECOMPOSER_LOG) << "Failed to export " << k.primaryFingerprint() << result.asString();
679 qCDebug(MESSAGECOMPOSER_LOG) << "Adding " << k.primaryFingerprint() << "from Autocrypt storage";
713 [&canceled](const GpgME::Key &key, QString msg, Kleo::ExpiryChecker::ExpiryInformation info, bool isNewMessage) {
723 if (info == Kleo::ExpiryChecker::OwnKeyExpired || info == Kleo::ExpiryChecker::OwnKeyNearExpiry) {
728 if (info == Kleo::ExpiryChecker::OwnKeyExpired || info == Kleo::ExpiryChecker::OtherKeyExpired) {
729 title = key.protocol() == GpgME::OpenPGP ? i18n("OpenPGP Key Expired") : i18n("S/MIME Certificate Expired");
731 title = key.protocol() == GpgME::OpenPGP ? i18n("OpenPGP Key Expires Soon") : i18n("S/MIME Certificate Expires Soon");
733 if (KMessageBox::warningContinueCancel(nullptr, msg, title, KStandardGuiItem::cont(), KStandardGuiItem::cancel(), dontAskAgainName)
740 new Kleo::KeyResolver(true, showKeyApprovalDialog(), id.pgpAutoEncrypt(), m_cryptoMessageFormat, expiryChecker()));
801 signSomething = determineWhetherToSign(doSignCompletely, keyResolver.data(), signSomething, result, canceled);
815 encryptSomething = determineWhetherToEncrypt(doEncryptCompletely, keyResolver.data(), encryptSomething, signSomething, result, canceled);
837 composer->setSenderEncryptionKey(keyResolver->encryptToSelfKeysFor(Kleo::OpenPGPMIMEFormat)[0]);
915 Q_ASSERT_X(false, "ComposerViewBase::generateCryptoMessages", "No concrete sign or encrypt method selected");
929 void ComposerViewBase::fillInfoPart(MessageComposer::InfoPart *infoPart, ComposerViewBase::RecipientExpansion expansion)
954 infoPart->setReplyTo(m_recipientsEditor->recipientStringList(MessageComposer::Recipient::ReplyTo));
1038 qCDebug(MESSAGECOMPOSER_LOG) << "compose job might have error: " << job->error() << " errorString: " << job->errorString();
1095 void ComposerViewBase::queueMessage(const KMime::Message::Ptr &message, MessageComposer::Composer *composer)
1108 qjob->sentBehaviourAttribute().setSentBehaviour(Akonadi::SentBehaviourAttribute::MoveToCollection);
1113 qjob->sentBehaviourAttribute().setSentBehaviour(Akonadi::SentBehaviourAttribute::MoveToDefaultSentCollection);
1116 MailTransport::Transport *transport = MailTransport::TransportManager::self()->transportById(infoPart->transportId());
1119 KEmailAddress::extractEmailAddress(KEmailAddress::normalizeAddressesAndEncodeIdn(transport->senderOverwriteAddress())));
1121 qjob->addressAttribute().setFrom(KEmailAddress::extractEmailAddress(KEmailAddress::normalizeAddressesAndEncodeIdn(infoPart->from())));
1123 // if this header is not empty, it contains the real recipient of the message, either the primary or one of the
1124 // secondary recipients. so we set that to the transport job, while leaving the message itself alone.
1126 qjob->addressAttribute().setTo(MessageComposer::Util::cleanUpEmailListAndEncoding(realTo->asUnicodeString().split(QLatin1Char('%'))));
1129 qCDebug(MESSAGECOMPOSER_LOG) << "sending with-bcc encr mail to a/n recipient:" << qjob->addressAttribute().to();
1131 qjob->addressAttribute().setTo(MessageComposer::Util::cleanUpEmailListAndEncoding(infoPart->to()));
1132 qjob->addressAttribute().setCc(MessageComposer::Util::cleanUpEmailListAndEncoding(infoPart->cc()));
1133 qjob->addressAttribute().setBcc(MessageComposer::Util::cleanUpEmailListAndEncoding(infoPart->bcc()));
1162 QString msg = i18n("There were problems trying to queue the message for sending: %1", job->errorString());
1181 QDir dataDirectory(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/kmail2/"));
1251 QDir autoSaveDir(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/kmail2/autosave"));
1280 qCDebug(MESSAGECOMPOSER_LOG) << "Autosave: Called while composer active; ignoring. Number of composer " << m_composers.count();
1289 connect(composer, &MessageComposer::Composer::result, this, &ComposerViewBase::slotAutoSaveComposeResult);
1334 const QString autosavePath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/kmail2/autosave/");
1344 if (file.write(message->encodedContent()) != static_cast<qint64>(message->encodedContent().size())) {
1356 qCWarning(MESSAGECOMPOSER_LOG) << "Auto saving failed:" << errorMessage << file.errorString() << " m_autoSaveUUID" << m_autoSaveUUID;
1378 void ComposerViewBase::saveMessage(const KMime::Message::Ptr &message, MessageComposer::MessageSender::SaveIn saveIn)
1413 target = Akonadi::SpecialMailCollections::self()->defaultCollection(Akonadi::SpecialMailCollections::Outbox);
1419 auto saveMessageJob = new Akonadi::CollectionFetchJob(target, Akonadi::CollectionFetchJob::Base);
1421 QObject::connect(saveMessageJob, &Akonadi::CollectionFetchJob::result, this, &ComposerViewBase::slotSaveMessage);
1426 connect(create, &Akonadi::ItemCreateJob::result, this, &ComposerViewBase::slotCreateItemResult);
1438 const Akonadi::CollectionFetchJob *fetchJob = qobject_cast<Akonadi::CollectionFetchJob *>(job);
1446 connect(create, &Akonadi::ItemCreateJob::result, this, &ComposerViewBase::slotCreateItemResult);
1457 target = Akonadi::SpecialMailCollections::self()->defaultCollection(Akonadi::SpecialMailCollections::Drafts);
1460 target = Akonadi::SpecialMailCollections::self()->defaultCollection(Akonadi::SpecialMailCollections::Templates);
1463 target = Akonadi::SpecialMailCollections::self()->defaultCollection(Akonadi::SpecialMailCollections::Outbox);
1508 void ComposerViewBase::addAttachment(const QString &name, const QString &filename, const QString &charset, const QByteArray &data, const QByteArray &mimeType)
1510 MessageCore::AttachmentPart::Ptr attachment = MessageCore::AttachmentPart::Ptr(new MessageCore::AttachmentPart());
1526 if (partToAttach->contentType()->mimeType() == "multipart/digest" || partToAttach->contentType(false)->mimeType() == "message/rfc822") {
1560 void ComposerViewBase::fillComposer(MessageComposer::Composer *composer, ComposerViewBase::RecipientExpansion expansion, bool autoresize)
1574 return MessageComposer::Util::cleanedUpHeaderString(m_recipientsEditor->recipientString(MessageComposer::Recipient::To));
1583 return MessageComposer::Util::cleanedUpHeaderString(m_recipientsEditor->recipientString(MessageComposer::Recipient::Cc));
1592 return MessageComposer::Util::cleanedUpHeaderString(m_recipientsEditor->recipientString(MessageComposer::Recipient::Bcc));
1605 return MessageComposer::Util::cleanedUpHeaderString(m_recipientsEditor->recipientString(MessageComposer::Recipient::ReplyTo));
1630 void ComposerViewBase::setAttachmentController(MessageComposer::AttachmentControllerBase *controller)
1660 void ComposerViewBase::setSignatureController(MessageComposer::SignatureController *sigController)
1713 void ComposerViewBase::identityChanged(const KIdentityManagementCore::Identity &ident, const KIdentityManagementCore::Identity &oldIdent, bool msgCleared)
1719 KIdentityManagementCore::Signature oldSig = const_cast<KIdentityManagementCore::Identity &>(oldIdent).signature();
1720 KIdentityManagementCore::Signature newSig = const_cast<KIdentityManagementCore::Identity &>(ident).signature();
1772 auto const checkFccCollectionJob = new Akonadi::CollectionFetchJob(fccCollection, Akonadi::CollectionFetchJob::Base);
1773 connect(checkFccCollectionJob, &KJob::result, this, &ComposerViewBase::slotFccCollectionCheckResult);
1779 qCWarning(MESSAGECOMPOSER_LOG) << " void ComposerViewBase::slotFccCollectionCheckResult(KJob *job) error " << job->errorString();
1780 const Akonadi::Collection sentMailCol = Akonadi::SpecialMailCollections::self()->defaultCollection(Akonadi::SpecialMailCollections::SentMail);
1818 void ComposerViewBase::setCryptoOptions(bool sign, bool encrypt, Kleo::CryptoMessageFormat format, bool neverEncryptDrafts)
1851 if (parentnode && parentnode->contentType()->isMultipart() && parentnode->contentType()->subType() == "related") {
1855 qCDebug(MESSAGECOMPOSER_LOG) << "found image in multipart/related : " << node->contentType()->name();
1887 return MessageComposer::Util::hasMissingAttachments(attachmentKeywords, m_editor->document(), subject());
1890 ComposerViewBase::MissingAttachment ComposerViewBase::checkForMissingAttachments(const QStringList &attachmentKeywords)
1934 bool ComposerViewBase::determineWhetherToSign(bool doSignCompletely, Kleo::KeyResolver *keyResolver, bool signSomething, bool &result, bool &canceled)
2013 if (KMessageBox::warningContinueCancel(m_parentWidget, msg, i18nc("@title:window", "Send Unsigned?"), KGuiItem(i18n("Send &Unsigned")))
2035 const QString buttonText = sign && !doSignCompletely ? i18n("&Sign All Parts") : i18n("&Sign");
2152 if (KMessageBox::warningContinueCancel(m_parentWidget, msg, i18nc("@title:window", "Send Unencrypted?"), KGuiItem(i18n("Send &Unencrypted")))
2176 const QString buttonText = !doEncryptCompletely ? i18n("&Encrypt All Parts") : i18n("&Encrypt");
2218 job->setTo(mExpandedReplyTo.isEmpty() ? mExpandedTo.join(QLatin1Char(',')) : mExpandedReplyTo.join(QLatin1Char(',')));
bool isValid() const
KCODECS_EXPORT QByteArray extractEmailAddress(const QByteArray &address)
void append(const T &value)
void clear()
QStringList expandedBcc() const
Returns the expanded Bcc field.
Definition: emailaddressresolvejob.cpp:180
bool isImage() const
currentText
QString expandedFrom() const
Returns the expanded From field.
Definition: emailaddressresolvejob.cpp:165
void disableHtml(MessageComposer::ComposerViewBase::Confirmation)
Enabling or disabling HTML in the editor is affected by various client options, so when that would ot...
MoveToCollection
Simple interface that both EncryptJob and SignEncryptJob implement so the composer can extract some e...
Definition: attachmentcontrollerbase.h:26
Akonadi::Collection defaultCollection(Type type) const
QString number(int n, int base)
QString fcc
The name of a file, to which a copy of the sent message should be appended.
Definition: infopart.h:45
WriteOnly
QString fromUtf8(const char *str, int size)
int size() const const
virtual Q_SCRIPTABLE void start()=0
QVariant fromValue(const T &value)
ButtonCode warningContinueCancel(QWidget *parent, const QString &text, const QString &title=QString(), const KGuiItem &buttonContinue=KStandardGuiItem::cont(), const KGuiItem &buttonCancel=KStandardGuiItem::cancel(), const QString &dontAskAgainName=QString(), Options options=Notify)
bool setCurrentTransport(int transportId)
QByteArray mimeType() const
QStringList to
The email address and optionally the name of the primary recipients.
Definition: infopart.h:29
Q_EMITQ_EMIT
void removePrivateHeaderFields(const KMime::Message::Ptr &message, bool cleanUpHeader)
Removes all private header fields (e.g.
Definition: stringutil.cpp:354
Content * parent() const
void result(KJob *job)
int removeAll(const T &value)
MESSAGECORE_EXPORT KMime::Content * nextSibling(const KMime::Content *node)
Returns the next sibling node of the given node.
Definition: messagecore/src/helpers/nodehelper.cpp:14
QDateTime currentDateTime()
int count(const T &value) const const
T value() const const
MoveToDefaultSentCollection
bool contains(const QString &str, Qt::CaseSensitivity cs) const const
void clear()
void addAttachment(const QUrl &url, const QString &comment, bool sync)
Add the given attachment to the message.
Definition: composerviewbase.cpp:1497
void setAutoSaveFileName(const QString &fileName)
Sets the filename to use when autosaving something.
Definition: composerviewbase.cpp:1293
qlonglong toLongLong(bool *ok, int base) const const
void sentSuccessfully(Akonadi::Item::Id id)
Message sending completed successfully.
The SignatureController class Controls signature (the footer thing, not the crypto thing) operations ...
Definition: signaturecontroller.h:34
Id id() const
const Identity & identityForUoidOrDefault(uint uoid) const
void setMimeType(const QString &mimeType)
Parses messages and generates HTML display code out of them.
Definition: objecttreeparser.h:245
QString fcc() const
void push_back(const T &value)
void setMessage(const KMime::Message::Ptr &newMsg, bool allowDecryption)
Set the message to be opened in the composer window, and set the internal data structures to keep tra...
Definition: composerviewbase.cpp:103
QString writableLocation(QStandardPaths::StandardLocation type)
QStringList expandedCc() const
Returns the expanded CC field.
Definition: emailaddressresolvejob.cpp:175
QByteArray toLatin1() const const
void send(MessageComposer::MessageSender::SendMethod method, MessageComposer::MessageSender::SaveIn saveIn, bool checkMailDispatcher=true)
Send the message with the specified method, saving it in the specified folder.
Definition: composerviewbase.cpp:312
void applySignature(const KIdentityManagementCore::Signature &signature)
Adds the given signature to the editor, taking user preferences into account.
Definition: signaturecontroller.cpp:141
int exec(QEventLoop::ProcessEventsFlags flags)
A very simple ObjectTreeSource.
Definition: simpleobjecttreesource.h:20
bool contains(const T &value) const const
bool encryptionOverride() const
Headers::ContentID * contentID(bool create=true)
bool loadFromData(const uchar *data, int len, const char *format)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
int currentTransportId() const
QString name() const
AKONADI_MIME_EXPORT void copyMessageFlags(KMime::Message &from, Akonadi::Item &to)
QString autocorrectionLanguage() const
QByteArray identifier() const
KCharsets * charsets()
void reserve(int alloc)
KGuiItem cancel()
KCALUTILS_EXPORT QString errorMessage(const KCalendarCore::Exception &exception)
qint64 Id
Collection::List collections() const
Message
void setDefaultCollection(const Collection &collection)
QString replyToAddr() const
void start(int msec)
QString cc() const
void setFrom(const QString &from)
Widgets for editing differ in client classes, so values are set before sending.
Definition: composerviewbase.cpp:1799
bool isNull() const
QAction * create(StandardAction id, const QObject *recvr, const char *slot, QObject *parent)
QString i18n(const char *text, const TYPE &arg...)
QSharedPointer< AttachmentPart > Ptr
Defines a pointer to an attachment object.
Definition: attachmentpart.h:31
void quit()
A job to resolve nicknames, distribution lists and email addresses for queued emails.
Definition: emailaddressresolvejob.h:27
QByteArray encodedContent(bool useCrLf=false)
QStringList cc
Carbon copy: The email address and optionally the name of the secondary recipients.
Definition: infopart.h:32
QString currentDictionary() const
void cleanupAutoSave()
Stop autosaving and delete the autosaved message.
Definition: composerviewbase.cpp:1243
QString vCardFile() const
void timeout()
bool isEmpty() const const
QUrl fromLocalFile(const QString &localFile)
WaitCursor
bool attachVcard() const
QByteArray toUtf8() const const
const T & at(int i) const const
bool mkpath(const QString &dirPath) const const
QUuid createUuid()
QString bcc() const
void removeRecipient(const QString &recipient, Recipient::Type type)
Removes the recipient provided it can be found and has the given type.
Definition: recipientseditor.cpp:164
Headers::ContentDisposition * contentDisposition(bool create=true)
The FollowupReminderCreateJob class.
Definition: followupremindercreatejob.h:26
void setAttachmentModel(MessageComposer::AttachmentModel *model)
The following are for setting the various options and widgets in the composer.
Definition: composerviewbase.cpp:1640
static TransportManager * self()
bool isComposing() const
Returns true if there is at least one composer job running.
Definition: composerviewbase.cpp:98
void setNameFilters(const QStringList &nameFilters)
int toInt(bool *ok, int base) const const
bool isValid() const const
QStringList expandedReplyTo() const
Returns the expanded Reply-To field.
Definition: emailaddressresolvejob.cpp:185
bool isEmpty() const const
void setAutoSave(bool isAutoSave)
Sets if this message being composed is an auto-saved message if so, might need different handling,...
Definition: composer.cpp:673
ReadUser
QByteArray subType() const
ButtonCode warningTwoActions(QWidget *parent, const QString &text, const QString &title, const KGuiItem &primaryAction, const KGuiItem &secondaryAction, const QString &dontAskAgainName=QString(), Options options=Options(Notify|Dangerous))
void setCryptoOptions(bool sign, bool encrypt, Kleo::CryptoMessageFormat format, bool neverEncryptDrafts=false)
The following are various settings the user can modify when composing a message.
Definition: composerviewbase.cpp:1818
QString htmlContent() const
Similar to plainTextContent(), but returns the HTML source of the first text/html MIME part.
Definition: objecttreeparser.cpp:104
bool remove(const QString &fileName)
bool addRecipient(const QString &recipient, Recipient::Type type)
Adds a recipient (or multiple recipients) to one line of the editor.
Definition: recipientseditor.cpp:98
QString join(const QString &separator) const const
void addAttachment(const MessageCore::AttachmentPart::Ptr &part)
sets sign, encrypt, shows properties dialog if so configured
Definition: attachmentcontrollerbase.cpp:924
KSharedConfigPtr config()
QString toString() const const
void error(QWidget *parent, const QString &text, const QString &title, const KGuiItem &buttonOk, Options options=Notify)
QString & replace(int position, int n, QChar after)
void parseObjectTree(KMime::Content *node, bool parseOnlySingleNode=false)
Parse beginning at a given node and recursively parsing the children of that node and it's next sibli...
Definition: objecttreeparser.cpp:111
QByteArray decodedContent()
QString rawText(bool *ok=nullptr, QString *errorMessage=nullptr) const
void setContent(const QByteArray &s)
GenericDataLocation
The AttachmentControllerBase class.
Definition: attachmentcontrollerbase.h:32
bool isEmpty() const const
Id id() const
KIOFILEWIDGETS_EXPORT QString dir(const QString &fileClass)
QString from
The email address and optionally the name of the author of the mail.
Definition: infopart.h:26
Akonadi::Collection currentCollection() const
void add(const QString &entry)
bool warnNotEncrypt() const
void updateAutoSave()
Enables/disables autosaving depending on the value of the autosave interval.
Definition: composerviewbase.cpp:1225
const char * constData() const const
void stop()
QString fromLatin1(const char *str, int size)
QList< KMime::Content * > attachmentsOfExtraContents() const
Returns a list of attachments of attached extra content nodes.
Definition: mimetreeparser/src/nodehelper.cpp:1114
QStringList expandedTo() const
Returns the expanded To field.
Definition: emailaddressresolvejob.cpp:170
KGuiItem cont()
static SpecialMailCollections * self()
QString i18nc(const char *context, const char *text, const TYPE &arg...)
bool warnNotSign() const
bool isValid() const
bool autocryptEnabled() const
QString templates() const
void failed(const QString &errorMessage, MessageComposer::ComposerViewBase::FailedType type=Sending)
Message sending failed with given error message.
void setPayload(const T &p)
ComposerViewBase::MissingAttachment checkForMissingAttachments(const QStringList &attachmentKeywords)
Check if the mail has references to attachments, but no attachments are added to it.
Definition: composerviewbase.cpp:1890
Headers::ContentType * contentType(bool create=true)
virtual QString errorString() const
bool isMultipart() const
QStringList entryList(QDir::Filters filters, QDir::SortFlags sort) const const
int error() const
Action checkSigningPreferences(bool signingRequested) const
Determine whether to sign or not, depending on the per-recipient signing preferences,...
Definition: keyresolver.cpp:769
QStringList bcc
Blind Carbon copy: The email address and optionally the name of the secondary recipients.
Definition: infopart.h:36
ButtonCode warningTwoActionsCancel(QWidget *parent, const QString &text, const QString &title, const KGuiItem &primaryAction, const KGuiItem &secondaryAction, const KGuiItem &cancelAction=KStandardGuiItem::cancel(), const QString &dontAskAgainName=QString(), Options options=Options(Notify|Dangerous))
Transport * transportById(Transport::Id id, bool def=true) const
QString message
static QList< Mailbox > listFromUnicodeString(const QString &s)
const QList< QKeySequence > & end()
Action checkEncryptionPreferences(bool encryptionRequested) const
Determine whether to encrypt or not, depending on the per-recipient encryption preferences,...
Definition: keyresolver.cpp:795
Headers::ContentDescription * contentDescription(bool create=true)
virtual QVariant get(ScriptableExtension *callerPrincipal, quint64 objId, const QString &propName)
QVariant property(const char *name) const const
KCODECS_EXPORT QString normalizeAddressesAndEncodeIdn(const QString &str)
static RecentAddresses * self(KConfig *config=nullptr)
QString drafts() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Sun Oct 1 2023 03:53:34 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006
Documentation copyright © 1996-2023 The KDE developers.
Generated on Sun Oct 1 2023 03:53:34 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006
KDE's Doxygen guidelines are available online.