21 #include "calendarbase.h"
22 #include "calendarbase_p.h"
23 #include "incidencechanger.h"
25 #include <akonadi/item.h>
26 #include <akonadi/collection.h>
28 #include <KSystemTimeZones>
30 using namespace Akonadi;
31 using namespace KCalCore;
33 CalendarBasePrivate::CalendarBasePrivate(
CalendarBase *qq ) : QObject()
34 , mIncidenceChanger( new IncidenceChanger() )
35 , mBatchInsertionCancelled( false )
38 connect( mIncidenceChanger,
39 SIGNAL(createFinished(
int,
Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)),
40 SLOT(slotCreateFinished(
int,
Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)) );
42 connect( mIncidenceChanger,
43 SIGNAL(deleteFinished(
int,QVector<Akonadi::Item::Id>,Akonadi::IncidenceChanger::ResultCode,QString)),
44 SLOT(slotDeleteFinished(
int,QVector<Akonadi::Item::Id>,Akonadi::IncidenceChanger::ResultCode,QString)) );
46 connect( mIncidenceChanger,
47 SIGNAL(modifyFinished(
int,
Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)),
48 SLOT(slotModifyFinished(
int,
Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)) );
50 mIncidenceChanger->setDestinationPolicy( IncidenceChanger::DestinationPolicyAsk );
51 mIncidenceChanger->setGroupwareCommunication(
false );
52 mIncidenceChanger->setHistoryEnabled(
false );
55 CalendarBasePrivate::~CalendarBasePrivate()
57 delete mIncidenceChanger;
58 mIncidenceChanger = 0;
61 void CalendarBasePrivate::internalInsert(
const Akonadi::Item &item )
64 mItemById.insert( item.
id(), item );
65 KCalCore::Incidence::Ptr incidence= item.
payload<KCalCore::Incidence::Ptr>();
66 Q_ASSERT( incidence );
69 Q_ASSERT( !incidence->uid().isEmpty() );
70 mItemIdByUid.insert( incidence->uid(), item.
id() );
73 const QString parentUid = incidence->relatedTo();
74 if ( !parentUid.isEmpty() ) {
75 mParentUidToChildrenUid[parentUid].append( incidence->uid() );
78 q->MemoryCalendar::addIncidence( incidence );
82 void CalendarBasePrivate::internalRemove(
const Akonadi::Item &item )
85 Q_ASSERT( item.
hasPayload<KCalCore::Incidence::Ptr>() );
86 Incidence::Ptr incidence = q->incidence( item.
payload<KCalCore::Incidence::Ptr>()->uid() );
92 mItemById.remove( item.
id() );
94 mItemIdByUid.remove( incidence->uid() );
96 mParentUidToChildrenUid.remove( incidence->uid() );
97 const QString parentUid = incidence->relatedTo();
98 if ( !parentUid.isEmpty() ) {
99 mParentUidToChildrenUid[parentUid].removeAll( incidence->uid() );
102 q->MemoryCalendar::deleteIncidence( incidence );
106 void CalendarBasePrivate::deleteAllIncidencesOfType(
const QString &mimeType )
108 QHash<Item::Id, Item>::iterator i;
110 for( i = mItemById.begin(); i != mItemById.end(); ++i ) {
111 if ( i.value().payload<KCalCore::Incidence::Ptr>()->mimeType() == mimeType )
112 incidences.append( i.value() );
115 mIncidenceChanger->deleteIncidences( incidences );
118 void CalendarBasePrivate::slotDeleteFinished(
int changeId,
119 const QVector<Akonadi::Item::Id> &itemIds,
120 IncidenceChanger::ResultCode resultCode,
121 const QString &errorMessage )
123 Q_UNUSED( changeId );
124 if ( resultCode == IncidenceChanger::ResultCodeSuccess ) {
126 if ( mItemById.contains(
id ) )
127 internalRemove( mItemById.value(
id ) );
130 emit q->deleteFinished( resultCode == IncidenceChanger::ResultCodeSuccess, errorMessage );
133 void CalendarBasePrivate::slotCreateFinished(
int changeId,
135 IncidenceChanger::ResultCode resultCode,
136 const QString &errorMessage )
138 Q_UNUSED( changeId );
140 if ( resultCode == IncidenceChanger::ResultCodeSuccess ) {
141 internalInsert( item );
143 emit q->createFinished( resultCode == IncidenceChanger::ResultCodeSuccess, errorMessage );
147 void CalendarBasePrivate::slotModifyFinished(
int changeId,
149 IncidenceChanger::ResultCode resultCode,
150 const QString &errorMessage )
152 Q_UNUSED( changeId );
154 if ( resultCode == IncidenceChanger::ResultCodeSuccess ) {
155 KCalCore::IncidenceBase::Ptr incidence = item.
payload<KCalCore::IncidenceBase::Ptr>();
156 Q_ASSERT( incidence );
158 *(
static_cast<IncidenceBase*
>(q->incidence( incidence->uid() ).data() ) ) = *(incidence.data());
160 emit q->modifyFinished( resultCode == IncidenceChanger::ResultCodeSuccess, errorMessage );
164 , d_ptr( new CalendarBasePrivate( this ) )
181 if ( d->mItemById.contains(
id ) ) {
182 i = d->mItemById[id];
184 kDebug() <<
"Can't find any item with id " << id;
192 Q_ASSERT( !uid.isEmpty() );
194 if ( d->mItemIdByUid.contains( uid ) ) {
196 if ( !d->mItemById.contains(
id ) ) {
197 kError() <<
"Item with id " <<
id <<
"(uid=" << uid <<
") not found, but in uid map";
198 Q_ASSERT_X(
false,
"CalendarBase::item",
"not in mItemById" );
200 i = d->mItemById[id];
202 kDebug() <<
"Can't find any incidence with uid " << uid;
211 foreach(
const KCalCore::Incidence::Ptr &incidence, incidences ) {
213 items <<
item( incidence->uid() );
225 KCalCore::Incidence::List childs;
227 if ( d->mItemById.contains( parentId ) ) {
230 Q_ASSERT( item.
hasPayload<KCalCore::Incidence::Ptr>() );
241 KCalCore::Incidence::List children;
242 const QStringList uids = d->mParentUidToChildrenUid.value( parentUid );
243 Q_FOREACH(
const QString &uid, uids ) {
244 Incidence::Ptr child = incidence( uid );
246 children.append( child );
248 kWarning() <<
"Invalid child with uid " << uid;
258 if ( d->mItemById.contains( parentId ) ) {
261 Q_ASSERT( item.
hasPayload<KCalCore::Incidence::Ptr>() );
273 const QStringList uids = d->mParentUidToChildrenUid.value( parentUid );
274 Q_FOREACH(
const QString &uid, uids ) {
277 children.append( child );
279 kWarning() <<
"Invalid child with uid " << uid;
297 d->deleteAllIncidencesOfType( Event::eventMimeType() );
313 d->deleteAllIncidencesOfType( Todo::todoMimeType() );
329 d->deleteAllIncidencesOfType( Journal::journalMimeType() );
338 if ( batchAdding() && d->mBatchInsertionCancelled )
343 if ( batchAdding() && d->mCollectionForBatchInsertion.isValid() )
344 collection = d->mCollectionForBatchInsertion;
346 const int changeId = d->mIncidenceChanger->createIncidence( incidence, collection );
348 if ( batchAdding() ) {
350 if ( changeId != -1 && !lastCollection.
isValid() ) {
351 d->mBatchInsertionCancelled =
true;
352 }
else if ( lastCollection.
isValid() && !d->mCollectionForBatchInsertion.isValid() ) {
353 d->mCollectionForBatchInsertion = d->mIncidenceChanger->lastCollectionUsed();
357 return changeId != -1;
363 Q_ASSERT( incidence );
365 return -1 != d->mIncidenceChanger->deleteIncidence( item_ );
371 Q_ASSERT( newIncidence );
373 return -1 != d->mIncidenceChanger->modifyIncidence( item_ );
379 d->mWeakPointer = pointer;
385 return d->mWeakPointer;
391 return d->mIncidenceChanger;
396 KCalCore::MemoryCalendar::startBatchAdding();
403 d->mBatchInsertionCancelled =
false;
404 KCalCore::MemoryCalendar::endBatchAdding();
407 #include "calendarbase.moc"
408 #include "calendarbase_p.moc"