24 #ifndef AKONADI_INCIDENCECHANGER_P_H
25 #define AKONADI_INCIDENCECHANGER_P_H
27 #include "incidencechanger.h"
28 #include "itiphandlerhelper_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 , useGroupwareCommunication(incidenceChanger->groupwareCommunication())
63 , changer(incidenceChanger)
70 parentChange->childAboutToDie(
this);
74 virtual void childAboutToDie(Change *child)
79 virtual void emitCompletionSignal() = 0;
82 const IncidenceChanger::ChangeType type;
83 const bool recordToHistory;
84 const QPointer<QWidget> parentWidget;
85 uint atomicOperationId;
89 QSharedPointer<Change> parentChange;
95 IncidenceChanger::ResultCode resultCode;
97 bool queuedModification;
98 bool useGroupwareCommunication;
100 IncidenceChanger *
const changer;
103 class ModificationChange :
public Change
106 typedef QSharedPointer<ModificationChange> Ptr;
107 ModificationChange(IncidenceChanger *changer,
int id, uint atomicOperationId,
108 QWidget *parent) : Change(changer, id,
109 IncidenceChanger::ChangeTypeModify,
110 atomicOperationId, parent)
114 ~ModificationChange()
117 emitCompletionSignal();
121 void emitCompletionSignal();
124 class CreationChange :
public Change
127 typedef QSharedPointer<CreationChange> Ptr;
128 CreationChange(IncidenceChanger *changer,
int id, uint atomicOperationId,
129 QWidget *parent) : Change(changer, id, IncidenceChanger::ChangeTypeCreate,
130 atomicOperationId, parent)
138 emitCompletionSignal();
142 void emitCompletionSignal();
147 class DeletionChange :
public Change
150 typedef QSharedPointer<DeletionChange> Ptr;
151 DeletionChange(IncidenceChanger *changer,
int id, uint atomicOperationId,
152 QWidget *parent) : Change(changer, id, IncidenceChanger::ChangeTypeDelete,
153 atomicOperationId, parent)
161 emitCompletionSignal();
165 void emitCompletionSignal();
167 QVector<Akonadi::Item::Id> mItemIds;
170 struct AtomicOperation {
174 QSet<Akonadi::Item::Id> m_itemIdsInOperation;
180 int m_numCompletedChanges;
181 QString m_description;
182 bool m_transactionCompleted;
184 AtomicOperation(IncidenceChanger::Private *icp, uint ident);
189 if (m_wasRolledback) {
190 for (
int i=0; i<m_changes.count(); ++i) {
194 if (m_changes[i]->completed &&
195 (m_changes[i]->resultCode == IncidenceChanger::ResultCodeSuccess ||
196 (m_changes[i]->resultCode == IncidenceChanger::ResultCodeJobError &&
197 m_changes[i]->errorString == QLatin1String(
"Unknown error.")))) {
198 m_changes[i]->resultCode = IncidenceChanger::ResultCodeRolledback;
205 bool pendingJobs()
const
207 return m_changes.count() > m_numCompletedChanges;
213 m_wasRolledback =
true;
214 transaction()->rollback();
217 bool rolledback()
const
219 return m_wasRolledback;
222 void addChange(
const Change::Ptr &change)
224 if (change->type == IncidenceChanger::ChangeTypeDelete) {
225 DeletionChange::Ptr deletion = change.staticCast<DeletionChange>();
227 Q_ASSERT(!m_itemIdsInOperation.contains(
id));
228 m_itemIdsInOperation.insert(
id);
230 }
else if (change->type == IncidenceChanger::ChangeTypeModify) {
231 Q_ASSERT(!m_itemIdsInOperation.contains(change->newItem.id()));
232 m_itemIdsInOperation.insert(change->newItem.id());
241 QVector<Change::Ptr> m_changes;
242 bool m_wasRolledback;
244 IncidenceChanger::Private *m_incidenceChangerPrivate;
247 class IncidenceChanger::Private :
public QObject
251 explicit Private(
bool enableHistory, IncidenceChanger *mIncidenceChanger);
260 QString showErrorDialog(Akonadi::IncidenceChanger::ResultCode, QWidget *parent);
262 void setChangeInternal(
int changeId);
265 void queueModification(Change::Ptr);
266 void performModification(Change::Ptr);
267 bool atomicOperationIsValid(uint atomicOperationId)
const;
269 void cancelTransaction();
270 void cleanupTransaction();
271 bool allowAtomicOperation(
int atomicOperationId,
const Change::Ptr &change)
const;
273 bool handleInvitationsBeforeChange(
const Change::Ptr &change);
274 bool handleInvitationsAfterChange(
const Change::Ptr &change);
275 static bool myAttendeeStatusChanged(
const KCalCore::Incidence::Ptr &newIncidence,
276 const KCalCore::Incidence::Ptr &oldIncidence,
277 const QStringList &myEmails);
280 void handleCreateJobResult(KJob*);
281 void handleModifyJobResult(KJob*);
282 void handleDeleteJobResult(KJob*);
283 void handleTransactionJobResult(KJob*);
288 QHash<const KJob*,Change::Ptr> mChangeForJob;
289 bool mShowDialogsOnError;
291 DestinationPolicy mDestinationPolicy;
292 QVector<Akonadi::Item::Id> mDeletedItemIds;
305 QHash<Akonadi::Item::Id,Change::Ptr> mQueuedModifications;
310 QHash<Akonadi::Item::Id,Change::Ptr> mModificationsInProgress;
312 QHash<int,Change::Ptr> mChangeById;
317 QHash<uint,AtomicOperation*> mAtomicOperations;
319 bool mRespectsCollectionRights;
320 bool mGroupwareCommunication;
322 QHash<Akonadi::TransactionSequence*, uint> mAtomicOperationByTransaction;
323 QHash<uint,ITIPHandlerHelper::SendResult> mInvitationStatusByAtomicOperation;
325 uint mLatestAtomicOperationId;
326 bool mBatchOperationInProgress;
329 QMap<KJob *, QSet<KCalCore::IncidenceBase::Field> > mDirtyFieldsByJob;