Libkdav2

davitemmodifyjob.cpp
1/*
2 Copyright (c) 2010 Tobias Koenig <tokoe@kde.org>
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17*/
18
19#include "davitemmodifyjob.h"
20
21#include "davitemfetchjob.h"
22#include "davmanager.h"
23#include "daverror.h"
24#include "davjob.h"
25
26using namespace KDAV2;
27
29 : DavJobBase(parent), mItem(item), mFreshResponseCode(0)
30{
31}
32
34{
35 auto job = DavManager::self()->createModifyJob(mItem.data(), itemUrl(), mItem.contentType().toUtf8(), mItem.etag().toUtf8());
36 connect(job, &DavJob::result, this, &DavItemModifyJob::davJobFinished);
37}
38
40{
41 return mItem;
42}
43
45{
46 return mFreshItem;
47}
48
50{
51 return mFreshResponseCode;
52}
53
54QUrl DavItemModifyJob::itemUrl() const
55{
56 return mItem.url().url();
57}
58
59void DavItemModifyJob::davJobFinished(KJob *job)
60{
61 auto storedJob = static_cast<DavJob*>(job);
62
63 if (storedJob->error()) {
64 setErrorFromJob(storedJob, ERR_ITEMMODIFY);
65
66 if (hasConflict()) {
67 DavItemFetchJob *fetchJob = new DavItemFetchJob(mItem);
68 connect(fetchJob, &DavItemFetchJob::result, this, &DavItemModifyJob::conflictingItemFetched);
69 fetchJob->start();
70 } else {
71 emitResult();
72 }
73
74 return;
75 }
76
77 const auto location = storedJob->getLocationHeader();
78 QUrl url;
79 if (location.isEmpty()) {
80 url = storedJob->url();
81 } else if (location.startsWith(QLatin1Char('/'))) {
82 url = storedJob->url();
83 url.setPath(location, QUrl::TolerantMode);
84 } else {
85 url = QUrl::fromUserInput(location);
86 }
87
88 url.setUserInfo(itemUrl().userInfo());
89 mItem.setUrl(DavUrl(url, mItem.url().protocol()));
90
91 DavItemFetchJob *fetchJob = new DavItemFetchJob(mItem);
92 connect(fetchJob, &DavItemFetchJob::result, this, &DavItemModifyJob::itemRefreshed);
93 fetchJob->start();
94}
95
96void DavItemModifyJob::itemRefreshed(KJob *job)
97{
98 if (!job->error()) {
99 DavItemFetchJob *fetchJob = qobject_cast<DavItemFetchJob *>(job);
100 mItem.setEtag(fetchJob->item().etag());
101 } else {
102 mItem.setEtag(QString());
103 }
104 emitResult();
105}
106
107void DavItemModifyJob::conflictingItemFetched(KJob *job)
108{
109 DavItemFetchJob *fetchJob = qobject_cast<DavItemFetchJob *>(job);
110 mFreshResponseCode = fetchJob->latestHttpStatusCode();
111
112 if (!job->error()) {
113 mFreshItem = fetchJob->item();
114 }
115
116 emitResult();
117}
118
A job that fetches a DAV item from the DAV server.
DavItem item() const
Returns the fetched item including current etag information.
void start() override
Starts the job.
DavItem item() const
Returns the modified item including the updated etag information.
DavItemModifyJob(const DavItem &item, QObject *parent=nullptr)
Creates a new dav item modify job.
void start() override
Starts the job.
int freshResponseCode() const
Returns the http response code we got when fetching the fresh item.
DavItem freshItem() const
Returns the item that triggered the conflict, if any.
A helper class to store information about DAV resources.
Definition davitem.h:52
DavUrl url() const
Returns the url that identifies the item.
Definition davitem.cpp:84
QString etag() const
Returns the etag of the item.
Definition davitem.cpp:114
void setErrorFromJob(DavJob *, ErrorNumber jobErrorCode=ERR_PROBLEM_WITH_REQUEST)
Set the error of this job from a failed DavJob (executed by this job).
bool hasConflict() const
Check if the job failed because of a conflict.
unsigned int latestHttpStatusCode() const
Get the latest http status code.
DavJob * createModifyJob(const QByteArray &data, const QUrl &url, const QByteArray &contentType, const QByteArray &etag)
Returns a preconfigured DAV PUT job with a If-Match header, that matches the.
static DavManager * self()
Returns the global instance of the DAV manager.
QUrl url() const
Returns the url that identifies the DAV object.
Definition davurl.cpp:41
void emitResult()
int error() const
void result(KJob *job)
QVariant location(const QVariant &res)
QObject(QObject *parent)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QObject * parent() const const
T qobject_cast(QObject *object)
TolerantMode
QUrl fromUserInput(const QString &userInput, const QString &workingDirectory, UserInputResolutionOptions options)
void setPath(const QString &path, ParsingMode mode)
void setUserInfo(const QString &userInfo, ParsingMode mode)
QString url(FormattingOptions options) const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Jan 24 2025 11:49:52 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.