New: Add omit-presence-changes parameter
[qtcontacts-tracker:hasselmms-qtcontacts-tracker.git] / src / engine / engine_p.h
1 /*********************************************************************************
2  ** This file is part of QtContacts tracker storage plugin
3  **
4  ** Copyright (c) 2009-2011 Nokia Corporation and/or its subsidiary(-ies).
5  **
6  ** Contact:  Nokia Corporation (info@qt.nokia.com)
7  **
8  ** GNU Lesser General Public License Usage
9  ** This file may be used under the terms of the GNU Lesser General Public License
10  ** version 2.1 as published by the Free Software Foundation and appearing in the
11  ** file LICENSE.LGPL included in the packaging of this file.  Please review the
12  ** following information to ensure the GNU Lesser General Public License version
13  ** 2.1 requirements will be met:
14  ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
15  **
16  ** In addition, as a special exception, Nokia gives you certain additional rights.
17  ** These rights are described in the Nokia Qt LGPL Exception version 1.1, included
18  ** in the file LGPL_EXCEPTION.txt in this package.
19  **
20  ** Other Usage
21  ** Alternatively, this file may be used in accordance with the terms and
22  ** conditions contained in a signed written agreement between you and Nokia.
23  *********************************************************************************/
24
25 #ifndef QTRACKERCONTACTENGINE_P_H
26 #define QTRACKERCONTACTENGINE_P_H
27
28 #include "displaylabelgenerator.h"
29 #include "abstractrequest.h"
30 #include "guidalgorithm.h"
31 #include "engine.h"
32 #include "queue.h"
33
34 #include <dao/contactdetailschema.h>
35
36 #include <QtCore>
37
38 typedef QVector<DisplayLabelGenerator>                              DisplayLabelGeneratorList;
39 typedef QMap<QString, DisplayLabelGeneratorList>                    DisplayLabelGeneratorListMap;
40
41 class QctTrackerChangeListener;
42 class QctTrackerIdResolver;
43
44 class QContactTrackerEngineParameters
45 {
46 public:
47     QContactTrackerEngineParameters(const QMap<QString, QString> &parameters,
48                                     const QString &engineName, int engineVersion);
49
50 public: // fields
51     QString m_engineName;
52     int m_engineVersion;
53     int m_requestTimeout;
54     int m_trackerTimeout;
55     int m_coalescingDelay;
56     int m_concurrencyLevel;
57     int m_batchSize;
58     int m_gcLimit;
59
60     QString m_graphIri;
61     QString m_syncTarget;
62     QStringList m_weakSyncTargets;
63
64     QctGuidAlgorithm *m_guidAlgorithm;
65
66     QMap<QString, QString> m_parameters;
67     QMap<QString, QString> m_managerParameters;
68
69     QContactTrackerEngine::DebugFlags m_debugFlags;
70
71     QMap<QString, QTrackerContactDetailSchema> m_detailSchemas;
72
73     bool m_omitPresenceChanges : 1;
74 };
75
76 class QContactTrackerEngineData : public QSharedData
77 {
78     // Using void pointer for the key since it might point onto an already destructed object.
79     typedef QList<QTrackerAbstractRequest*> RequestList;
80
81 public: // constructor/destructor
82     explicit QContactTrackerEngineData(const QMap<QString, QString> &parameters,
83                                        const QString &engineName, int engineVersion);
84     virtual ~QContactTrackerEngineData();
85
86 public: // operators
87     QContactTrackerEngineData(const QContactTrackerEngineData &other);
88
89 private:
90     void setupDisplayNameFields();
91
92 public: // parameters
93     const QContactTrackerEngineParameters m_parameters;
94
95 public: // caches
96     /// stores lookup table for different lists of generators for the display label, each sorted by priority
97     DisplayLabelGeneratorListMap m_displayNameGeneratorListMap;
98     mutable QList<QVariant::Type> m_supportedDataTypes;
99     uint m_selfContactId;
100
101 public: // state
102     QctTrackerChangeListener *m_changeListener;
103
104     QHash<const QContactAbstractRequest*, QTrackerAbstractRequest*> m_workersByRequest;
105     QHash<const QTrackerAbstractRequest*, QContactAbstractRequest*> m_requestsByWorker;
106     QReadWriteLock m_tableLock;
107     QMutex m_requestLifeGuard;
108     QctQueue *m_queue;
109
110     QTrackerAbstractRequest::Dependencies m_satisfiedDependencies;
111
112     QString m_gcQueryId;
113
114     bool m_mandatoryTokensFound : 1;
115 };
116
117 /*!
118  * A helper used to exit request event loops for the the synchronous API
119  * and for the misguided users of waitForFinished facility.
120  */
121 class RequestEventLoop : public QEventLoop
122 {
123     Q_OBJECT
124
125 public: // constructors/destructors
126     explicit RequestEventLoop(QContactAbstractRequest *request, int timeout);
127
128 public: // attributes
129     bool isFinished() const { return m_finished; }
130
131 public slots:
132     /// Quits the event loop when called.
133     void stateChanged(QContactAbstractRequest::State newState);
134     void requestDone();
135
136 private: // fields
137     bool m_finished;
138 };
139
140 ///////////////////////////////////////////////////////////////////////////////
141
142 class QctTaskWaiter : public QObject
143 {
144     Q_OBJECT
145
146 public: // constructors/destructors
147     explicit QctTaskWaiter(QctTask *task, QObject *parent = 0);
148
149 public: // methods
150     bool wait(int timeout);
151
152 private slots:
153     void onTaskFinished();
154     void onTaskDestroyed();
155
156 private: // members
157     QWaitCondition m_waitCondition;
158     QMutex m_mutex;
159
160     QctTask *m_task;
161
162     bool m_finished : 1;
163 };
164
165 #endif // QTRACKERCONTACTENGINE_P_H