|
1 /* |
|
2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: |
|
15 * |
|
16 */ |
|
17 #include "cntaction.h" |
|
18 |
|
19 #include <xqservicerequest.h> |
|
20 #include <xqappmgr.h> |
|
21 #include <qcontactphonenumber.h> |
|
22 #include <qcontactfilters.h> |
|
23 #include <QTimer> |
|
24 #include <QDebug> |
|
25 |
|
26 CntAction::CntAction(const QString &actionName) : |
|
27 m_actionName(actionName), |
|
28 m_vendorName("symbian"), |
|
29 m_implementationVersion(1), |
|
30 m_result(), |
|
31 m_contact(), |
|
32 m_detail(), |
|
33 m_request(NULL) |
|
34 { |
|
35 } |
|
36 |
|
37 CntAction::~CntAction() |
|
38 { |
|
39 delete m_request; |
|
40 m_request = NULL; |
|
41 } |
|
42 |
|
43 QVariantMap CntAction::metaData() const |
|
44 { |
|
45 return QVariantMap(); |
|
46 } |
|
47 |
|
48 QContactFilter CntAction::contactFilter(const QVariant& value) const |
|
49 { |
|
50 Q_UNUSED(value); |
|
51 |
|
52 QContactUnionFilter unionFilter; |
|
53 |
|
54 QContactDetailFilter landlineFilter; |
|
55 landlineFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
56 landlineFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeLandline)); |
|
57 unionFilter << landlineFilter; |
|
58 |
|
59 QContactDetailFilter mobileFilter; |
|
60 mobileFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
61 mobileFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeMobile)); |
|
62 unionFilter << mobileFilter; |
|
63 |
|
64 QContactDetailFilter pagerFilter; |
|
65 pagerFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
66 pagerFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypePager)); |
|
67 unionFilter << pagerFilter; |
|
68 |
|
69 QContactDetailFilter voiceFilter; |
|
70 voiceFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
71 voiceFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeVoice)); |
|
72 unionFilter << voiceFilter; |
|
73 |
|
74 QContactDetailFilter modemFilter; |
|
75 modemFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
76 modemFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeModem)); |
|
77 unionFilter << modemFilter; |
|
78 |
|
79 QContactDetailFilter videoFilter; |
|
80 videoFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
81 videoFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeVideo)); |
|
82 unionFilter << videoFilter; |
|
83 |
|
84 QContactDetailFilter carFilter; |
|
85 carFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
86 carFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeCar)); |
|
87 unionFilter << carFilter; |
|
88 |
|
89 QContactDetailFilter bulletinBoardFilter; |
|
90 bulletinBoardFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
91 bulletinBoardFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeBulletinBoardSystem)); |
|
92 unionFilter << bulletinBoardFilter; |
|
93 |
|
94 return unionFilter; |
|
95 } |
|
96 |
|
97 //virtual function, common code for call, videocall and message actions |
|
98 bool CntAction::isDetailSupported(const QContactDetail &detail, const QContact &/*contact*/) const |
|
99 { |
|
100 return (detail.definitionName() == QContactPhoneNumber::DefinitionName); |
|
101 } |
|
102 |
|
103 //virtual function, common code for call, videocall and message actions |
|
104 QList<QContactDetail> CntAction::supportedDetails(const QContact& contact) const |
|
105 { |
|
106 return contact.details(QContactPhoneNumber::DefinitionName); |
|
107 } |
|
108 |
|
109 QContactActionDescriptor CntAction::actionDescriptor() const |
|
110 { |
|
111 QContactActionDescriptor ret; |
|
112 ret.setActionName(m_actionName); |
|
113 ret.setVendorName(m_vendorName); |
|
114 ret.setImplementationVersion(m_implementationVersion); |
|
115 return ret; |
|
116 } |
|
117 |
|
118 |
|
119 bool CntAction::invokeAction(const QContact& contact, const QContactDetail& detail, const QVariantMap& data) |
|
120 { |
|
121 m_contact = contact; |
|
122 m_detail = detail; |
|
123 m_data = data; |
|
124 |
|
125 QTimer::singleShot(1, this, SLOT(performAction())); |
|
126 m_state = QContactAction::ActiveState; |
|
127 return true; |
|
128 } |
|
129 |
|
130 QContactAction::State CntAction::state() const |
|
131 { |
|
132 return m_state; |
|
133 } |
|
134 |
|
135 QVariantMap CntAction::results() const |
|
136 { |
|
137 return m_result; |
|
138 } |
|
139 |
|
140 //Clears the action data, is called after the result has been emitted to contact (emitResult function) |
|
141 void CntAction::resetAction() |
|
142 { |
|
143 m_contact = QContact(); |
|
144 m_detail = QContactDetail(); |
|
145 } |
|
146 |
|
147 //returns whether the actionDescription is supported by this action |
|
148 bool CntAction::actionDescriptionSupported(const QContactActionDescriptor& descriptor) const |
|
149 { |
|
150 bool supported(false); |
|
151 |
|
152 if ((descriptor.actionName() == m_actionName) && (descriptor.vendorName() == m_vendorName) && (descriptor.implementationVersion() == m_implementationVersion)) |
|
153 supported = true; |
|
154 else |
|
155 supported = false; |
|
156 |
|
157 return supported; |
|
158 } |
|
159 |
|
160 //common code to perform a call, videocall action |
|
161 void CntAction::performNumberAction(const QString &interface, const QString &operation) |
|
162 { |
|
163 QVariant retValue; |
|
164 |
|
165 // XQApplicationManager is not supported by PhoneUI to initiate calls, |
|
166 // only old approarch using XQServiceRequest can be used. |
|
167 XQServiceRequest snd(interface, operation); //sync request |
|
168 |
|
169 //QContactType == TypeGroup |
|
170 if (QContactType::TypeGroup == m_contact.type()) { |
|
171 QContactPhoneNumber conferenceCall = m_contact.detail<QContactPhoneNumber>(); |
|
172 |
|
173 snd << conferenceCall.number() << m_contact.localId() << m_contact.displayLabel(); |
|
174 snd.send(retValue); |
|
175 emitResult(snd.latestError(), retValue); |
|
176 } |
|
177 //QContactType == TypeContact |
|
178 //detail exist use it |
|
179 else if (m_detail.definitionName() == QContactPhoneNumber::DefinitionName) { |
|
180 const QContactPhoneNumber &phoneNumber = static_cast<const QContactPhoneNumber &>(m_detail); |
|
181 |
|
182 snd << phoneNumber.number() << m_contact.localId() << m_contact.displayLabel(); |
|
183 snd.send(retValue); |
|
184 emitResult(snd.latestError(), retValue); |
|
185 } |
|
186 //QContactType == TypeContact |
|
187 //if no detail, pick preferred |
|
188 else if (m_detail.isEmpty()) |
|
189 { |
|
190 QContactDetail detail = m_contact.preferredDetail(m_actionName); |
|
191 QContactPhoneNumber phoneNumber; |
|
192 |
|
193 //if preferred is empty pick first phonenumber |
|
194 if (detail.isEmpty()) { |
|
195 phoneNumber = m_contact.detail<QContactPhoneNumber>(); |
|
196 } |
|
197 |
|
198 //if not empty, cast detail to phonenumber |
|
199 else { |
|
200 phoneNumber = static_cast<QContactPhoneNumber>(detail); |
|
201 } |
|
202 |
|
203 snd << phoneNumber.number() << m_contact.localId() << m_contact.displayLabel(); |
|
204 snd.send(retValue); |
|
205 emitResult(snd.latestError(), retValue); |
|
206 } |
|
207 //else return an error |
|
208 else { |
|
209 emitResult(GeneralError, retValue); |
|
210 } |
|
211 } |
|
212 |
|
213 //emit the result to the client |
|
214 void CntAction::emitResult(int errorCode, const QVariant &retValue) |
|
215 { |
|
216 m_result.clear(); |
|
217 m_result.insert("Error", QVariant(errorCode)); |
|
218 m_result.insert("ReturnValue", retValue); |
|
219 if (m_request) { |
|
220 m_result.insert("XQAiwRequest Error", m_request->lastError()); |
|
221 } |
|
222 |
|
223 if (errorCode == 0) { |
|
224 m_state = QContactAction::FinishedState; |
|
225 } |
|
226 |
|
227 else { |
|
228 m_state = QContactAction::FinishedWithErrorState; |
|
229 } |
|
230 |
|
231 //emit progress(state, m_result); |
|
232 emit stateChanged(m_state); |
|
233 emit resultsAvailable(); |
|
234 |
|
235 resetAction(); //reset values in the action |
|
236 } |