Move tracker plugin sources into src folder.
[qtcontacts-tracker:qtcontacts-tracker.git] / src / qtrackerrelationshipfetchrequest.cpp
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 #include "qtrackerrelationshipfetchrequest.h"
43
44 #include <QtTracker/Tracker>
45 using namespace SopranoLive;
46
47
48 // TODO better error handling when saving
49 QTrackerRelationshipFetchRequest::QTrackerRelationshipFetchRequest(QContactAbstractRequest* req, QContactManagerEngine* parent)
50 : QObject(parent), QTrackerContactAsyncRequest(req)
51 {
52     Q_ASSERT(req);
53     Q_ASSERT(req->type() == QContactAbstractRequest::RelationshipFetchRequest);
54     Q_ASSERT(parent);
55
56     QContactRelationshipFetchRequest* r = qobject_cast<QContactRelationshipFetchRequest*>(req);
57
58     if( !r )
59     {
60         QContactManagerEngine::updateRelationshipFetchRequest(r, QList<QContactRelationship>(), QContactManager::UnspecifiedError);
61         QContactManagerEngine::updateRequestState(req, QContactAbstractRequest::FinishedState);
62         return;
63     }
64     if (not r->relationshipType().isEmpty() && QContactRelationship::Is != r->relationshipType())
65     {
66         QContactManagerEngine::updateRelationshipFetchRequest(r, r->relationships(), QContactManager::NotSupportedError);
67         QContactManagerEngine::updateRequestState(req, QContactAbstractRequest::FinishedState);
68         return;
69     }
70     QList<QContactManager::Error> dummy;
71     QContactManagerEngine::updateRequestState(req, QContactAbstractRequest::ActiveState);
72
73     RDFVariable RDFContact = RDFVariable::fromType<nco::PersonContact>();
74     RDFVariable RDFContactThis = RDFVariable::fromType<nco::PersonContact>();
75
76     RDFVariable RDFMetacontact;
77
78     RDFContact.property<nco::metacontact>() = RDFMetacontact;
79     RDFContactThis.property<nco::metacontact>() = RDFMetacontact;
80     RDFVariable contactIdThis = RDFContactThis.property<nco::contactUID>();
81
82     contactIdThis.equal(LiteralValue(QString::number(r->first().localId())));
83
84
85     RDFSelect quer;
86     quer.addColumn("contact_id", RDFContact.property<nco::contactUID>());
87     quer.addColumn("contactthis_id", contactIdThis);
88     query = ::tracker()->modelQuery(quer);
89
90     QObject::connect(query.model(), SIGNAL(modelUpdated()), this, SLOT(modelUpdated()));
91
92 }
93
94 QTrackerRelationshipFetchRequest::~QTrackerRelationshipFetchRequest()
95 {
96 }
97
98 void QTrackerRelationshipFetchRequest::modelUpdated()
99 {
100     QContactManagerEngine *engine = qobject_cast<QContactManagerEngine *> (parent());
101     QContactRelationshipFetchRequest* r = qobject_cast<QContactRelationshipFetchRequest*>(req);
102     if( !engine )
103     {
104         QContactManagerEngine::updateRelationshipFetchRequest(r, QList<QContactRelationship>(), QContactManager::UnspecifiedError);
105         QContactManagerEngine::updateRequestState(req, QContactAbstractRequest::FinishedState);
106         return;
107     }
108
109     QList<QContactRelationship> result;
110     for(int i = 0; i < query->rowCount(); i++) {
111         bool ok, ok1;
112         QContactId idfirst;
113         idfirst.setLocalId(query->index(i, 1).data().toUInt(&ok));
114         QContactId idsecond;
115         idsecond.setLocalId(query->index(i, 0).data().toUInt(&ok1));
116
117         if (ok && ok1 ) {
118             if (idfirst.localId() == idsecond.localId())
119                 continue;
120             idfirst.setManagerUri(engine->managerUri());
121             idsecond.setManagerUri(idfirst.managerUri());
122
123             QContactRelationship rel;
124             rel.setFirst(idfirst);
125             rel.setSecond(idsecond);
126             rel.setRelationshipType(QContactRelationship::Is);
127             result.append(rel);
128         }
129     }
130
131     QContactManagerEngine::updateRelationshipFetchRequest(r, result, QContactManager::NoError);
132     QContactManagerEngine::updateRequestState(req, QContactAbstractRequest::FinishedState);
133 }
134