File indexing completed on 2024-05-12 05:17:15
0001 /* 0002 SPDX-FileCopyrightText: 2009 Kevin Ottens <ervin@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "namespacejob.h" 0008 0009 #include "kimap_debug.h" 0010 #include <KLocalizedString> 0011 0012 #include "imapstreamparser.h" 0013 #include "job_p.h" 0014 #include "listjob.h" 0015 #include "response_p.h" 0016 #include "rfccodecs.h" 0017 #include "session_p.h" 0018 0019 namespace KIMAP 0020 { 0021 class NamespaceJobPrivate : public JobPrivate 0022 { 0023 public: 0024 NamespaceJobPrivate(Session *session, const QString &name) 0025 : JobPrivate(session, name) 0026 { 0027 } 0028 ~NamespaceJobPrivate() 0029 { 0030 } 0031 0032 QList<MailBoxDescriptor> processNamespaceList(const QList<QByteArray> &namespaceList) 0033 { 0034 QList<MailBoxDescriptor> result; 0035 0036 for (const QByteArray &namespaceItem : namespaceList) { 0037 ImapStreamParser parser(nullptr); 0038 parser.setData(namespaceItem); 0039 0040 try { 0041 QList<QByteArray> parts = parser.readParenthesizedList(); 0042 if (parts.size() < 2) { 0043 continue; 0044 } 0045 MailBoxDescriptor descriptor; 0046 descriptor.name = QString::fromUtf8(decodeImapFolderName(parts[0])); 0047 descriptor.separator = QLatin1Char(parts[1][0]); 0048 0049 result << descriptor; 0050 } catch (const KIMAP::ImapParserException &e) { 0051 qCWarning(KIMAP_LOG) << "The stream parser raised an exception during namespace list parsing:" << e.what(); 0052 qCWarning(KIMAP_LOG) << "namespacelist:" << namespaceList; 0053 } 0054 } 0055 0056 return result; 0057 } 0058 0059 QList<MailBoxDescriptor> personalNamespaces; 0060 QList<MailBoxDescriptor> userNamespaces; 0061 QList<MailBoxDescriptor> sharedNamespaces; 0062 }; 0063 } 0064 0065 using namespace KIMAP; 0066 0067 NamespaceJob::NamespaceJob(Session *session) 0068 : Job(*new NamespaceJobPrivate(session, i18n("Namespace"))) 0069 { 0070 } 0071 0072 NamespaceJob::~NamespaceJob() 0073 { 0074 } 0075 0076 QList<MailBoxDescriptor> NamespaceJob::personalNamespaces() const 0077 { 0078 Q_D(const NamespaceJob); 0079 return d->personalNamespaces; 0080 } 0081 0082 QList<MailBoxDescriptor> NamespaceJob::userNamespaces() const 0083 { 0084 Q_D(const NamespaceJob); 0085 return d->userNamespaces; 0086 } 0087 0088 QList<MailBoxDescriptor> NamespaceJob::sharedNamespaces() const 0089 { 0090 Q_D(const NamespaceJob); 0091 return d->sharedNamespaces; 0092 } 0093 0094 bool NamespaceJob::containsEmptyNamespace() const 0095 { 0096 Q_D(const NamespaceJob); 0097 const QList<MailBoxDescriptor> completeList = d->personalNamespaces + d->userNamespaces + d->sharedNamespaces; 0098 0099 for (const MailBoxDescriptor &descriptor : completeList) { 0100 if (descriptor.name.isEmpty()) { 0101 return true; 0102 } 0103 } 0104 0105 return false; 0106 } 0107 0108 void NamespaceJob::doStart() 0109 { 0110 Q_D(NamespaceJob); 0111 d->tags << d->sessionInternal()->sendCommand("NAMESPACE"); 0112 } 0113 0114 void NamespaceJob::handleResponse(const Response &response) 0115 { 0116 Q_D(NamespaceJob); 0117 if (handleErrorReplies(response) == NotHandled) { 0118 if (response.content.size() >= 5 && response.content[1].toString() == "NAMESPACE") { 0119 // Personal namespaces 0120 d->personalNamespaces = d->processNamespaceList(response.content[2].toList()); 0121 0122 // User namespaces 0123 d->userNamespaces = d->processNamespaceList(response.content[3].toList()); 0124 0125 // Shared namespaces 0126 d->sharedNamespaces = d->processNamespaceList(response.content[4].toList()); 0127 } 0128 } 0129 } 0130 0131 #include "moc_namespacejob.cpp"