/* This file is part of tdepim. Copyright (c) 2004 Cornelius Schumacher Copyright (c) 2004 Till Adam Copyright (c) 2005 Reinhold Kainhofer 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 "groupdavglobals.h" #include "groupwaredataadaptor.h" #include #include #include #include #include #include #include #include #include #include #include TQString GroupDavGlobals::extractFingerprint( TDEIO::Job *job, const TQString &/*jobData*/ ) { const TQString& headers = job->queryMetaData( "HTTP-Headers" ); return WebdavHandler::getEtagFromHeaders( headers ); } KPIM::FolderLister::ContentType GroupDavGlobals::getContentType( const TQDomElement &prop ) { TQDomElement ctype = prop.namedItem("getcontenttype").toElement(); if ( ctype.isNull() ) return KPIM::FolderLister::Unknown; const TQString &type = ctype.text(); kdDebug()<<"Found content type: "<... TQDomElement e = folderNode.namedItem("resourcetype").toElement(); if ( !e.namedItem( "collection" ).isNull() ) return true; else return false; } TDEIO::Job *GroupDavGlobals::createListFoldersJob( const KURL &url ) { TQDomDocument doc; TQDomElement root = WebdavHandler::addDavElement( doc, doc, "d:propfind" ); TQDomElement prop = WebdavHandler::addElement( doc, root, "d:prop" ); WebdavHandler::addElement( doc, prop, "d:displayname" ); WebdavHandler::addElement( doc, prop, "d:resourcetype" ); // WebdavHandler::addElement( doc, prop, "d:hassubs" ); kdDebug(7000) << "props: " << doc.toString() << endl; return TDEIO::davPropFind( url, doc, "1", false ); } TDEIO::TransferJob *GroupDavGlobals::createListItemsJob( const KURL &url ) { TQDomDocument doc; TQDomElement root = WebdavHandler::addDavElement( doc, doc, "propfind" ); TQDomElement prop = WebdavHandler::addDavElement( doc, root, "prop" ); WebdavHandler::addDavElement( doc, prop, "getetag" ); // WebdavHandler::addDavElement( doc, prop, "getcontenttype" ); kdDebug(5800) << "props = "<< doc.toString() << endl; TDEIO::TransferJob *job = TDEIO::davPropFind( url, doc, "1", false ); if ( job ) { job->addMetaData( "accept", "text/xml" ); job->addMetaData( "customHTTPHeader", "accept-encoding: " ); } return job; } TDEIO::TransferJob *GroupDavGlobals::createDownloadJob( KPIM::GroupwareDataAdaptor *adaptor, const KURL &url, KPIM::FolderLister::ContentType /*ctype*/ ) { kdDebug()<<"GroupDavGlobals::createDownloadJob, url="<mimeType(); job->addMetaData( "accept", mt ); } job->addMetaData( "PropagateHttpHeader", "true" ); return job; } TDEIO::Job *GroupDavGlobals::createRemoveJob( KPIM::GroupwareDataAdaptor *adaptor, const KURL &/*uploadurl*/, KPIM::GroupwareUploadItem *deletedItem ) { if ( !deletedItem ) return 0; //kdDebug(7000) << "Delete: " << endl << format.toICalString(*it) << endl; KURL url( deletedItem->url() ); if ( adaptor ) { adaptor->adaptUploadUrl( url ); } TDEIO::Job *delJob = 0; if ( !url.isEmpty() ) { kdDebug(5700) << "Delete: " << url.url() << endl; delJob = TDEIO::file_delete( url, false ); } if ( delJob && adaptor && adaptor->idMapper() ) { kdDebug(5800 ) << "Adding If-Match metadata: " << adaptor->idMapper()->fingerprint( deletedItem->uid() ) << endl; delJob->addMetaData( "customHTTPHeader", "If-Match: " + adaptor->idMapper()->fingerprint( deletedItem->uid() ) ); } return delJob; /* TQStringList urls; KPIM::GroupwareUploadItem::List::const_iterator it; kdDebug(5800) << " GroupDavGlobals::createRemoveJob, BaseURL="<url() ); if ( adaptor ) { adaptor->adaptUploadUrl( url ); }*/ /* KURL url( uploadurl ); url.setPath( (*it)->url().path() ); if ( !(*it)->url().isEmpty() )*/ /* if ( !url.isEmpty() ) { kdDebug() << "Deleting item at "<< url.url() << endl; urls << url.url(); } kdDebug(5700) << "Delete (Mod) : " << url.url() << endl; } return TDEIO::file_del( urls, false, false );*/ } bool GroupDavGlobals::interpretListItemsJob( KPIM::GroupwareDataAdaptor *adaptor, TDEIO::Job *job ) { TDEIO::DavJob *davjob = dynamic_cast(job); if ( !davjob ) { return false; } TQDomDocument doc = davjob->response(); kdDebug(7000) << " Doc: " << doc.toString() << endl; kdDebug(7000) << " IdMapper: " << adaptor->idMapper()->asString() << endl; TQDomElement docElem = doc.documentElement(); TQDomNode n = docElem.firstChild(); while( !n.isNull() ) { TQDomElement e = n.toElement(); // try to convert the node to an element. n = n.nextSibling(); if ( e.isNull() ) continue; const KURL &entry( e.namedItem("href").toElement().text() ); TQDomElement propstat = e.namedItem("propstat").toElement(); if ( propstat.isNull() ) continue; TQDomElement prop = propstat.namedItem( "prop" ).toElement(); if ( prop.isNull() ) continue; TQDomElement elem = prop.namedItem("getetag").toElement(); const TQString &newFingerprint = elem.text(); if ( elem.isNull() || newFingerprint.isEmpty() ) continue; KPIM::FolderLister::ContentType type = getContentType( prop ); adaptor->processDownloadListItem( entry, newFingerprint, type ); } return true; } bool GroupDavGlobals::interpretCalendarDownloadItemsJob( KCal::CalendarAdaptor *adaptor, TDEIO::Job *job, const TQString &jobData ) { kdDebug(5800) << "GroupDavGlobals::interpretCalendarDownloadItemsJob, iCalendar=" << endl; kdDebug(5800) << jobData << endl; if ( !adaptor || !job ) return false; KCal::CalendarLocal calendar( TQString::fromLatin1("UTC") ); KCal::ICalFormat ical; calendar.setTimeZoneId( adaptor->resource()->timeZoneId() ); KCal::Incidence::List incidences; if ( ical.fromString( &calendar, jobData ) ) { KCal::Incidence::List raw = calendar.rawIncidences(); KCal::Incidence::List::Iterator it = raw.begin(); if ( raw.count() != 1 ) { kdError() << "Parsed iCalendar does not contain exactly one event." << endl; return false; } KCal::Incidence *inc = (raw.front())->clone(); if ( !inc ) return false; TDEIO::SimpleJob *sjob = dynamic_cast(job); KURL remoteId; if ( sjob ) remoteId = sjob->url(); TQString fingerprint = extractFingerprint( job, jobData ); adaptor->calendarItemDownloaded( inc, inc->uid(), remoteId, fingerprint, remoteId.prettyURL() ); return true; } else { kdError() << "Unable to parse iCalendar" << endl; } return false; } bool GroupDavGlobals::interpretAddressBookDownloadItemsJob( TDEABC::AddressBookAdaptor *adaptor, TDEIO::Job *job, const TQString &jobData ) { kdDebug(5800) << "GroupDavGlobals::interpretAddressBookDownloadItemsJob, vCard=" << endl; kdDebug(5800) << jobData << endl; if ( !adaptor || !job ) return false; TDEABC::VCardConverter conv; TDEABC::Addressee::List addrs( conv.parseVCards( jobData ) ); if ( addrs.count() != 1 ) { kdError() << "Parsed vCard does not contain exactly one addressee." << endl; return false; } TDEABC::Addressee a = addrs.first(); TDEIO::SimpleJob *sjob = dynamic_cast(job); KURL remoteId; if ( sjob ) remoteId = sjob->url(); TQString fingerprint = extractFingerprint( job, jobData ); adaptor->addressbookItemDownloaded( a, a.uid(), remoteId, fingerprint, remoteId.prettyURL() ); return true; }