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 )
63 Q_ASSERT( item.isValid() );
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 )
84 Q_ASSERT( item.isValid() );
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;
109 Item::List incidences;
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 ) {
125 foreach(
const Akonadi::Item::Id &
id, itemIds ) {
126 if ( mItemById.contains(
id ) )
127 internalRemove( mItemById.value(
id ) );
130 emit q->deleteFinished( resultCode == IncidenceChanger::ResultCodeSuccess, errorMessage );
133 void CalendarBasePrivate::slotCreateFinished(
int changeId,
134 const Akonadi::Item &item,
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,
148 const Akonadi::Item &item,
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 ) ) {
195 const Akonadi::Item::Id
id = d->mItemIdByUid[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;
209 Akonadi::Item::List items;
211 foreach(
const KCalCore::Incidence::Ptr &incidence, incidences ) {
213 items <<
item( incidence->uid() );
215 items << Akonadi::Item();
225 KCalCore::Incidence::List childs;
227 if ( d->mItemById.contains( parentId ) ) {
228 const Akonadi::Item item = d->mItemById.value( parentId );
229 Q_ASSERT( item.isValid() );
230 Q_ASSERT( item.hasPayload<KCalCore::Incidence::Ptr>() );
232 childs =
childIncidences( item.payload<KCalCore::Incidence::Ptr>()->uid() );
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;
256 Akonadi::Item::List childs;
258 if ( d->mItemById.contains( parentId ) ) {
259 const Akonadi::Item item = d->mItemById.value( parentId );
260 Q_ASSERT( item.isValid() );
261 Q_ASSERT( item.hasPayload<KCalCore::Incidence::Ptr>() );
263 childs =
childItems( item.payload<KCalCore::Incidence::Ptr>()->uid() );
272 Akonadi::Item::List children;
273 const QStringList uids = d->mParentUidToChildrenUid.value( parentUid );
274 Q_FOREACH(
const QString &uid, uids ) {
275 Akonadi::Item child =
item( uid );
276 if ( child.isValid() && child.hasPayload<KCalCore::Incidence::Ptr>() )
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 );
364 Akonadi::Item item_ =
item( incidence->uid() );
365 return -1 != d->mIncidenceChanger->deleteIncidence( item_ );
371 Q_ASSERT( newIncidence );
372 const Akonadi::Item item_ =
item( newIncidence->uid() );
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"
bool modifyIncidence(const KCalCore::IncidenceBase::Ptr &newIncidence)
Modifies an incidence.
void deleteAllJournals()
Deletes all Journals from the calendar.
void startBatchAdding()
Call this to tell the calendar that you're adding a batch of incidences.
Represents a collection of PIM items.
Akonadi::Item item(const QString &uid) const
Returns the Item containing the incidence with uid uid or an invalid Item if the incidence isn't foun...
bool addTodo(const KCalCore::Todo::Ptr &todo)
Adds a Todo to the calendar.
bool deleteEvent(const KCalCore::Event::Ptr &event)
Deletes an Event from the calendar.
Akonadi::Item::List itemList(const KCalCore::Incidence::List &incidenceList) const
Returns the item list that corresponds to the incidenceList.
bool addJournal(const KCalCore::Journal::Ptr &journal)
Adds a Journal to the calendar.
bool deleteIncidence(const KCalCore::Incidence::Ptr &)
Deletes an incidence from the calendar.
bool deleteTodo(const KCalCore::Todo::Ptr &todo)
Deletes a Todo from the calendar.
~CalendarBase()
Destroys the calendar.
bool deleteJournal(const KCalCore::Journal::Ptr &journal)
Deletes a Journal from the calendar.
bool addEvent(const KCalCore::Event::Ptr &event)
Adds an Event to the calendar.
Akonadi::Item::List childItems(const QString &parentUid) const
Returns the child items of the parent identified by parentUid.
KCalCore::Incidence::List childIncidences(const QString &parentUid) const
Returns the child incidences of the parent identified by parentUid.
void deleteAllEvents()
Deletes all Events from the calendar.
CalendarBase()
Constructs a CalendarBase object.
QWeakPointer< CalendarBase > weakPointer() const
Returns the weak pointer set with setWeakPointer().
Akonadi::IncidenceChanger * incidenceChanger() const
Returns the IncidenceChanger used by this calendar to make changes in akonadi.
void endBatchAdding()
Tells the Calendar that you stoped adding a batch of incidences.
bool addIncidence(const KCalCore::Incidence::Ptr &incidence)
Adds an incidence to the calendar.
The base class for all akonadi aware calendars.
bool isValid() const
Returns whether the entity is valid.
void deleteAllTodos()
Deletes all Todos from the calendar.
void setWeakPointer(const QWeakPointer< Akonadi::CalendarBase > &pointer)
Sets the weak pointer that's associated with this instance.