File indexing completed on 2024-05-12 05:17:13

0001 /*
0002     SPDX-FileCopyrightText: 2009 Andras Mantia <amantia@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "getquotarootjob.h"
0008 
0009 #include <KLocalizedString>
0010 
0011 #include "quotajobbase_p.h"
0012 #include "response_p.h"
0013 #include "rfccodecs.h"
0014 #include "session_p.h"
0015 
0016 namespace KIMAP
0017 {
0018 class GetQuotaRootJobPrivate : public QuotaJobBasePrivate
0019 {
0020 public:
0021     GetQuotaRootJobPrivate(Session *session, const QString &name)
0022         : QuotaJobBasePrivate(session, name)
0023     {
0024     }
0025     ~GetQuotaRootJobPrivate()
0026     {
0027     }
0028 
0029     QString mailBox;
0030     QList<QByteArray> rootList;
0031     QMap<QByteArray, QMap<QByteArray, QPair<qint64, qint64>>> quotas;
0032 };
0033 }
0034 
0035 using namespace KIMAP;
0036 
0037 GetQuotaRootJob::GetQuotaRootJob(Session *session)
0038     : QuotaJobBase(*new GetQuotaRootJobPrivate(session, i18n("GetQuotaRoot")))
0039 {
0040 }
0041 
0042 GetQuotaRootJob::~GetQuotaRootJob()
0043 {
0044 }
0045 
0046 void GetQuotaRootJob::doStart()
0047 {
0048     Q_D(GetQuotaRootJob);
0049     d->tags << d->sessionInternal()->sendCommand("GETQUOTAROOT", '\"' + KIMAP::encodeImapFolderName(d->mailBox.toUtf8()) + '\"');
0050 }
0051 
0052 void GetQuotaRootJob::handleResponse(const Response &response)
0053 {
0054     Q_D(GetQuotaRootJob);
0055     if (handleErrorReplies(response) == NotHandled) {
0056         if (response.content.size() >= 3) {
0057             if (response.content[1].toString() == "QUOTAROOT") {
0058                 d->rootList.clear();
0059                 // some impls don't give the root a name which for us seems as if
0060                 // there were no message part
0061                 if (response.content.size() == 3) {
0062                     d->rootList.append("");
0063                 } else {
0064                     int i = 3;
0065                     while (i < response.content.size()) {
0066                         d->rootList.append(response.content[i].toString());
0067                         i++;
0068                     }
0069                 }
0070             } else if (response.content[1].toString() == "QUOTA") {
0071                 QByteArray rootName;
0072                 int quotaContentIndex = 3;
0073                 // some impls don't give the root a name in the response
0074                 if (response.content.size() == 3) {
0075                     quotaContentIndex = 2;
0076                 } else {
0077                     rootName = response.content[2].toString();
0078                 }
0079 
0080                 const QMap<QByteArray, QPair<qint64, qint64>> &quota = d->readQuota(response.content[quotaContentIndex]);
0081                 if (d->quotas.contains(rootName)) {
0082                     d->quotas[rootName].insert(quota);
0083                 } else {
0084                     d->quotas[rootName] = quota;
0085                 }
0086             }
0087         }
0088     }
0089 }
0090 
0091 void GetQuotaRootJob::setMailBox(const QString &mailBox)
0092 {
0093     Q_D(GetQuotaRootJob);
0094     d->mailBox = mailBox;
0095 }
0096 
0097 QString GetQuotaRootJob::mailBox() const
0098 {
0099     Q_D(const GetQuotaRootJob);
0100     return d->mailBox;
0101 }
0102 
0103 QList<QByteArray> GetQuotaRootJob::roots() const
0104 {
0105     Q_D(const GetQuotaRootJob);
0106     return d->rootList;
0107 }
0108 
0109 qint64 GetQuotaRootJob::usage(const QByteArray &root, const QByteArray &resource) const
0110 {
0111     Q_D(const GetQuotaRootJob);
0112     QByteArray r = resource.toUpper();
0113 
0114     if (d->quotas.contains(root) && d->quotas[root].contains(r)) {
0115         return d->quotas[root][r].first;
0116     }
0117     return -1;
0118 }
0119 
0120 qint64 GetQuotaRootJob::limit(const QByteArray &root, const QByteArray &resource) const
0121 {
0122     Q_D(const GetQuotaRootJob);
0123 
0124     QByteArray r = resource.toUpper();
0125 
0126     if (d->quotas.contains(root) && d->quotas[root].contains(r)) {
0127         return d->quotas[root][r].second;
0128     }
0129     return -1;
0130 }
0131 
0132 QMap<QByteArray, qint64> GetQuotaRootJob::allUsages(const QByteArray &root) const
0133 {
0134     Q_D(const GetQuotaRootJob);
0135 
0136     QMap<QByteArray, qint64> result;
0137 
0138     if (d->quotas.contains(root)) {
0139         const QMap<QByteArray, QPair<qint64, qint64>> quota = d->quotas[root];
0140         QMap<QByteArray, QPair<qint64, qint64>>::const_iterator it = quota.cbegin();
0141         const QMap<QByteArray, QPair<qint64, qint64>>::const_iterator itEnd = quota.cend();
0142         for (; it != itEnd; ++it) {
0143             result[it.key()] = it.value().first;
0144         }
0145     }
0146     return result;
0147 }
0148 
0149 QMap<QByteArray, qint64> GetQuotaRootJob::allLimits(const QByteArray &root) const
0150 {
0151     Q_D(const GetQuotaRootJob);
0152 
0153     QMap<QByteArray, qint64> result;
0154 
0155     if (d->quotas.contains(root)) {
0156         const QMap<QByteArray, QPair<qint64, qint64>> quota = d->quotas[root];
0157         QMap<QByteArray, QPair<qint64, qint64>>::const_iterator it = quota.cbegin();
0158         const QMap<QByteArray, QPair<qint64, qint64>>::const_iterator itEnd = quota.cend();
0159         for (; it != itEnd; ++it) {
0160             result[it.key()] = it.value().second;
0161         }
0162     }
0163     return result;
0164 }
0165 
0166 #include "moc_getquotarootjob.cpp"