void DndFactoryTest::testPasteTodo() { MemoryCalendar::Ptr calendar( new MemoryCalendar( QString() ) ); DndFactory factory( calendar ); Todo::Ptr todo( new Todo() ); todo->setSummary( QLatin1String( "Summary 1" ) ); todo->setDtDue( KDateTime( QDate( 2010, 8, 9 ) ) ); Incidence::List incidencesToPaste; incidencesToPaste.append( todo ); QVERIFY( factory.copyIncidences( incidencesToPaste ) ); const KDateTime newDateTime( QDate( 2011, 1, 1 ), QTime( 10, 10 ) ); Incidence::List pastedIncidences = factory.pasteIncidences( newDateTime ); QVERIFY( pastedIncidences.size() == 1 ); Incidence::Ptr incidence = pastedIncidences.first(); QVERIFY( incidence->type() == Incidence::TypeTodo ); // check if a new uid was generated. QVERIFY( incidence->uid() != todo->uid() ); Todo::Ptr pastedTodo = incidence.staticCast<Todo>(); QVERIFY( pastedTodo->dtDue() == newDateTime ); QVERIFY( pastedTodo->summary() == todo->summary() ); }
void DndFactoryTest::testPasteAllDayEvent2() { MemoryCalendar::Ptr calendar( new MemoryCalendar( QString() ) ); DndFactory factory( calendar ); Event::Ptr allDayEvent( new Event() ); allDayEvent->setSummary( QLatin1String( "Summary 2" ) ); allDayEvent->setDtStart( KDateTime( QDate( 2010, 8, 8 ) ) ); allDayEvent->setDtEnd( KDateTime( QDate( 2010, 8, 9 ) ) ); const QString originalUid = allDayEvent->uid(); Incidence::List incidencesToPaste; incidencesToPaste.append( allDayEvent ); QVERIFY( factory.copyIncidences( incidencesToPaste ) ); const KDateTime newDateTime( QDate( 2011, 1, 1 ) ); const uint originalLength = allDayEvent->dtStart().secsTo( allDayEvent->dtEnd() ); // paste at the new time Incidence::List pastedIncidences = factory.pasteIncidences( newDateTime ); // we only copied one incidence QVERIFY( pastedIncidences.size() == 1 ); Incidence::Ptr incidence = pastedIncidences.first(); QVERIFY( incidence->type() == Incidence::TypeEvent ); // check if a new uid was generated. QVERIFY( incidence->uid() != originalUid ); // the new dateTime didn't have time component QVERIFY( incidence->allDay() ); Event::Ptr pastedEvent = incidence.staticCast<Event>(); const uint newLength = pastedEvent->dtStart().secsTo( pastedEvent->dtEnd() ); kDebug() << "originalLength was " << originalLength << "; and newLength is " << newLength << "; old dtStart was " << allDayEvent->dtStart() << " and old dtEnd was " << allDayEvent->dtEnd() << endl << "; new dtStart is " << pastedEvent->dtStart() << " and new dtEnd is " << pastedEvent->dtEnd(); QVERIFY( originalLength == newLength ); QVERIFY( pastedEvent->dtStart() == newDateTime ); QVERIFY( pastedEvent->summary() == allDayEvent->summary() ); }
Incidence::Ptr DndFactory::pasteIncidence( const KDateTime &newDateTime, const QFlags<PasteFlag> &pasteOptions ) { QClipboard *clipboard = QApplication::clipboard(); MemoryCalendar::Ptr calendar( createDropCalendar( clipboard->mimeData() ) ); if ( !calendar ) { kDebug() << "Can't parse clipboard"; return Incidence::Ptr(); } Incidence::List incidenceList = calendar->incidences(); Incidence::Ptr incidence = incidenceList.isEmpty() ? Incidence::Ptr() : incidenceList.first(); return d->pasteIncidence( incidence, newDateTime, pasteOptions ); }
Incidence *DndFactory::pasteIncidence( const QDate &newDate, const QTime *newTime ) { QClipboard *cb = QApplication::clipboard(); Calendar *cal = createDropCalendar( cb->mimeData() ); if ( !cal ) { kDebug() << "Can't parse clipboard"; return 0; } Incidence::List incList = cal->incidences(); Incidence *inc = incList.isEmpty() ? 0 : incList.first(); Incidence *newInc = d->pasteIncidence( inc, newDate, newTime ); newInc->setRelatedTo( 0 ); return newInc; }
void DndFactoryTest::testPasteAllDayEvent() { MemoryCalendar::Ptr calendar( new MemoryCalendar( QString() ) ); DndFactory factory( calendar ); Event::Ptr allDayEvent( new Event() ); allDayEvent->setSummary( QLatin1String( "Summary 1" ) ); allDayEvent->setDtStart( KDateTime( QDate( 2010, 8, 8 ) ) ); allDayEvent->setDtEnd( KDateTime( QDate( 2010, 8, 9 ) ) ); const QString originalUid = allDayEvent->uid(); const bool originalIsAllDay = allDayEvent->allDay(); Incidence::List incidencesToPaste; incidencesToPaste.append( allDayEvent ); QVERIFY( factory.copyIncidences( incidencesToPaste ) ); Incidence::List pastedIncidences = factory.pasteIncidences(); QVERIFY( pastedIncidences.size() == 1 ); Incidence::Ptr incidence = pastedIncidences.first(); QVERIFY( incidence->type() == Incidence::TypeEvent ); // check if a new uid was generated. QVERIFY( incidence->uid() != originalUid ); // we passed an invalid KDateTime to pasteIncidences() so dates don't change. QVERIFY( incidence->allDay() == originalIsAllDay ); Event::Ptr pastedEvent = incidence.staticCast<Event>(); QVERIFY( pastedEvent->dtStart() == allDayEvent->dtStart() ); QVERIFY( pastedEvent->dtEnd() == allDayEvent->dtEnd() ); QVERIFY( pastedEvent->summary() == allDayEvent->summary() ); }
void KCalResourceSlox::uploadIncidences() { QDomDocument doc; QDomElement ms = WebdavHandler::addDavElement( doc, doc, "multistatus" ); QDomElement pu = WebdavHandler::addDavElement( doc, ms, "propertyupdate" ); QDomElement set = WebdavHandler::addElement( doc, pu, "D:set" ); QDomElement prop = WebdavHandler::addElement( doc, set, "D:prop" ); mUploadIsDelete = false; Incidence::List added = addedIncidences(); Incidence::List changed = changedIncidences(); Incidence::List deleted = deletedIncidences(); if ( !added.isEmpty() ) { mUploadedIncidence = added.first(); } else if ( !changed.isEmpty() ) { mUploadedIncidence = changed.first(); } else if ( !deleted.isEmpty() ) { mUploadedIncidence = deleted.first(); mUploadIsDelete = true; } else { mUploadedIncidence = 0; kDebug() << "FINISHED"; emit resourceSaved( this ); return; } // Don't try to upload recurring incidences as long as the resource doesn't // correctly write them in order to avoid corrupting data on the server. // FIXME: Remove when recurrences are correctly written. if ( mUploadedIncidence->recurs() && type() == "slox" ) { clearChange( mUploadedIncidence ); uploadIncidences(); return; } KUrl url = mPrefs->url(); QString sloxId = mUploadedIncidence->customProperty( "SLOX", "ID" ); if ( !sloxId.isEmpty() ) { WebdavHandler::addSloxElement( this, doc, prop, fieldName( ObjectId ), sloxId ); } else { if ( mUploadIsDelete ) { kError() << "Incidence to delete doesn't have a SLOX id"; clearChange( mUploadedIncidence ); uploadIncidences(); return; } } WebdavHandler::addSloxElement( this, doc, prop, fieldName( ClientId ), mUploadedIncidence->uid() ); if ( type() == "ox" ) { const QString lastModified = mUploadedIncidence->customProperty( "SLOX", "LastModified" ); WebdavHandler::addSloxElement( this, doc, prop, fieldName( LastModified ), lastModified ); } if ( mUploadIsDelete ) { if ( mUploadedIncidence->type() == "Event" ) { url.setPath( "/servlet/webdav.calendar/" + sloxId ); } else if ( mUploadedIncidence->type() == "Todo" ) { url.setPath( "/servlet/webdav.tasks/" + sloxId ); } else { kWarning() << "Unsupported incidence type:" << mUploadedIncidence->type(); return; } if ( type() == "ox" ) { WebdavHandler::addSloxElement( this, doc, prop, "method", "DELETE" ); if ( mUploadedIncidence->type() == "Event" ) WebdavHandler::addSloxElement( this, doc, prop, fieldName( FolderId ), mPrefs->calendarFolderId() ); else if ( mUploadedIncidence->type() == "Todo" ) WebdavHandler::addSloxElement( this, doc, prop, fieldName( FolderId ), mPrefs->taskFolderId() ); } else { QDomElement remove = WebdavHandler::addElement( doc, pu, "D:remove" ); QDomElement prop = WebdavHandler::addElement( doc, remove, "D:prop" ); WebdavHandler::addSloxElement( this, doc, prop, "sloxid", sloxId ); } } else { createIncidenceAttributes( doc, prop, mUploadedIncidence ); // FIXME: Use a visitor if ( mUploadedIncidence->type() == "Event" ) { url.setPath( "/servlet/webdav.calendar/file.xml" ); createEventAttributes( doc, prop, static_cast<Event *>( mUploadedIncidence ) ); // TODO: OX supports recurrences also for tasks createRecurrenceAttributes( doc, prop, mUploadedIncidence ); } else if ( mUploadedIncidence->type() == "Todo" ) { url.setPath( "/servlet/webdav.tasks/file.xml" ); createTodoAttributes( doc, prop, static_cast<Todo *>( mUploadedIncidence ) ); } else { kWarning() << "Unsupported incidence type:" << mUploadedIncidence->type(); return; } } url.setUser( mPrefs->user() ); url.setPass( mPrefs->password() ); kDebug() << url; kDebug() << "UPLOAD:" << doc.toString( 2 ); mUploadJob = KIO::davPropPatch( url, doc, KIO::HideProgressInfo ); connect( mUploadJob, SIGNAL( result( KJob * ) ), SLOT( slotUploadResult( KJob * ) ) ); connect( mUploadJob, SIGNAL( percent( KJob *, unsigned long ) ), SLOT( slotUploadProgress( KJob *, unsigned long ) ) ); mUploadProgress = KPIM::ProgressManager::instance()->createProgressItem( KPIM::ProgressManager::getUniqueID(), i18n("Uploading incidence") ); connect( mUploadProgress, SIGNAL( progressItemCanceled( KPIM::ProgressItem * ) ), SLOT( cancelUpload() ) ); }