File indexing completed on 2024-04-28 03:53:55

0001 /*
0002     SPDX-FileCopyrightText: 2010 Tobias Koenig <tokoe@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "davitemdeletejob.h"
0008 #include "davjobbase_p.h"
0009 
0010 #include "daverror.h"
0011 #include "davitemfetchjob.h"
0012 #include "davmanager_p.h"
0013 
0014 #include <KIO/DeleteJob>
0015 #include <KIO/Job>
0016 
0017 using namespace KDAV;
0018 
0019 namespace KDAV
0020 {
0021 class DavItemDeleteJobPrivate : public DavJobBasePrivate
0022 {
0023 public:
0024     void davJobFinished(KJob *job);
0025     void conflictingItemFetched(KJob *job);
0026 
0027     DavItem mItem;
0028     DavItem mFreshItem;
0029     int mFreshResponseCode = -1;
0030 };
0031 }
0032 
0033 DavItemDeleteJob::DavItemDeleteJob(const DavItem &item, QObject *parent)
0034     : DavJobBase(new DavItemDeleteJobPrivate, parent)
0035 {
0036     Q_D(DavItemDeleteJob);
0037     d->mItem = item;
0038 }
0039 
0040 void DavItemDeleteJob::start()
0041 {
0042     Q_D(DavItemDeleteJob);
0043     KIO::DeleteJob *job = KIO::del(d->mItem.url().url(), KIO::HideProgressInfo | KIO::DefaultFlags);
0044     job->addMetaData(QStringLiteral("PropagateHttpHeader"), QStringLiteral("true"));
0045     job->addMetaData(QStringLiteral("customHTTPHeader"), QStringLiteral("If-Match: ") + d->mItem.etag());
0046     job->addMetaData(QStringLiteral("cookies"), QStringLiteral("none"));
0047     job->addMetaData(QStringLiteral("no-auth-prompt"), QStringLiteral("true"));
0048 
0049     connect(job, &KIO::DeleteJob::result, this, [d](KJob *job) {
0050         d->davJobFinished(job);
0051     });
0052 }
0053 
0054 DavItem DavItemDeleteJob::freshItem() const
0055 {
0056     Q_D(const DavItemDeleteJob);
0057     return d->mFreshItem;
0058 }
0059 
0060 int DavItemDeleteJob::freshResponseCode() const
0061 {
0062     Q_D(const DavItemDeleteJob);
0063     return d->mFreshResponseCode;
0064 }
0065 
0066 void DavItemDeleteJobPrivate::davJobFinished(KJob *job)
0067 {
0068     KIO::DeleteJob *deleteJob = qobject_cast<KIO::DeleteJob *>(job);
0069 
0070     if (deleteJob->error() && deleteJob->error() != KIO::ERR_NO_CONTENT) {
0071         const int responseCode = deleteJob->queryMetaData(QStringLiteral("responsecode")).isEmpty() //
0072             ? 0
0073             : deleteJob->queryMetaData(QStringLiteral("responsecode")).toInt();
0074 
0075         if (responseCode != 404 && responseCode != 410) {
0076             setLatestResponseCode(responseCode);
0077             setError(ERR_ITEMDELETE);
0078             setJobErrorText(deleteJob->errorText());
0079             setJobError(deleteJob->error());
0080             setErrorTextFromDavError();
0081         }
0082 
0083         if (q_ptr->hasConflict()) {
0084             DavItemFetchJob *fetchJob = new DavItemFetchJob(mItem);
0085             QObject::connect(fetchJob, &DavItemFetchJob::result, q_ptr, [this](KJob *job) {
0086                 conflictingItemFetched(job);
0087             });
0088             fetchJob->start();
0089             return;
0090         }
0091     }
0092 
0093     emitResult();
0094 }
0095 
0096 void DavItemDeleteJobPrivate::conflictingItemFetched(KJob *job)
0097 {
0098     DavItemFetchJob *fetchJob = qobject_cast<DavItemFetchJob *>(job);
0099     mFreshResponseCode = fetchJob->latestResponseCode();
0100 
0101     if (!job->error()) {
0102         mFreshItem = fetchJob->item();
0103     }
0104 
0105     emitResult();
0106 }
0107 
0108 #include "moc_davitemdeletejob.cpp"