KIO

davjob.cpp
1 // -*- c++ -*-
2 /*
3  This file is part of the KDE libraries
4  SPDX-FileCopyrightText: 2002 Jan-Pascal van Best <[email protected]>
5 
6  SPDX-License-Identifier: LGPL-2.0-or-later
7 */
8 
9 #include "davjob.h"
10 
11 #include <QDataStream>
12 #include <QDomDocument>
13 
14 #include "httpmethod_p.h"
15 
16 #include "job.h"
17 #include "job_p.h"
18 #include "jobclasses.h"
19 
20 using namespace KIO;
21 
22 /** @internal */
23 class KIO::DavJobPrivate : public KIO::TransferJobPrivate
24 {
25 public:
26  explicit DavJobPrivate(const QUrl &url)
27  : TransferJobPrivate(url, KIO::CMD_SPECIAL, QByteArray(), QByteArray())
28  {
29  }
30  QByteArray savedStaticData;
31  QByteArray str_response;
32 #if KIOCORE_BUILD_DEPRECATED_SINCE(5, 86)
33  QDomDocument m_response;
34 #endif
35  // TransferJob *m_subJob;
36  // bool m_suspended;
37 
38  Q_DECLARE_PUBLIC(DavJob)
39 
40  static inline DavJob *newJob(const QUrl &url, int method, const QString &request, JobFlags flags)
41  {
42  DavJob *job = new DavJob(*new DavJobPrivate(url), method, request);
44  if (!(flags & HideProgressInfo)) {
46  }
47  return job;
48  }
49 };
50 
51 DavJob::DavJob(DavJobPrivate &dd, int method, const QString &request)
52  : TransferJob(dd)
53 {
54  // We couldn't set the args when calling the parent constructor,
55  // so do it now.
56  Q_D(DavJob);
57  QDataStream stream(&d->m_packedArgs, QIODevice::WriteOnly);
58  stream << (int)7 << d->m_url << method;
59  // Same for static data
60  if (!request.isEmpty()) {
61  d->staticData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" + request.toUtf8();
62  d->staticData.chop(1);
63  d->savedStaticData = d->staticData;
64  stream << static_cast<qint64>(d->staticData.size());
65  } else {
66  stream << static_cast<qint64>(-1);
67  }
68 }
69 
71 {
72  return d_func()->str_response;
73 }
74 
75 #if KIOCORE_BUILD_DEPRECATED_SINCE(5, 86)
77 {
78  return d_func()->m_response;
79 }
80 #endif
81 
82 void DavJob::slotData(const QByteArray &data)
83 {
84  Q_D(DavJob);
85  if (d->m_redirectionURL.isEmpty() || !d->m_redirectionURL.isValid() || error()) {
86  unsigned int oldSize = d->str_response.size();
87  d->str_response.resize(oldSize + data.size());
88  memcpy(d->str_response.data() + oldSize, data.data(), data.size());
89  }
90 }
91 
92 void DavJob::slotFinished()
93 {
94  Q_D(DavJob);
95  // qDebug() << d->str_response;
96  if (!d->m_redirectionURL.isEmpty() && d->m_redirectionURL.isValid() && (d->m_command == CMD_SPECIAL)) {
97  QDataStream istream(d->m_packedArgs);
98  int s_cmd;
99  int s_method;
100  qint64 s_size;
101  QUrl s_url;
102  istream >> s_cmd;
103  istream >> s_url;
104  istream >> s_method;
105  istream >> s_size;
106  // PROPFIND
107  if ((s_cmd == 7) && (s_method == (int)KIO::DAV_PROPFIND)) {
108  d->m_packedArgs.truncate(0);
109  QDataStream stream(&d->m_packedArgs, QIODevice::WriteOnly);
110  stream << (int)7 << d->m_redirectionURL << (int)KIO::DAV_PROPFIND << s_size;
111  }
112  }
113 #if KIOCORE_BUILD_DEPRECATED_SINCE(5, 86)
114  else if (!d->m_response.setContent(d->str_response, true)) {
115  // An error occurred parsing the XML response
116  QDomElement root = d->m_response.createElementNS(QStringLiteral("DAV:"), QStringLiteral("error-report"));
117  d->m_response.appendChild(root);
118 
119  QDomElement el = d->m_response.createElementNS(QStringLiteral("DAV:"), QStringLiteral("offending-response"));
120  QDomText textnode = d->m_response.createTextNode(QString::fromUtf8(d->str_response));
121  el.appendChild(textnode);
122  root.appendChild(el);
123  }
124  // qDebug() << d->m_response.toString();
125 #endif
126  TransferJob::slotFinished();
127  d->staticData = d->savedStaticData; // Need to send DAV request to this host too
128 }
129 
130 /* Convenience methods */
131 DavJob *KIO::davPropFind(const QUrl &url, const QString &properties, const QString &depth, JobFlags flags)
132 {
133  DavJob *job = DavJobPrivate::newJob(url, (int)KIO::DAV_PROPFIND, properties, flags);
134  job->addMetaData(QStringLiteral("davDepth"), depth);
135  return job;
136 }
137 
138 DavJob *KIO::davPropPatch(const QUrl &url, const QString &properties, JobFlags flags)
139 {
140  return DavJobPrivate::newJob(url, (int)KIO::DAV_PROPPATCH, properties, flags);
141 }
142 
143 #if KIOCORE_BUILD_DEPRECATED_SINCE(5, 84)
144 DavJob *KIO::davPropFind(const QUrl &url, const QDomDocument &properties, const QString &depth, JobFlags flags)
145 {
146  return davPropFind(url, properties.toString(), depth, flags);
147 }
148 #endif
149 
150 #if KIOCORE_BUILD_DEPRECATED_SINCE(5, 84)
151 DavJob *KIO::davPropPatch(const QUrl &url, const QDomDocument &properties, JobFlags flags)
152 {
153  return davPropPatch(url, properties.toString(), flags);
154 }
155 #endif
156 
157 DavJob *KIO::davSearch(const QUrl &url, const QString &nsURI, const QString &qName, const QString &query, JobFlags flags)
158 {
159  QDomDocument doc;
160  QDomElement searchrequest = doc.createElementNS(QStringLiteral("DAV:"), QStringLiteral("searchrequest"));
161  QDomElement searchelement = doc.createElementNS(nsURI, qName);
162  QDomText text = doc.createTextNode(query);
163  searchelement.appendChild(text);
164  searchrequest.appendChild(searchelement);
165  doc.appendChild(searchrequest);
166  return DavJobPrivate::newJob(url, KIO::DAV_SEARCH, doc.toString(), flags);
167 }
168 
169 DavJob *KIO::davReport(const QUrl &url, const QString &report, const QString &depth, JobFlags flags)
170 {
171  DavJob *job = DavJobPrivate::newJob(url, (int)KIO::DAV_REPORT, report, flags);
172  job->addMetaData(QStringLiteral("davDepth"), depth);
173  return job;
174 }
QString toString(int indent) const const
virtual void registerJob(KJob *job)
QString fromUtf8(const char *str, int size)
QDomElement createElementNS(const QString &nsURI, const QString &qName)
QDomText createTextNode(const QString &value)
void addMetaData(const QString &key, const QString &value)
Add key/value pair to the meta data that is sent to the worker.
Definition: job.cpp:228
KIOCORE_EXPORT DavJob * davSearch(const QUrl &url, const QString &nsURI, const QString &qName, const QString &query, JobFlags flags=DefaultFlags)
Creates a new DavJob that issues a SEARCH command.
Definition: davjob.cpp:157
QDomDocument & response()
Returns the response as a QDomDocument.
Definition: davjob.cpp:76
KIOCORE_EXPORT KJobTrackerInterface * getJobTracker()
Returns the job tracker to be used by all KIO jobs (in which HideProgressInfo is not set)
Definition: jobtracker.cpp:14
void chop(int n)
bool isEmpty() const const
QByteArray toUtf8() const const
KIOCORE_EXPORT KJobUiDelegate * createDefaultJobUiDelegate()
Convenience method: use default factory, if there's one, to create a delegate and return it.
QByteArray responseData() const
Returns the reponse data.
Definition: davjob.cpp:70
KIOCORE_EXPORT DavJob * davReport(const QUrl &url, const QString &report, const QString &depth, JobFlags flags=DefaultFlags)
Creates a new DavJob that issues a REPORT command.
Definition: davjob.cpp:169
KIOCORE_EXPORT DavJob * davPropFind(const QUrl &url, const QString &properties, const QString &depth, JobFlags flags=DefaultFlags)
Creates a new DavJob that issues a PROPFIND command.
Definition: davjob.cpp:131
QDomNode appendChild(const QDomNode &newChild)
void setUiDelegate(KJobUiDelegate *delegate)
A namespace for KIO globals.
@ HideProgressInfo
Hide progress information dialog, i.e. don't show a GUI.
Definition: job_base.h:275
int error() const
void data(KIO::Job *job, const QByteArray &data)
Data from the worker has arrived.
KIOCORE_EXPORT DavJob * davPropPatch(const QUrl &url, const QString &properties, JobFlags flags=DefaultFlags)
Creates a new DavJob that issues a PROPPATCH command.
Definition: davjob.cpp:138
Q_D(Todo)
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon May 8 2023 03:54:42 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.