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;
91 Akonadi::Item::List originalItems;
92 Akonadi::Item newItem;
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>();
226 foreach( Akonadi::Item::Id
id, deletion->mItemIds ) {
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 );
258 bool deleteAlreadyCalled( Akonadi::Item::Id
id )
const;
260 QString showErrorDialog( Akonadi::IncidenceChanger::ResultCode, QWidget *parent );
262 void setChangeInternal(
int changeId );
264 bool hasRights(
const Akonadi::Collection &collection, IncidenceChanger::ChangeType )
const;
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* );
284 void performNextModification( Akonadi::Item::Id
id );
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;
Represents a collection of PIM items.
Base class for all actions in the Akonadi storage.
Base class for jobs that need to run a sequence of sub-jobs in a transaction.