diff --git a/src/common/davitemcreatejob.h b/src/common/davitemcreatejob.h --- a/src/common/davitemcreatejob.h +++ b/src/common/davitemcreatejob.h @@ -26,6 +26,8 @@ #include "davurl.h" namespace KDAV { +class DavItemCreateJobPrivate; + /** * @short A job to create a DAV item on the DAV server. */ @@ -58,8 +60,8 @@ private: void davJobFinished(KJob *); void itemRefreshed(KJob *); - DavItem mItem; - int mRedirectCount; + + Q_DECLARE_PRIVATE(DavItemCreateJob) }; } diff --git a/src/common/davitemcreatejob.cpp b/src/common/davitemcreatejob.cpp --- a/src/common/davitemcreatejob.cpp +++ b/src/common/davitemcreatejob.cpp @@ -17,6 +17,7 @@ */ #include "davitemcreatejob.h" +#include "davjobbase_p.h" #include "davitemfetchjob.h" #include "davmanager.h" @@ -29,21 +30,31 @@ using namespace KDAV; +namespace KDAV { +class DavItemCreateJobPrivate : public DavJobBasePrivate +{ +public: + DavItem mItem; + int mRedirectCount = 0; +}; +} + DavItemCreateJob::DavItemCreateJob(const DavItem &item, QObject *parent) - : DavJobBase(parent) - , mItem(item) - , mRedirectCount(0) + : DavJobBase(new DavItemCreateJobPrivate, parent) { + Q_D(DavItemCreateJob); + d->mItem = item; } void DavItemCreateJob::start() { + Q_D(DavItemCreateJob); QString headers = QStringLiteral("Content-Type: "); - headers += mItem.contentType(); + headers += d->mItem.contentType(); headers += QLatin1String("\r\n"); headers += QLatin1String("If-None-Match: *"); - KIO::StoredTransferJob *job = KIO::storedPut(mItem.data(), itemUrl(), -1, KIO::HideProgressInfo | KIO::DefaultFlags); + KIO::StoredTransferJob *job = KIO::storedPut(d->mItem.data(), itemUrl(), -1, KIO::HideProgressInfo | KIO::DefaultFlags); job->addMetaData(QStringLiteral("PropagateHttpHeader"), QStringLiteral("true")); job->addMetaData(QStringLiteral("customHTTPHeader"), headers); job->addMetaData(QStringLiteral("cookies"), QStringLiteral("none")); @@ -55,16 +66,19 @@ DavItem DavItemCreateJob::item() const { - return mItem; + Q_D(const DavItemCreateJob); + return d->mItem; } QUrl DavItemCreateJob::itemUrl() const { - return mItem.url().url(); + Q_D(const DavItemCreateJob); + return d->mItem.url().url(); } void DavItemCreateJob::davJobFinished(KJob *job) { + Q_D(DavItemCreateJob); KIO::StoredTransferJob *storedJob = qobject_cast(job); const QString responseCodeStr = storedJob->queryMetaData(QStringLiteral("responsecode")); const int responseCode = responseCodeStr.isEmpty() @@ -101,35 +115,36 @@ } if (responseCode == 301 || responseCode == 302 || responseCode == 307 || responseCode == 308) { - if (mRedirectCount > 4) { + if (d->mRedirectCount > 4) { setLatestResponseCode(responseCode); setError(UserDefinedError + responseCode); emitResult(); } else { QUrl _itemUrl(url); _itemUrl.setUserInfo(itemUrl().userInfo()); - mItem.setUrl(DavUrl(_itemUrl, mItem.url().protocol())); + d->mItem.setUrl(DavUrl(_itemUrl, d->mItem.url().protocol())); - ++mRedirectCount; + ++d->mRedirectCount; start(); } return; } url.setUserInfo(itemUrl().userInfo()); - mItem.setUrl(DavUrl(url, mItem.url().protocol())); + d->mItem.setUrl(DavUrl(url, d->mItem.url().protocol())); - DavItemFetchJob *fetchJob = new DavItemFetchJob(mItem); + DavItemFetchJob *fetchJob = new DavItemFetchJob(d->mItem); connect(fetchJob, &DavItemFetchJob::result, this, &DavItemCreateJob::itemRefreshed); fetchJob->start(); } void DavItemCreateJob::itemRefreshed(KJob *job) { + Q_D(DavItemCreateJob); if (!job->error()) { DavItemFetchJob *fetchJob = qobject_cast(job); - mItem.setEtag(fetchJob->item().etag()); + d->mItem.setEtag(fetchJob->item().etag()); } emitResult(); } diff --git a/src/common/davitemdeletejob.h b/src/common/davitemdeletejob.h --- a/src/common/davitemdeletejob.h +++ b/src/common/davitemdeletejob.h @@ -26,6 +26,8 @@ #include "davurl.h" namespace KDAV { +class DavItemDeleteJobPrivate; + /** * @short A job to delete a DAV item on the DAV server. */ @@ -60,9 +62,8 @@ private: void davJobFinished(KJob *); void conflictingItemFetched(KJob *); - DavItem mItem; - DavItem mFreshItem; - int mFreshResponseCode; + + Q_DECLARE_PRIVATE(DavItemDeleteJob) }; } diff --git a/src/common/davitemdeletejob.cpp b/src/common/davitemdeletejob.cpp --- a/src/common/davitemdeletejob.cpp +++ b/src/common/davitemdeletejob.cpp @@ -17,6 +17,7 @@ */ #include "davitemdeletejob.h" +#include "davjobbase_p.h" #include "davitemfetchjob.h" #include "davmanager.h" @@ -27,36 +28,50 @@ using namespace KDAV; +namespace KDAV { +class DavItemDeleteJobPrivate : public DavJobBasePrivate +{ +public: + DavItem mItem; + DavItem mFreshItem; + int mFreshResponseCode = -1; +}; +} + DavItemDeleteJob::DavItemDeleteJob(const DavItem &item, QObject *parent) - : DavJobBase(parent) - , mItem(item) - , mFreshResponseCode(-1) + : DavJobBase(new DavItemDeleteJobPrivate, parent) { + Q_D(DavItemDeleteJob); + d->mItem = item; } void DavItemDeleteJob::start() { - KIO::DeleteJob *job = KIO::del(mItem.url().url(), KIO::HideProgressInfo | KIO::DefaultFlags); + Q_D(DavItemDeleteJob); + KIO::DeleteJob *job = KIO::del(d->mItem.url().url(), KIO::HideProgressInfo | KIO::DefaultFlags); job->addMetaData(QStringLiteral("PropagateHttpHeader"), QStringLiteral("true")); - job->addMetaData(QStringLiteral("customHTTPHeader"), QStringLiteral("If-Match: ") + mItem.etag()); + job->addMetaData(QStringLiteral("customHTTPHeader"), QStringLiteral("If-Match: ") + d->mItem.etag()); job->addMetaData(QStringLiteral("cookies"), QStringLiteral("none")); job->addMetaData(QStringLiteral("no-auth-prompt"), QStringLiteral("true")); connect(job, &KIO::DeleteJob::result, this, &DavItemDeleteJob::davJobFinished); } DavItem DavItemDeleteJob::freshItem() const { - return mFreshItem; + Q_D(const DavItemDeleteJob); + return d->mFreshItem; } int DavItemDeleteJob::freshResponseCode() const { - return mFreshResponseCode; + Q_D(const DavItemDeleteJob); + return d->mFreshResponseCode; } void DavItemDeleteJob::davJobFinished(KJob *job) { + Q_D(DavItemDeleteJob); KIO::DeleteJob *deleteJob = qobject_cast(job); if (deleteJob->error() && deleteJob->error() != KIO::ERR_NO_CONTENT) { @@ -73,7 +88,7 @@ } if (hasConflict()) { - DavItemFetchJob *fetchJob = new DavItemFetchJob(mItem); + DavItemFetchJob *fetchJob = new DavItemFetchJob(d->mItem); connect(fetchJob, &DavItemFetchJob::result, this, &DavItemDeleteJob::conflictingItemFetched); fetchJob->start(); return; @@ -85,11 +100,12 @@ void DavItemDeleteJob::conflictingItemFetched(KJob *job) { + Q_D(DavItemDeleteJob); DavItemFetchJob *fetchJob = qobject_cast(job); - mFreshResponseCode = fetchJob->latestResponseCode(); + d->mFreshResponseCode = fetchJob->latestResponseCode(); if (!job->error()) { - mFreshItem = fetchJob->item(); + d->mFreshItem = fetchJob->item(); } emitResult(); diff --git a/src/common/davitemfetchjob.h b/src/common/davitemfetchjob.h --- a/src/common/davitemfetchjob.h +++ b/src/common/davitemfetchjob.h @@ -26,6 +26,8 @@ #include "davurl.h" namespace KDAV { +class DavItemFetchJobPrivate; + /** * @short A job that fetches a DAV item from the DAV server. */ @@ -54,8 +56,7 @@ private: void davJobFinished(KJob *); - DavUrl mUrl; - DavItem mItem; + Q_DECLARE_PRIVATE(DavItemFetchJob) }; } diff --git a/src/common/davitemfetchjob.cpp b/src/common/davitemfetchjob.cpp --- a/src/common/davitemfetchjob.cpp +++ b/src/common/davitemfetchjob.cpp @@ -17,14 +17,23 @@ */ #include "davitemfetchjob.h" +#include "davjobbase_p.h" #include "davmanager.h" #include "daverror.h" #include #include using namespace KDAV; +namespace KDAV { +class DavItemFetchJobPrivate : public DavJobBasePrivate +{ +public: + DavUrl mUrl; + DavItem mItem; +}; +} static QString etagFromHeaders(const QString &headers) { @@ -41,14 +50,16 @@ } DavItemFetchJob::DavItemFetchJob(const DavItem &item, QObject *parent) - : DavJobBase(parent) - , mItem(item) + : DavJobBase(new DavItemFetchJobPrivate, parent) { + Q_D(DavItemFetchJob); + d->mItem = item; } void DavItemFetchJob::start() { - KIO::StoredTransferJob *job = KIO::storedGet(mItem.url().url(), KIO::Reload, KIO::HideProgressInfo | KIO::DefaultFlags); + Q_D(DavItemFetchJob); + KIO::StoredTransferJob *job = KIO::storedGet(d->mItem.url().url(), KIO::Reload, KIO::HideProgressInfo | KIO::DefaultFlags); job->addMetaData(QStringLiteral("PropagateHttpHeader"), QStringLiteral("true")); // Work around a strange bug in Zimbra (seen at least on CE 5.0.18) : if the user-agent // contains "Mozilla", some strange debug data is displayed in the shared calendars. @@ -62,11 +73,13 @@ DavItem DavItemFetchJob::item() const { - return mItem; + Q_D(const DavItemFetchJob); + return d->mItem; } void DavItemFetchJob::davJobFinished(KJob *job) { + Q_D(DavItemFetchJob); KIO::StoredTransferJob *storedJob = qobject_cast(job); const QString responseCodeStr = storedJob->queryMetaData(QStringLiteral("responsecode")); const int responseCode = responseCodeStr.isEmpty() @@ -82,9 +95,9 @@ setJobError(storedJob->error()); setErrorTextFromDavError(); } else { - mItem.setData(storedJob->data()); - mItem.setContentType(storedJob->queryMetaData(QStringLiteral("content-type"))); - mItem.setEtag(etagFromHeaders(storedJob->queryMetaData(QStringLiteral("HTTP-Headers")))); + d->mItem.setData(storedJob->data()); + d->mItem.setContentType(storedJob->queryMetaData(QStringLiteral("content-type"))); + d->mItem.setEtag(etagFromHeaders(storedJob->queryMetaData(QStringLiteral("HTTP-Headers")))); } emitResult(); diff --git a/src/common/davitemmodifyjob.h b/src/common/davitemmodifyjob.h --- a/src/common/davitemmodifyjob.h +++ b/src/common/davitemmodifyjob.h @@ -26,6 +26,8 @@ #include "davurl.h" namespace KDAV { +class DavItemModifyJobPrivate; + /** * @short A job that modifies a DAV item on the DAV server. */ @@ -68,9 +70,8 @@ void davJobFinished(KJob *); void itemRefreshed(KJob *); void conflictingItemFetched(KJob *); - DavItem mItem; - DavItem mFreshItem; - int mFreshResponseCode; + + Q_DECLARE_PRIVATE(DavItemModifyJob) }; } diff --git a/src/common/davitemmodifyjob.cpp b/src/common/davitemmodifyjob.cpp --- a/src/common/davitemmodifyjob.cpp +++ b/src/common/davitemmodifyjob.cpp @@ -17,30 +17,41 @@ */ #include "davitemmodifyjob.h" +#include "davjobbase_p.h" #include "davitemfetchjob.h" #include "davmanager.h" #include "daverror.h" #include using namespace KDAV; +namespace KDAV { +class DavItemModifyJobPrivate : public DavJobBasePrivate +{ +public: + DavItem mItem; + DavItem mFreshItem; + int mFreshResponseCode = 0; +}; +} DavItemModifyJob::DavItemModifyJob(const DavItem &item, QObject *parent) - : DavJobBase(parent) - , mItem(item) - , mFreshResponseCode(0) + : DavJobBase(new DavItemModifyJobPrivate, parent) { + Q_D(DavItemModifyJob); + d->mItem = item; } void DavItemModifyJob::start() { + Q_D(DavItemModifyJob); QString headers = QStringLiteral("Content-Type: "); - headers += mItem.contentType(); + headers += d->mItem.contentType(); headers += QLatin1String("\r\n"); - headers += QLatin1String("If-Match: ") + mItem.etag(); + headers += QLatin1String("If-Match: ") + d->mItem.etag(); - KIO::StoredTransferJob *job = KIO::storedPut(mItem.data(), itemUrl(), -1, KIO::HideProgressInfo | KIO::DefaultFlags); + KIO::StoredTransferJob *job = KIO::storedPut(d->mItem.data(), itemUrl(), -1, KIO::HideProgressInfo | KIO::DefaultFlags); job->addMetaData(QStringLiteral("PropagateHttpHeader"), QStringLiteral("true")); job->addMetaData(QStringLiteral("customHTTPHeader"), headers); job->addMetaData(QStringLiteral("cookies"), QStringLiteral("none")); @@ -51,26 +62,31 @@ DavItem DavItemModifyJob::item() const { - return mItem; + Q_D(const DavItemModifyJob); + return d->mItem; } DavItem DavItemModifyJob::freshItem() const { - return mFreshItem; + Q_D(const DavItemModifyJob); + return d->mFreshItem; } int DavItemModifyJob::freshResponseCode() const { - return mFreshResponseCode; + Q_D(const DavItemModifyJob); + return d->mFreshResponseCode; } QUrl DavItemModifyJob::itemUrl() const { - return mItem.url().url(); + Q_D(const DavItemModifyJob); + return d->mItem.url().url(); } void DavItemModifyJob::davJobFinished(KJob *job) { + Q_D(DavItemModifyJob); KIO::StoredTransferJob *storedJob = qobject_cast(job); if (storedJob->error()) { @@ -85,7 +101,7 @@ setErrorTextFromDavError(); if (hasConflict()) { - DavItemFetchJob *fetchJob = new DavItemFetchJob(mItem); + DavItemFetchJob *fetchJob = new DavItemFetchJob(d->mItem); connect(fetchJob, &DavItemFetchJob::result, this, &DavItemModifyJob::conflictingItemFetched); fetchJob->start(); } else { @@ -115,31 +131,33 @@ } url.setUserInfo(itemUrl().userInfo()); - mItem.setUrl(DavUrl(url, mItem.url().protocol())); + d->mItem.setUrl(DavUrl(url, d->mItem.url().protocol())); - DavItemFetchJob *fetchJob = new DavItemFetchJob(mItem); + DavItemFetchJob *fetchJob = new DavItemFetchJob(d->mItem); connect(fetchJob, &DavItemFetchJob::result, this, &DavItemModifyJob::itemRefreshed); fetchJob->start(); } void DavItemModifyJob::itemRefreshed(KJob *job) { + Q_D(DavItemModifyJob); if (!job->error()) { DavItemFetchJob *fetchJob = qobject_cast(job); - mItem.setEtag(fetchJob->item().etag()); + d->mItem.setEtag(fetchJob->item().etag()); } else { - mItem.setEtag(QString()); + d->mItem.setEtag(QString()); } emitResult(); } void DavItemModifyJob::conflictingItemFetched(KJob *job) { + Q_D(DavItemModifyJob); DavItemFetchJob *fetchJob = qobject_cast(job); - mFreshResponseCode = fetchJob->latestResponseCode(); + d->mFreshResponseCode = fetchJob->latestResponseCode(); if (!job->error()) { - mFreshItem = fetchJob->item(); + d->mFreshItem = fetchJob->item(); } emitResult(); diff --git a/src/common/davitemsfetchjob.h b/src/common/davitemsfetchjob.h --- a/src/common/davitemsfetchjob.h +++ b/src/common/davitemsfetchjob.h @@ -30,6 +30,8 @@ #include namespace KDAV { +class DavItemsFetchJobPrivate; + /** * @short A job that fetches a list of items from a DAV server using a multiget query. */ @@ -64,9 +66,7 @@ private: void davJobFinished(KJob *); - DavUrl mCollectionUrl; - QStringList mUrls; - QMap mItems; + Q_DECLARE_PRIVATE(DavItemsFetchJob) }; } diff --git a/src/common/davitemsfetchjob.cpp b/src/common/davitemsfetchjob.cpp --- a/src/common/davitemsfetchjob.cpp +++ b/src/common/davitemsfetchjob.cpp @@ -18,6 +18,7 @@ */ #include "davitemsfetchjob.h" +#include "davjobbase_p.h" #include "davmanager.h" #include "davmultigetprotocol.h" @@ -29,47 +30,62 @@ using namespace KDAV; +namespace KDAV { +class DavItemsFetchJobPrivate : public DavJobBasePrivate +{ +public: + DavUrl mCollectionUrl; + QStringList mUrls; + QMap mItems; +}; +} + DavItemsFetchJob::DavItemsFetchJob(const DavUrl &collectionUrl, const QStringList &urls, QObject *parent) - : DavJobBase(parent) - , mCollectionUrl(collectionUrl) - , mUrls(urls) + : DavJobBase(new DavItemsFetchJobPrivate, parent) { + Q_D(DavItemsFetchJob); + d->mCollectionUrl = collectionUrl; + d->mUrls = urls; } void DavItemsFetchJob::start() { + Q_D(DavItemsFetchJob); const DavMultigetProtocol *protocol - = dynamic_cast(DavManager::self()->davProtocol(mCollectionUrl.protocol())); + = dynamic_cast(DavManager::self()->davProtocol(d->mCollectionUrl.protocol())); if (!protocol) { setError(ERR_NO_MULTIGET); setErrorTextFromDavError(); emitResult(); return; } - const QDomDocument report = protocol->itemsReportQuery(mUrls)->buildQuery(); - KIO::DavJob *job = DavManager::self()->createReportJob(mCollectionUrl.url(), report, QStringLiteral("0")); + const QDomDocument report = protocol->itemsReportQuery(d->mUrls)->buildQuery(); + KIO::DavJob *job = DavManager::self()->createReportJob(d->mCollectionUrl.url(), report, QStringLiteral("0")); job->addMetaData(QStringLiteral("PropagateHttpHeader"), QStringLiteral("true")); connect(job, &KIO::DavJob::result, this, &DavItemsFetchJob::davJobFinished); } DavItem::List DavItemsFetchJob::items() const { + Q_D(const DavItemsFetchJob); DavItem::List values; - values.reserve(mItems.size()); - for (const auto &value : qAsConst(mItems)) { + values.reserve(d->mItems.size()); + for (const auto &value : qAsConst(d->mItems)) { values << value; } return values; } DavItem DavItemsFetchJob::item(const QString &url) const { - return mItems.value(url); + Q_D(const DavItemsFetchJob); + return d->mItems.value(url); } void DavItemsFetchJob::davJobFinished(KJob *job) { + Q_D(DavItemsFetchJob); KIO::DavJob *davJob = qobject_cast(job); const QString responseCodeStr = davJob->queryMetaData(QStringLiteral("responsecode")); const int responseCode = responseCodeStr.isEmpty() @@ -89,7 +105,7 @@ } const DavMultigetProtocol *protocol - = static_cast(DavManager::self()->davProtocol(mCollectionUrl.protocol())); + = static_cast(DavManager::self()->davProtocol(d->mCollectionUrl.protocol())); const QDomDocument document = davJob->response(); const QDomElement documentElement = document.documentElement(); @@ -129,8 +145,8 @@ } auto _url = url; - _url.setUserInfo(mCollectionUrl.url().userInfo()); - item.setUrl(DavUrl(_url, mCollectionUrl.protocol())); + _url.setUserInfo(d->mCollectionUrl.url().userInfo()); + item.setUrl(DavUrl(_url, d->mCollectionUrl.protocol())); // extract etag const QDomElement getetagElement = Utils::firstChildElementNS(propElement, QStringLiteral("DAV:"), QStringLiteral("getetag")); @@ -154,7 +170,7 @@ item.setData(data); - mItems.insert(item.url().toDisplayString(), item); + d->mItems.insert(item.url().toDisplayString(), item); responseElement = Utils::nextSiblingElementNS(responseElement, QStringLiteral("DAV:"), QStringLiteral("response")); } diff --git a/src/common/davitemslistjob.h b/src/common/davitemslistjob.h --- a/src/common/davitemslistjob.h +++ b/src/common/davitemslistjob.h @@ -28,11 +28,11 @@ #include -class DavItemsListJobPrivate; namespace KDAV { class EtagCache; class DavUrl; +class DavItemsListJobPrivate; /** * @short A job that lists all DAV items inside a DAV collection. @@ -92,7 +92,7 @@ private: void davJobFinished(KJob *); - std::unique_ptr d; + Q_DECLARE_PRIVATE(DavItemsListJob) }; } diff --git a/src/common/davitemslistjob.cpp b/src/common/davitemslistjob.cpp --- a/src/common/davitemslistjob.cpp +++ b/src/common/davitemslistjob.cpp @@ -17,6 +17,7 @@ */ #include "davitemslistjob.h" +#include "davjobbase_p.h" #include "daverror.h" #include "davmanager.h" @@ -30,11 +31,10 @@ using namespace KDAV; -class DavItemsListJobPrivate +namespace KDAV { +class DavItemsListJobPrivate : public DavJobBasePrivate { public: - DavItemsListJobPrivate(const DavUrl &url, const std::shared_ptr &cache); - DavUrl mUrl; std::shared_ptr mEtagCache; QStringList mMimeTypes; @@ -44,39 +44,36 @@ QSet mSeenUrls; // to prevent events duplication with some servers DavItem::List mChangedItems; QStringList mDeletedItems; - uint mSubJobCount; + uint mSubJobCount = 0; }; - -DavItemsListJobPrivate::DavItemsListJobPrivate(const DavUrl &url, const std::shared_ptr &cache) - : mUrl(url) - , mEtagCache(cache) - , mSubJobCount(0) -{ } DavItemsListJob::DavItemsListJob(const DavUrl &url, const std::shared_ptr &cache, QObject *parent) - : DavJobBase(parent) - , d(std::unique_ptr(new DavItemsListJobPrivate(url, cache))) + : DavJobBase(new DavItemsListJobPrivate, parent) { + Q_D(DavItemsListJob); + d->mUrl = url; + d->mEtagCache = cache; } -DavItemsListJob::~DavItemsListJob() -{ -} +DavItemsListJob::~DavItemsListJob() = default; void DavItemsListJob::setContentMimeTypes(const QStringList &types) { + Q_D(DavItemsListJob); d->mMimeTypes = types; } void DavItemsListJob::setTimeRange(const QString &start, const QString &end) { + Q_D(DavItemsListJob); d->mRangeStart = start; d->mRangeEnd = end; } void DavItemsListJob::start() { + Q_D(DavItemsListJob); const DavProtocolBase *protocol = DavManager::self()->davProtocol(d->mUrl.protocol()); Q_ASSERT(protocol); QVectorIterator it(protocol->itemsQueries()); @@ -120,21 +117,25 @@ DavItem::List DavItemsListJob::items() const { + Q_D(const DavItemsListJob); return d->mItems; } DavItem::List DavItemsListJob::changedItems() const { + Q_D(const DavItemsListJob); return d->mChangedItems; } QStringList DavItemsListJob::deletedItems() const { + Q_D(const DavItemsListJob); return d->mDeletedItems; } void DavItemsListJob::davJobFinished(KJob *job) { + Q_D(DavItemsListJob); KIO::DavJob *davJob = qobject_cast(job); const int responseCode = davJob->queryMetaData(QStringLiteral("responsecode")).isEmpty() ? 0