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"