1
/****************************************************************************
3
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4
** Contact: http://www.qt-project.org/legal
6
** This file is part of the QtContacts module of the Qt Toolkit.
8
** $QT_BEGIN_LICENSE:LGPL$
9
** Commercial License Usage
10
** Licensees holding valid commercial Qt licenses may use this file in
11
** accordance with the commercial license agreement provided with the
12
** Software or, alternatively, in accordance with the terms contained in
13
** a written agreement between you and Digia. For licensing terms and
14
** conditions see http://qt.digia.com/licensing. For further information
15
** use the contact form at http://qt.digia.com/contact-us.
17
** GNU Lesser General Public License Usage
18
** Alternatively, this file may be used under the terms of the GNU Lesser
19
** General Public License version 2.1 as published by the Free Software
20
** Foundation and appearing in the file LICENSE.LGPL included in the
21
** packaging of this file. Please review the following information to
22
** ensure the GNU Lesser General Public License version 2.1 requirements
23
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25
** In addition, as a special exception, Digia gives you certain additional
26
** rights. These rights are described in the Digia Qt LGPL Exception
27
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29
** GNU General Public License Usage
30
** Alternatively, this file may be used under the terms of the GNU
31
** General Public License version 3.0 as published by the Free Software
32
** Foundation and appearing in the file LICENSE.GPL included in the
33
** packaging of this file. Please review the following information to
34
** ensure the GNU General Public License version 3.0 requirements will be
35
** met: http://www.gnu.org/copyleft/gpl.html.
40
****************************************************************************/
41
#include <QVariantMap>
44
#include "qcontactjsondbengine.h"
45
#include "qcontactjsondbconverter.h"
46
#include "qcontactjsondbglobal.h"
47
#include "qcontactjsondbstring.h"
48
#include "qcontactjsondbrequesthandler.h"
53
QT_BEGIN_NAMESPACE_CONTACTS
56
class QContactJsonDbEngine
57
\brief The QContactJsonDbEngine class provides an implementation of
58
QContactManagerEngine whose functions always return an error.
63
QContactJsonDbEngine::QContactJsonDbEngine(const QMap<QString, QString>& parameters)
66
m_requestHandler = new QContactJsonDbRequestHandler();
67
qRegisterMetaType<QContactAbstractRequest::State>("QContactAbstractRequest::State");
68
qRegisterMetaType<QList<QContactId> >("QList<QContactId>");
69
qRegisterMetaType<QContactId>("QContactId");
70
m_thread = new QThread();
72
connect(this, SIGNAL(requestReceived(QContactAbstractRequest*)),
73
m_requestHandler, SLOT(handleRequest(QContactAbstractRequest*)));
74
m_requestHandler->moveToThread(m_thread);
75
QMetaObject::invokeMethod(m_requestHandler,"init",Qt::BlockingQueuedConnection);
76
m_requestHandler->setEngine(this);
83
QContactJsonDbEngine::~QContactJsonDbEngine()
86
m_requestHandler->deleteLater();
100
bool QContactJsonDbEngine::startRequest(QContactAbstractRequest* req){
101
QContactManagerEngine::updateRequestState(req, QContactAbstractRequest::ActiveState);
102
connect(req, SIGNAL(destroyed(QObject*)), m_requestHandler, SLOT(removeDestroyed(QObject*)),Qt::QueuedConnection);
103
emit requestReceived(req);
112
QString QContactJsonDbEngine::managerName() const
114
return QContactJsonDbStr::contactJsonDbEngineName();
117
QList<QContactDetail::DetailType> QContactJsonDbEngine::supportedContactDetailTypes() const
119
QList<QContactDetail::DetailType> supportedDetails;
120
supportedDetails << QContactAddress::Type
121
<< QContactAvatar::Type
122
<< QContactBirthday::Type
123
<< QContactDisplayLabel::Type
124
<< QContactEmailAddress::Type
125
<< QContactExtendedDetail::Type
126
<< QContactGender::Type
127
<< QContactGuid::Type
128
<< QContactName::Type
129
<< QContactNickname::Type
130
<< QContactNote::Type
131
<< QContactOrganization::Type
132
<< QContactPhoneNumber::Type
133
<< QContactRingtone::Type
134
<< QContactSyncTarget::Type
135
<< QContactType::Type
137
<< QContactVersion::Type;
138
return supportedDetails;
143
bool QContactJsonDbEngine::validateContact(const QContact& contact, QContactManager::Error* error) const
145
QContactManagerEngine::validateContact(contact, error);
146
if ((*error == QContactManager::InvalidContactTypeError) || (*error == QContactManager::DoesNotExistError))
149
QList<QContactDetail> contactDetailList = contact.details();
151
for (int i=0; i<contactDetailList.count(); i++)
153
QContactDetail currentDetail = contactDetailList.value(i);
154
if (!supportedContactDetailTypes().contains(currentDetail.type()))
156
*error = QContactManager::InvalidDetailError;
161
*error = QContactManager::NoError;
166
QContactId QContactJsonDbEngine::selfContactId(QContactManager::Error* error) const
168
// TODO: THE IDENTIFICATION FIELD DOES NOT EXIST YET IN JSON SCHEMA!
169
// Just return "NotSupported" error
170
*error = QContactManager::NotSupportedError;
175
QList<QContactId> QContactJsonDbEngine::contactIds(const QContactFilter& filter, const QList<QContactSortOrder>& sortOrders, QContactManager::Error* error) const
177
QContactJsonDbConverter converter;
178
QList<QContactId> contactIds;
180
QContactFetchRequest request;
181
request.setFilter(filter);
182
request.setSorting(sortOrders);
183
*error = QContactManager::NoError;
184
//QString query = converter.queryFromRequest(&request);
185
doSyncRequest(&request, 5000);
186
*error = request.error();
187
if (*error != QContactManager::NoError) {
188
if (qt_debug_jsondb_contacts())
189
qDebug() << "[QContactJsonDb] Error at " << Q_FUNC_INFO << ":" << *error;
190
return QList<QContactId>();
192
QList<QContact> queryResults = (QList<QContact>)request.contacts();
193
// found any results?
194
if(queryResults.size() == 0) {
195
*error = QContactManager::DoesNotExistError;
196
qDebug() << "Error by function contactIds: no contacts found (DoesNotExistError)";
197
return QList<QContactId>();
199
// Convert results for needed format
200
QList<QContactId> results;
202
foreach (const QContact &contact, queryResults)
203
results.append(contact.id());
212
QList<QContact> QContactJsonDbEngine::contacts(const QContactFilter & filter, const QList<QContactSortOrder> & sortOrders, const QContactFetchHint & fetchHint, QContactManager::Error* error ) const
214
// TODO: ERROR HANDLING (?)
215
QList<QContact> contacts;
216
QContactJsonDbConverter converter;
217
QContactFetchRequest fetchReq;
218
fetchReq.setFilter(filter);
219
fetchReq.setSorting(sortOrders);
220
fetchReq.setFetchHint(fetchHint);
221
*error = QContactManager::NoError;
222
//QString query = converter.queryFromRequest(&fetchReq);
223
doSyncRequest(&fetchReq, 5000);
224
*error = fetchReq.error();
225
if (*error != QContactManager::NoError) {
226
if (qt_debug_jsondb_contacts())
227
qDebug() << "[QContactJsonDb] Error at " << Q_FUNC_INFO << ":" << *error;
228
return QList<QContact>();
230
QList<QContact> queryResults = (QList<QContact>)fetchReq.contacts();
231
// found any results?
232
if(queryResults.size() == 0) {
233
*error = QContactManager::DoesNotExistError;
234
qDebug() << "Error by function contacts: no contacts found (DoesNotExistError)";
235
return QList<QContact>();
239
converter.toQContacts(jsonDbObjectList, contacts, *this, *error);
248
QContact QContactJsonDbEngine::contact(const QContactId& contactId, const QContactFetchHint& fetchHint, QContactManager::Error* error) const
251
QContactJsonDbConverter converter;
252
QContactFetchRequest request;
253
QList<QContactId> filterIds;
254
QContactIdFilter idFilter;
256
QVariantList results;
258
filterIds.append(contactId);
259
idFilter.setIds(filterIds);
260
request.setFilter(idFilter);
261
request.setFetchHint(fetchHint);
262
*error = QContactManager::NoError;
264
//query = converter.queryFromRequest(&request);
265
doSyncRequest(&request, 5000);
266
*error = request.error();
267
if (*error != QContactManager::NoError) {
268
if (qt_debug_jsondb_contacts())
269
qDebug() << "[QContactJsonDb] Error at " << Q_FUNC_INFO << ":" << *error;
272
QList<QContact> queryResults = (QList<QContact>)request.contacts();
273
// Check if query returned a value and it can be converted
274
if(queryResults.size() == 0) {
275
*error = QContactManager::DoesNotExistError;
276
qDebug() << "Error by function contact: no contact found (DoesNotExistError)";
280
// Extract the desired results
281
foreach (QContact curr, queryResults) {
282
if (curr.id() == contactId) contact = curr; ;
290
bool QContactJsonDbEngine::saveContacts(QList<QContact>* contacts, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error* error)
292
QContactSaveRequest saveReq;
294
saveReq.setContacts(*contacts);
295
doSyncRequest(&saveReq, 5000);
296
*error = saveReq.error();
297
if (*error != QContactManager::NoError) {
298
if (qt_debug_jsondb_contacts())
299
qDebug() << "[QContactJsonDb] Error at " << Q_FUNC_INFO << ":" << *error;
302
for (int i = 0; i < saveReq.contacts().size(); i++)
303
contacts->replace(i, saveReq.contacts()[i]);
304
*errorMap = saveReq.errorMap();
305
return *error == QContactManager::NoError; // No problem detected, return NoError
312
bool QContactJsonDbEngine::removeContacts(const QList<QContactId>& ids, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error* error)
314
QContactRemoveRequest removeReq;
315
removeReq.setContactIds(ids);
316
doSyncRequest(&removeReq, 5000);
317
*error = removeReq.error();
318
*errorMap = removeReq.errorMap();
319
if (*error != QContactManager::NoError) {
320
qWarning() << "Error at function removeContacts:" << *error;
327
bool QContactJsonDbEngine::saveContact(QContact* contact, QContactManager::Error* error)
329
QContactSaveRequest saveReq;
330
*error = QContactManager::NoError;
332
saveReq.setContact(*contact);
333
doSyncRequest(&saveReq, 5000);
334
*error = saveReq.error();
335
if (*error != QContactManager::NoError) {
336
if (qt_debug_jsondb_contacts())
337
qDebug() << "[QContactJsonDb] Error at " << Q_FUNC_INFO << ":" << *error;
340
*contact = saveReq.contacts().first(); // Check if this is the desired behavior !!!
341
return *error == QContactManager::NoError; // No problem detected, return NoError
346
bool QContactJsonDbEngine::removeContact(const QContactId& contactId, QContactManager::Error* error)
351
QContactRemoveRequest removeReq;
352
*error = QContactManager::NoError;
353
removeReq.setContactId(contactId);
354
doSyncRequest(&removeReq, 5000);
355
*error = removeReq.error();
356
if (*error != QContactManager::NoError) {
357
if (qt_debug_jsondb_contacts())
358
qDebug() << "[QContactJsonDb] Error at " << Q_FUNC_INFO << ":" << *error;
364
bool QContactJsonDbEngine::isFilterSupported(const QContactFilter& filter) const
366
switch (filter.type()) {
367
case QContactFilter::ContactDetailFilter: {
368
QContactDetailFilter detailFilter = static_cast<QContactDetailFilter>(filter);
369
int field = detailFilter.detailField();
372
switch (detailFilter.detailType()) {
373
case QContactDetail::TypeEmailAddress:
374
if (field != QContactEmailAddress::FieldEmailAddress)
376
case QContactDetail::TypePhoneNumber:
377
if (field != QContactPhoneNumber::FieldNumber)
379
case QContactDetail::TypeUrl:
380
if (field != QContactUrl::FieldUrl)
382
case QContactDetail::TypeName:
389
case QContactFilter::InvalidFilter:
390
case QContactFilter::DefaultFilter:
391
case QContactFilter::IdFilter:
392
case QContactFilter::IntersectionFilter:
399
QList<QVariant::Type> QContactJsonDbEngine::supportedDataTypes() const {
400
QList<QVariant::Type> st;
401
st.append(QVariant::String);
402
st.append(QVariant::Int);
403
st.append(QVariant::UInt);
404
st.append(QVariant::Double);
405
st.append(QVariant::Date);
406
st.append(QVariant::DateTime);
407
st.append(QVariant::Bool);
408
st.append(QVariant::Url);
412
void QContactJsonDbEngine::requestDestroyed(QContactAbstractRequest* req){
413
//We inform the handler that this request is about to be destroyed so as to
414
//avoid that the worker handler thread will start handling request objects during
416
QMetaObject::invokeMethod(m_requestHandler,"removeDestroyed",Qt::BlockingQueuedConnection,Q_ARG(QObject*, req));
417
return QContactManagerEngine::requestDestroyed(req);
420
bool QContactJsonDbEngine::cancelRequest(QContactAbstractRequest* req){
424
Cancel an in progress async request. If not possible, return false from here.
426
return QContactManagerEngine::cancelRequest(req);
429
bool QContactJsonDbEngine::waitForRequestProgress(QContactAbstractRequest* req, int msecs){
432
//TODO: can we get progress info from jsondb??
437
bool QContactJsonDbEngine::waitForRequestFinished(QContactAbstractRequest* req, int msecs){
439
result = m_requestHandler->waitForRequestFinished(req, msecs);
443
bool QContactJsonDbEngine::doSyncRequest(QContactAbstractRequest* req, int msecs) const {
444
Q_UNUSED(msecs); // TODO
445
//if (req->ContactFetchRequest)
446
const_cast<QContactJsonDbEngine*>(this)->startRequest(req);
447
const_cast<QContactJsonDbEngine*>(this)->waitForRequestFinished(req, 0);
448
//if (req->FinishedState)
449
if (req->isFinished() == true)
456
/* Internal, for debugging */
457
bool qt_debug_jsondb_contacts()
459
static int debug_env = -1;
461
debug_env = QT_PREPEND_NAMESPACE(qgetenv)("QT_DEBUG_JSONDB_CONTACTS").toInt();
463
return debug_env != 0;
466
#include "moc_qcontactjsondbengine.cpp"
468
QT_END_NAMESPACE_CONTACTS