New: Introduce runQuery variants that accept a custom QSparqlConnection
[qtcontacts-tracker:hasselmms-qtcontacts-tracker.git] / src / engine / abstractrequest.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2010 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 QTRACKERABSTRACTREQUEST_H_
43 #define QTRACKERABSTRACTREQUEST_H_
44
45 #include <qtcontacts.h>
46
47 #define QTC_NO_GLOBAL_LOGGER 1
48 #include <lib/logger.h>
49 #undef QTC_NO_GLOBAL_LOGGER
50
51 QTM_USE_NAMESPACE
52
53 ////////////////////////////////////////////////////////////////////////////////////////////////////
54
55 class QContactTrackerEngine;
56
57 class QSparqlConnection;
58 class QSparqlError;
59 class QSparqlQuery;
60 class QSparqlResult;
61
62 ////////////////////////////////////////////////////////////////////////////////////////////////////
63
64 class QTrackerAbstractRequest : public QObject
65 {
66     Q_DISABLE_COPY(QTrackerAbstractRequest)
67     Q_OBJECT
68
69 protected:
70     typedef QMap<int, QContactManager::Error> ErrorMap;
71
72 protected:
73     QTrackerAbstractRequest(QContactTrackerEngine *engine, QObject *parent = 0);
74
75 public: // destructor
76     virtual ~QTrackerAbstractRequest();
77
78 public: // attributes
79     const QContactTrackerEngine * engine() const { return m_engine; }
80     QContactTrackerEngine * engine() { return m_engine; }
81
82 public: // abstract API which must be implemented
83     virtual void run() = 0;
84
85 protected: // abstract API which must be implemented
86     virtual void emitResult(QContactManager::Error error) = 0;
87
88 protected slots:
89     virtual void emitResult();
90
91 public: // overriddable methods
92     virtual void cancel();
93
94 protected: // overriddable methods
95     virtual bool handleQuerySuccess(QSparqlResult */*result*/) { return true; }
96     virtual bool handleQueryError(QSparqlResult */*result*/, QContactManager::Error /*error*/) { return true; }
97
98 protected: // internal attributes
99     QContactManager::Error lastError() const { return m_lastError; }
100     void setLastError(QContactManager::Error error) { m_lastError = error; }
101     const QctLogger & qctLogger() const { return m_logger; }
102     bool canceled() const;
103
104 protected: // internal methods
105     /**
106      * Calls emitResult through the main loop. This is needed to avoid reentrency problem.
107      * GIO-like contract: Callbacks will never be invoked before the method returns.
108      */
109     void emitResultLater();
110
111     /**
112      * Run a QSparqlQuery asynchronously.
113      */
114     QSparqlResult * runQuery(const QSparqlQuery &query);
115     QSparqlResult * runQuery(const QSparqlQuery &query, const char *slot);
116     QSparqlResult * runQuery(const QSparqlQuery &query, const char *slot,
117                              QSparqlConnection &connection);
118
119     /**
120      * Run a QSparqlQuery synchronously.
121      */
122     QSparqlResult * runQuerySync(const QSparqlQuery &query);
123     QSparqlResult * runQuerySync(const QSparqlQuery &query, QSparqlConnection &connection);
124
125     /**
126       * Logs error message and reports requested error code from event loop
127       */
128     void reportError(const QString &message, QContactManager::Error error = QContactManager::UnspecifiedError);
129     void reportError(const QList<QSparqlError> &error, const QString &details = QString());
130     void reportError(const QSparqlError &error, const QString &details = QString());
131
132     static QContactManager::Error translateError(const QSparqlError &error);
133
134 private slots: //slots
135     void onSparqlQueryFinished();
136
137 private: // fields
138     QContactTrackerEngine *const m_engine;
139     QContactManager::Error m_lastError;
140     QctLogger m_logger;
141     bool m_canceled;
142 };
143
144 #endif /* QTRACKERABSTRACTREQUEST_H_ */