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"