bool Scheduler::acceptRequest(IncidenceBase *newIncBase, ScheduleMessage::Status /* status */) { if (newIncBase->type()=="FreeBusy") { // reply to this request is handled in korganizer's incomingdialog return true; } Incidence *newInc = dynamic_cast<Incidence *>( newIncBase ); if ( newInc ) { bool res = true; Incidence *exInc = mCalendar->incidenceFromSchedulingID( newIncBase->uid() ); if ( exInc ) { res = false; if ( (newInc->revision() > exInc->revision()) || (newInc->revision() == exInc->revision() && newInc->lastModified()>exInc->lastModified()) ) { mCalendar->deleteIncidence( exInc ); res = true; } } if ( res ) { // Move the uid to be the schedulingID and make a unique UID newInc->setSchedulingID( newInc->uid() ); newInc->setUid( CalFormat::createUniqueId() ); mCalendar->addIncidence(newInc); } deleteTransaction( newIncBase ); return res; } return false; }
void ConfirmSaveDialog::addIncidences( const Incidence::List &incidences, const QString &operation ) { Incidence::List::ConstIterator it; for( it = incidences.begin(); it != incidences.end(); ++it ) { Incidence *i = *it; KListViewItem *item = new KListViewItem( mListView ); item->setText( 0, operation ); item->setText( 1, i->type() ); item->setText( 2, i->summary() ); item->setText( 3, i->uid() ); } }
void ResourceGroupware::slotJobResult( KJob *job ) { kDebug() <<"ResourceGroupware::slotJobResult():"; if ( job->error() ) { mIsShowingError = true; loadError( job->errorString() ); mIsShowingError = false; } else { disableChangeNotification(); clearCache(); // FIXME: This does not take into account the time zone! CalendarLocal calendar; ICalFormat ical; if ( !ical.fromString( &calendar, mJobData ) ) { loadError( i18n("Error parsing calendar data.") ); } else { Incidence::List incidences = calendar.incidences(); Incidence::List::ConstIterator it; for( it = incidences.begin(); it != incidences.end(); ++it ) { // kDebug() <<"INCIDENCE:" << (*it)->summary(); Incidence *i = (*it)->clone(); QString remote = (*it)->customProperty( "GWRESOURCE", "UID" ); QString local = idMapper().localId( remote ); if ( local.isEmpty() ) { idMapper().setRemoteId( i->uid(), remote ); } else { i->setUid( local ); } addIncidence( i ); } } saveToCache(); enableChangeNotification(); clearChanges(); emit resourceChanged( this ); emit resourceLoaded( this ); } mDownloadJob = 0; if ( mProgress ) mProgress->setComplete(); mProgress = 0; }
Incidence::List DndFactory::pasteIncidences( const QDate &newDate, const QTime *newTime ) { QClipboard *cb = QApplication::clipboard(); Calendar *cal = createDropCalendar( cb->mimeData() ); Incidence::List list; if ( !cal ) { kDebug() << "Can't parse clipboard"; return list; } // All pasted incidences get new uids, must keep track of old uids, // so we can update child's parents QHash<QString,Incidence*> oldUidToNewInc; Incidence::List::ConstIterator it; const Incidence::List incs = cal->incidences(); for ( it = incs.constBegin(); it != incs.constEnd(); ++it ) { Incidence *inc = d->pasteIncidence( *it, newDate, newTime ); if ( inc ) { list.append( inc ); oldUidToNewInc[( *it )->uid()] = inc; } } // update relations for ( it = list.constBegin(); it != list.constEnd(); ++it ) { Incidence *inc = *it; if ( oldUidToNewInc.contains( inc->relatedToUid() ) ) { Incidence *parentInc = oldUidToNewInc[inc->relatedToUid()]; inc->setRelatedToUid( parentInc->uid() ); inc->setRelatedTo( parentInc ); } else { // not related to anything in the clipboard inc->setRelatedToUid( QString() ); inc->setRelatedTo( 0 ); } } return list; }
QString ICalFormat::createScheduleMessage(IncidenceBase *incidence, Scheduler::Method method) { icalcomponent *message = 0; // Handle scheduling ID being present if(incidence->type() == "Event" || incidence->type() == "Todo") { Incidence *i = static_cast<Incidence *>(incidence); if(i->schedulingID() != i->uid()) { // We have a separation of scheduling ID and UID i = i->clone(); i->setUid(i->schedulingID()); i->setSchedulingID(QString::null); // Build the message with the cloned incidence message = mImpl->createScheduleComponent(i, method); // And clean up delete i; } } if(message == 0) message = mImpl->createScheduleComponent(incidence, method); // FIXME TODO: Don't we have to free message? What about the ical_string? MEMLEAK QString messageText = QString::fromUtf8(icalcomponent_as_ical_string(message)); #if 0 kdDebug(5800) << "ICalFormat::createScheduleMessage: message START\n" << messageText << "ICalFormat::createScheduleMessage: message END" << endl; #endif return messageText; }
void KOTodoListView::contentsDropEvent( QDropEvent *e ) { #ifndef KORG_NODND kdDebug(5850) << "KOTodoListView::contentsDropEvent" << endl; if ( !mCalendar || !mChanger || ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) && !QTextDrag::canDecode( e ) ) ) { e->ignore(); return; } DndFactory factory( mCalendar ); Todo *todo = factory.createDropTodo(e); if ( todo ) { e->acceptAction(); KOTodoViewItem *destination = (KOTodoViewItem *)itemAt(contentsToViewport(e->pos())); Todo *destinationEvent = 0; if (destination) destinationEvent = destination->todo(); Todo *existingTodo = mCalendar->todo(todo->uid()); if( existingTodo ) { kdDebug(5850) << "Drop existing Todo " << existingTodo << " onto " << destinationEvent << endl; Incidence *to = destinationEvent; while(to) { if (to->uid() == todo->uid()) { KMessageBox::information(this, i18n("Cannot move to-do to itself or a child of itself."), i18n("Drop To-do"), "NoDropTodoOntoItself" ); delete todo; return; } to = to->relatedTo(); } Todo*oldTodo = existingTodo->clone(); if ( mChanger->beginChange( existingTodo ) ) { existingTodo->setRelatedTo( destinationEvent ); mChanger->changeIncidence( oldTodo, existingTodo, KOGlobals::RELATION_MODIFIED ); mChanger->endChange( existingTodo ); } else { KMessageBox::sorry( this, i18n("Unable to change to-do's parent, " "because the to-do cannot be locked.") ); } delete oldTodo; delete todo; } else { // kdDebug(5850) << "Drop new Todo" << endl; todo->setRelatedTo(destinationEvent); if ( !mChanger->addIncidence( todo, this ) ) { KODialogManager::errorSaveIncidence( this, todo ); delete todo; return; } } } else { QString text; KOTodoViewItem *todoi = dynamic_cast<KOTodoViewItem *>(itemAt( contentsToViewport(e->pos()) )); if ( ! todoi ) { // Not dropped on a todo item: e->ignore(); kdDebug( 5850 ) << "KOTodoListView::contentsDropEvent(): Not dropped on a todo item" << endl; kdDebug( 5850 ) << "TODO: Create a new todo with the given data" << endl; // FIXME: Create a new todo with the given text/contact/whatever } else if ( QTextDrag::decode(e, text) ) { //QListViewItem *qlvi = itemAt( contentsToViewport(e->pos()) ); kdDebug(5850) << "Dropped : " << text << endl; Todo*todo = todoi->todo(); if( mChanger->beginChange( todo ) ) { Todo*oldtodo = todo->clone(); if( text.startsWith( "file:" ) ) { todo->addAttachment( new Attachment( text ) ); } else { QStringList emails = KPIM::splitEmailAddrList( text ); for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) { kdDebug(5850) << " Email: " << (*it) << endl; int pos = (*it).find("<"); QString name = (*it).left(pos); QString email = (*it).mid(pos); if (!email.isEmpty() && todoi) { todo->addAttendee( new Attendee( name, email ) ); } } } mChanger->changeIncidence( oldtodo, todo ); mChanger->endChange( todo ); } else { KMessageBox::sorry( this, i18n("Unable to add attendees to the to-do, " "because the to-do cannot be locked.") ); } } else { kdDebug(5850) << "KOTodoListView::contentsDropEvent(): Todo from drop not decodable" << endl; e->ignore(); } } #endif }
// If a task with subtasks is deleted, move it's subtasks to the orphans list void Calendar::removeRelations(Incidence *incidence) { if(!incidence) { kdDebug(5800) << "Warning: Calendar::removeRelations( 0 )!\n"; return; } // kdDebug(5850) << "Calendar::removeRelations for incidence " << forincidence << " with UID " << forincidence->uid() << ", summary: " << forincidence->summary() << endl; QString uid = incidence->uid(); Incidence::List relations = incidence->relations(); Incidence::List::ConstIterator it; for(it = relations.begin(); it != relations.end(); ++it) { Incidence *i = *it; if(!mOrphanUids.find(i->uid())) { mOrphans.insert(uid, i); mOrphanUids.insert(i->uid(), i); i->setRelatedTo(0); i->setRelatedToUid(uid); } } // If this incidence is related to something else, tell that about it if(incidence->relatedTo()) incidence->relatedTo()->removeRelation(incidence); // Remove this one from the orphans list if(mOrphanUids.remove(uid)) { // This incidence is located in the orphans list - it should be removed // Since the mOrphans dict might contain the same key (with different // child incidence pointers!) multiple times, take care that we remove // the correct one. So we need to remove all items with the given // parent UID, and readd those that are not for this item. Also, there // might be other entries with differnet UID that point to this // incidence (this might happen when the relatedTo of the item is // changed before its parent is inserted. This might happen with // groupware servers....). Remove them, too QStringList relatedToUids; // First get the list of all keys in the mOrphans list that point to the removed item relatedToUids << incidence->relatedToUid(); for(QDictIterator<Incidence> it(mOrphans); it.current(); ++it) { if(it.current()->uid() == uid) { relatedToUids << it.currentKey(); } } // now go through all uids that have one entry that point to the incidence for(QStringList::Iterator uidit = relatedToUids.begin(); uidit != relatedToUids.end(); ++uidit) { Incidence::List tempList; // Remove all to get access to the remaining entries while(Incidence *i = mOrphans[ *uidit ]) { mOrphans.remove(*uidit); if(i != incidence) tempList.append(i); } // Readd those that point to a different orphan incidence for(Incidence::List::Iterator incit = tempList.begin(); incit != tempList.end(); ++incit) { mOrphans.insert(*uidit, *incit); } } } }