diff options
Diffstat (limited to 'tdeio/tdeio/davjob.cpp')
-rw-r--r-- | tdeio/tdeio/davjob.cpp | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/tdeio/tdeio/davjob.cpp b/tdeio/tdeio/davjob.cpp new file mode 100644 index 000000000..986e76342 --- /dev/null +++ b/tdeio/tdeio/davjob.cpp @@ -0,0 +1,142 @@ +// -*- c++ -*- +/* This file is part of the KDE libraries + Copyright (C) 2002 Jan-Pascal van Best <janpascal@vanbest.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include <kurl.h> + +#include <tqobject.h> +#include <tqptrlist.h> +#include <tqstring.h> +#include <tqstringlist.h> +#include <tqguardedptr.h> +#include <tqdom.h> + +#include <sys/types.h> +#include <sys/stat.h> + +#include <kdebug.h> +#include <tdeio/jobclasses.h> +#include <tdeio/global.h> +#include <tdeio/http.h> +#include <tdeio/davjob.h> +#include <tdeio/job.h> +#include <tdeio/slaveinterface.h> + +#define KIO_ARGS TQByteArray packedArgs; TQDataStream stream( packedArgs, IO_WriteOnly ); stream + +using namespace TDEIO; + +class DavJob::DavJobPrivate +{ +public: + TQByteArray savedStaticData; + TQByteArray str_response; // replaces the TQString previously used in DavJob itself +}; + +DavJob::DavJob( const KURL& url, int method, const TQString& request, bool showProgressInfo ) + : TransferJob( url, TDEIO::CMD_SPECIAL, TQByteArray(), TQByteArray(), showProgressInfo ) +{ + d = new DavJobPrivate; + // We couldn't set the args when calling the parent constructor, + // so do it now. + TQDataStream stream( m_packedArgs, IO_WriteOnly ); + stream << (int) 7 << url << method; + // Same for static data + if ( ! request.isEmpty() && ! request.isNull() ) { + staticData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" + request.utf8(); + staticData.truncate( staticData.size() - 1 ); + d->savedStaticData = staticData.copy(); + } +} + +void DavJob::slotData( const TQByteArray& data ) +{ + if(m_redirectionURL.isEmpty() || !m_redirectionURL.isValid() || m_error) { + unsigned int oldSize = d->str_response.size(); + d->str_response.resize( oldSize + data.size() ); + memcpy( d->str_response.data() + oldSize, data.data(), data.size() ); + } +} + +void DavJob::slotFinished() +{ + // kdDebug(7113) << "DavJob::slotFinished()" << endl; + // kdDebug(7113) << d->str_response << endl; + if (!m_redirectionURL.isEmpty() && m_redirectionURL.isValid() && (m_command == CMD_SPECIAL)) { + TQDataStream istream( m_packedArgs, IO_ReadOnly ); + int s_cmd, s_method; + KURL s_url; + istream >> s_cmd; + istream >> s_url; + istream >> s_method; + // PROPFIND + if ( (s_cmd == 7) && (s_method == (int)TDEIO::DAV_PROPFIND) ) { + m_packedArgs.truncate(0); + TQDataStream stream( m_packedArgs, IO_WriteOnly ); + stream << (int)7 << m_redirectionURL << (int)TDEIO::DAV_PROPFIND; + } + } else if ( ! m_response.setContent( d->str_response, true ) ) { + // An error occurred parsing the XML response + TQDomElement root = m_response.createElementNS( "DAV:", "error-report" ); + m_response.appendChild( root ); + + TQDomElement el = m_response.createElementNS( "DAV:", "offending-response" ); + TQDomText textnode = m_response.createTextNode( d->str_response ); + el.appendChild( textnode ); + root.appendChild( el ); + delete d; // Should be in virtual destructor + d = 0; + } else { + delete d; // Should be in virtual destructor + d = 0; + } + // kdDebug(7113) << m_response.toString() << endl; + TransferJob::slotFinished(); + if( d ) staticData = d->savedStaticData.copy(); // Need to send DAV request to this host too +} + +/* Convenience methods */ + +// KDE 4: Make it const TQString & +DavJob* TDEIO::davPropFind( const KURL& url, const TQDomDocument& properties, TQString depth, bool showProgressInfo ) +{ + DavJob *job = new DavJob( url, (int) TDEIO::DAV_PROPFIND, properties.toString(), showProgressInfo ); + job->addMetaData( "davDepth", depth ); + return job; +} + + +DavJob* TDEIO::davPropPatch( const KURL& url, const TQDomDocument& properties, bool showProgressInfo ) +{ + return new DavJob( url, (int) TDEIO::DAV_PROPPATCH, properties.toString(), showProgressInfo ); +} + +DavJob* TDEIO::davSearch( const KURL& url, const TQString& nsURI, const TQString& qName, const TQString& query, bool showProgressInfo ) +{ + TQDomDocument doc; + TQDomElement searchrequest = doc.createElementNS( "DAV:", "searchrequest" ); + TQDomElement searchelement = doc.createElementNS( nsURI, qName ); + TQDomText text = doc.createTextNode( query ); + searchelement.appendChild( text ); + searchrequest.appendChild( searchelement ); + doc.appendChild( searchrequest ); + return new DavJob( url, TDEIO::DAV_SEARCH, doc.toString(), showProgressInfo ); +} + +#include "davjob.moc" |