24 #ifndef AKONADI_INCIDENCECHANGER_P_H
25 #define AKONADI_INCIDENCECHANGER_P_H
27 #include "incidencechanger.h"
28 #include "invitationhandlerhelper_p.h"
31 #include <akonadi/item.h>
32 #include <akonadi/collection.h>
33 #include <akonadi/transactionsequence.h>
46 class TransactionSequence;
51 typedef QSharedPointer<Change> Ptr;
52 Change( IncidenceChanger *incidenceChanger,
int changeId,
53 IncidenceChanger::ChangeType changeType, uint operationId,
54 QWidget *parent ) : id( changeId )
56 , recordToHistory( incidenceChanger->historyEnabled() )
57 , parentWidget( parent )
58 , atomicOperationId( operationId )
59 , resultCode( Akonadi::IncidenceChanger::ResultCodeSuccess )
61 , queuedModification( false )
62 , changer( incidenceChanger )
69 parentChange->childAboutToDie(
this );
73 virtual void childAboutToDie( Change *child )
78 virtual void emitCompletionSignal() = 0;
81 const IncidenceChanger::ChangeType type;
82 const bool recordToHistory;
83 const QPointer<QWidget> parentWidget;
84 uint atomicOperationId;
88 QSharedPointer<Change> parentChange;
94 IncidenceChanger::ResultCode resultCode;
96 bool queuedModification;
98 IncidenceChanger *
const changer;
101 class ModificationChange :
public Change
104 typedef QSharedPointer<ModificationChange> Ptr;
105 ModificationChange( IncidenceChanger *changer,
int id, uint atomicOperationId,
106 QWidget *parent ) : Change( changer, id,
107 IncidenceChanger::ChangeTypeModify,
108 atomicOperationId, parent )
112 ~ModificationChange()
115 emitCompletionSignal();
119 void emitCompletionSignal();
122 class CreationChange :
public Change
125 typedef QSharedPointer<CreationChange> Ptr;
126 CreationChange( IncidenceChanger *changer,
int id, uint atomicOperationId,
127 QWidget *parent ) : Change( changer, id, IncidenceChanger::ChangeTypeCreate,
128 atomicOperationId, parent )
136 emitCompletionSignal();
140 void emitCompletionSignal();
145 class DeletionChange :
public Change
148 typedef QSharedPointer<DeletionChange> Ptr;
149 DeletionChange( IncidenceChanger *changer,
int id, uint atomicOperationId,
150 QWidget *parent ) : Change( changer, id, IncidenceChanger::ChangeTypeDelete,
151 atomicOperationId, parent )
159 emitCompletionSignal();
163 void emitCompletionSignal();
165 QVector<Akonadi::Item::Id> mItemIds;
168 struct AtomicOperation {
172 QSet<Akonadi::Item::Id> mItemIdsInOperation;
178 int numCompletedChanges;
181 bool transactionCompleted;
183 AtomicOperation( uint ident ) :
186 numCompletedChanges( 0 ),
188 transactionCompleted(false),
189 wasRolledback( false )
199 if ( wasRolledback ) {
200 for (
int i=0; i<changes.count(); ++i ) {
204 if ( changes[i]->completed &&
205 ( changes[i]->resultCode == IncidenceChanger::ResultCodeSuccess ||
206 ( changes[i]->resultCode == IncidenceChanger::ResultCodeJobError &&
207 changes[i]->errorString == QLatin1String(
"Unknown error." ) ) ) ) {
208 changes[i]->resultCode = IncidenceChanger::ResultCodeRolledback;
215 bool pendingJobs()
const
217 return changes.count() > numCompletedChanges;
223 wasRolledback =
true;
224 transaction->rollback();
227 bool rolledback()
const
229 return wasRolledback;
232 void addChange(
const Change::Ptr &change )
234 if ( change->type == IncidenceChanger::ChangeTypeDelete ) {
235 DeletionChange::Ptr deletion = change.staticCast<DeletionChange>();
237 Q_ASSERT( !mItemIdsInOperation.contains(
id ) );
238 mItemIdsInOperation.insert(
id );
240 }
else if ( change->type == IncidenceChanger::ChangeTypeModify ) {
241 Q_ASSERT( !mItemIdsInOperation.contains( change->newItem.id() ) );
242 mItemIdsInOperation.insert( change->newItem.id() );
249 QVector<Change::Ptr> changes;
253 class IncidenceChanger::Private :
public QObject
257 explicit Private(
bool enableHistory, IncidenceChanger *mIncidenceChanger );
266 QString showErrorDialog( Akonadi::IncidenceChanger::ResultCode, QWidget *parent );
268 void setChangeInternal(
int changeId );
270 bool hasRights(
const Akonadi::Collection &collection, IncidenceChanger::ChangeType )
const;
271 void queueModification( Change::Ptr );
272 void performModification( Change::Ptr );
273 bool atomicOperationIsValid( uint atomicOperationId )
const;
275 void cancelTransaction();
276 void cleanupTransaction();
277 bool allowAtomicOperation(
int atomicOperationId,
const Change::Ptr &change )
const;
279 bool handleInvitationsBeforeChange(
const Change::Ptr &change );
280 bool handleInvitationsAfterChange(
const Change::Ptr &change );
281 static bool myAttendeeStatusChanged(
const KCalCore::Incidence::Ptr &newIncidence,
282 const KCalCore::Incidence::Ptr &oldIncidence,
283 const QStringList &myEmails );
286 void handleCreateJobResult( KJob* );
287 void handleModifyJobResult( KJob* );
288 void handleDeleteJobResult( KJob* );
289 void handleTransactionJobResult( KJob* );
294 QHash<const KJob*,Change::Ptr> mChangeForJob;
295 bool mShowDialogsOnError;
297 DestinationPolicy mDestinationPolicy;
298 QVector<Akonadi::Item::Id> mDeletedItemIds;
311 QHash<Akonadi::Item::Id,Change::Ptr> mQueuedModifications;
316 QHash<Akonadi::Item::Id,Change::Ptr> mModificationsInProgress;
318 QHash<int,Change::Ptr> mChangeById;
323 QHash<uint,AtomicOperation*> mAtomicOperations;
325 bool mRespectsCollectionRights;
326 bool mGroupwareCommunication;
328 QHash<Akonadi::TransactionSequence*, uint> mAtomicOperationByTransaction;
329 QHash<uint,InvitationHandlerHelper::SendResult> mInvitationStatusByAtomicOperation;
331 uint mLatestAtomicOperationId;
332 bool mBatchOperationInProgress;
335 QMap<KJob *, QSet<KCalCore::IncidenceBase::Field> > mDirtyFieldsByJob;