New: contacts() and contactsIds methods, reporting filter errors
[qtcontacts-tracker:qtcontacts-tracker.git] / qtrackercontactasyncrequest.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the Qt Mobility Components.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file.  Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23 **
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
30 **
31 **
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QTRACKERCONTACTASYNCREQUEST_H_
43 #define QTRACKERCONTACTASYNCREQUEST_H_
44
45 #include <QObject>
46
47 #include <QContact>
48 #include <QContactOnlineAccount>
49 #include <QContactManager>
50
51 #include <QtTracker/Tracker>
52 #include <QtTracker/QLive>
53
54 QTM_BEGIN_NAMESPACE
55 class QContactAbstractRequest;
56 class QContactManagerEngine;
57 QTM_END_NAMESPACE
58
59 QTM_USE_NAMESPACE
60
61 /*!
62  * Current implementation only server get all contacts requests.
63  * This class is a link between QtMobility async request and tracker signals
64  */
65 class QTrackerContactAsyncRequest
66 {
67 public:
68     QTrackerContactAsyncRequest(QContactAbstractRequest* req);
69     virtual ~QTrackerContactAsyncRequest();
70
71 protected:
72     QContactAbstractRequest* req;
73 };
74
75 namespace IMAccount {
76     enum IMResultColumn {
77         URI,
78         ContactIMId,
79         ContactPresence,
80         ContactMessage,
81         ContactNickname,
82         ContactDisplayname
83     };
84 };
85
86 namespace IMContact {
87     enum IMResultColumn {
88         URI,
89         ContactId,
90         ContactIMId,
91         ContactPresence,
92         ContactMessage,
93         ContactNickname,
94         AccountType,
95         Capabilities,
96         MetaContact,
97         ServiceProvider
98     };
99 };
100
101 /*!
102  * Running QContactFetchRequest. Doing the async tracker query and when data is ready setting the
103  * finished status of request. \sa QTrackerContactFetchRequest
104  */
105 class QTrackerContactFetchRequest : public QObject, public QTrackerContactAsyncRequest
106 {
107     Q_OBJECT
108 //    Q_ENUMS(IMResultColumn)
109 public:
110     QTrackerContactFetchRequest(QContactAbstractRequest* req, QContactManagerEngine* parent);
111 public slots:
112     void contactsReady();
113     void phoneNumbersReady();
114     void emailAddressesReady();
115     void iMAcountsReady();
116
117 protected slots:
118     virtual void run();
119     virtual void emitFinished(QContactManager::Error error = QContactManager::NoError);
120
121 protected:
122     QContactManager::Error applyFilterToContact(SopranoLive::RDFVariable &variable, const QContactFilter &filter);
123     QContactManager::Error applyDetailRangeFilterToContact(SopranoLive::RDFVariable &variable, const QContactFilter &filter);
124
125     // contacts query
126     SopranoLive::LiveNodes query;
127
128     QList<SopranoLive::LiveNodes> queryPhoneNumbersNodes; // 2 - one for affiliations and another one for PersonContact
129     int queryPhoneNumbersNodesPending;
130     QList<SopranoLive::LiveNodes> queryEmailAddressNodes; // 2 - one for affiliations and another one for PersonContact
131     int queryEmailAddressNodesPending;
132     SopranoLive::LiveNodes queryIMAccountNodes;
133     int queryIMAccountNodesPending;
134
135     // result of the request - multiple queries updating it
136     QList<QContact> result;
137
138 private:
139     bool isMeContact(const QContactFilter &filter);
140     // fills received phone number from tracker to list of contacts to QContactPhoneMumber details
141     // all the following methods update \sa result
142     void processQueryPhoneNumbers(SopranoLive::LiveNodes queryPhoneNumbers, bool affiliationNumbers);
143     void processQueryEmailAddresses(SopranoLive::LiveNodes queryEmailAddresses, bool affiliationEmails);
144     void processQueryIMContacts(SopranoLive::LiveNodes queryIMContacts);
145     void validateRequest();
146     void readFromQueryRowToContact(QContact &contact, int queryRow);
147     QContact &linkContactsWithSameMetaContact(QContact &first, QContact &second);
148     void addContactToResultSet(QContact &contact, const QString &metacontact);
149     QContactOnlineAccount getOnlineAccountFromIMQuery(SopranoLive::LiveNodes imAccountQuery, int queryRow);
150     QContactOnlineAccount getIMAccountFromIMQuery(SopranoLive::LiveNodes imAccountQuery, int queryRow) ;
151     QContactOnlineAccount getIMContactFromIMQuery(SopranoLive::LiveNodes imAccountQuery, int queryRow);
152
153     // access existing contacts in result list, contactid to index in \sa result lookup
154     QHash<quint32, int> id2ContactLookup;
155     // metacontact to index in \sa result lookup - index of metacontact contact: only 1 contact returned when multiple have the same metacontact
156     QHash<QString, int> metacontactLookup;
157 };
158
159 #endif /* QTRACKERCONTACTASYNCREQUEST_H_ */