1 /*
2     This file is part of oxaccess.
3 
4     SPDX-FileCopyrightText: 2009 Tobias Koenig <tokoe@kde.org>
5 
6     SPDX-License-Identifier: LGPL-2.0-or-later
7 */
8 
9 #include "objectmovejob.h"
10 
11 #include "davmanager.h"
12 #include "davutils.h"
13 #include "objectutils.h"
14 #include "oxutils.h"
15 
16 #include <KIO/DavJob>
17 #include <QDomDocument>
18 
19 using namespace OXA;
20 
ObjectMoveJob(const Object & object,const Folder & destinationFolder,QObject * parent)21 ObjectMoveJob::ObjectMoveJob(const Object &object, const Folder &destinationFolder, QObject *parent)
22     : KJob(parent)
23     , mObject(object)
24     , mDestinationFolder(destinationFolder)
25 {
26 }
27 
start()28 void ObjectMoveJob::start()
29 {
30     QDomDocument document;
31     QDomElement propertyupdate = DAVUtils::addDavElement(document, document, QStringLiteral("propertyupdate"));
32     QDomElement set = DAVUtils::addDavElement(document, propertyupdate, QStringLiteral("set"));
33     QDomElement prop = DAVUtils::addDavElement(document, set, QStringLiteral("prop"));
34     DAVUtils::addOxElement(document, prop, QStringLiteral("object_id"), OXUtils::writeNumber(mObject.objectId()));
35     DAVUtils::addOxElement(document, prop, QStringLiteral("folder_id"), OXUtils::writeNumber(mObject.folderId()));
36     DAVUtils::addOxElement(document, prop, QStringLiteral("last_modified"), OXUtils::writeString(mObject.lastModified()));
37     DAVUtils::addOxElement(document, prop, QStringLiteral("folder"), OXUtils::writeNumber(mDestinationFolder.objectId()));
38 
39     const QString path = ObjectUtils::davPath(mObject.module());
40 
41     KIO::DavJob *job = DavManager::self()->createPatchJob(path, document);
42     connect(job, &KIO::DavJob::result, this, &ObjectMoveJob::davJobFinished);
43 }
44 
object() const45 Object ObjectMoveJob::object() const
46 {
47     return mObject;
48 }
49 
davJobFinished(KJob * job)50 void ObjectMoveJob::davJobFinished(KJob *job)
51 {
52     if (job->error()) {
53         setError(job->error());
54         setErrorText(job->errorText());
55         emitResult();
56         return;
57     }
58 
59     auto davJob = qobject_cast<KIO::DavJob *>(job);
60 
61     const QByteArray ba = davJob->responseData();
62     QDomDocument document;
63     document.setContent(ba);
64 
65     QString errorText, errorStatus;
66     if (DAVUtils::davErrorOccurred(document, errorText, errorStatus)) {
67         setError(UserDefinedError);
68         setErrorText(errorText);
69         emitResult();
70         return;
71     }
72 
73     QDomElement multistatus = document.documentElement();
74     QDomElement response = multistatus.firstChildElement(QStringLiteral("response"));
75     const QDomNodeList props = response.elementsByTagName(QStringLiteral("prop"));
76     const QDomElement prop = props.at(0).toElement();
77 
78     QDomElement element = prop.firstChildElement();
79     while (!element.isNull()) {
80         if (element.tagName() == QLatin1String("last_modified")) {
81             mObject.setLastModified(OXUtils::readString(element.text()));
82         }
83 
84         element = element.nextSiblingElement();
85     }
86 
87     emitResult();
88 }
89