|
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 <qcontactphonenumber.h> |
|
21 #include <qcontactfilters.h> |
|
22 #include <QTimer> |
|
23 #include <QDebug> |
|
24 |
|
25 CntAction::CntAction(const QString &actionName) : |
|
26 m_actionName(actionName), |
|
27 m_vendorName("symbian"), |
|
28 m_implementationVersion(1), |
|
29 m_result(), |
|
30 m_contact(), |
|
31 m_detail() |
|
32 { |
|
33 } |
|
34 |
|
35 CntAction::~CntAction() |
|
36 { |
|
37 } |
|
38 |
|
39 QVariantMap CntAction::metaData() const |
|
40 { |
|
41 return QVariantMap(); |
|
42 } |
|
43 |
|
44 QContactFilter CntAction::contactFilter(const QVariant& value) const |
|
45 { |
|
46 Q_UNUSED(value); |
|
47 |
|
48 QContactUnionFilter unionFilter; |
|
49 |
|
50 QContactDetailFilter landlineFilter; |
|
51 landlineFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
52 landlineFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeLandline)); |
|
53 unionFilter << landlineFilter; |
|
54 |
|
55 QContactDetailFilter mobileFilter; |
|
56 mobileFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
57 mobileFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeMobile)); |
|
58 unionFilter << mobileFilter; |
|
59 |
|
60 QContactDetailFilter pagerFilter; |
|
61 pagerFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
62 pagerFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypePager)); |
|
63 unionFilter << pagerFilter; |
|
64 |
|
65 QContactDetailFilter voiceFilter; |
|
66 voiceFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
67 voiceFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeVoice)); |
|
68 unionFilter << voiceFilter; |
|
69 |
|
70 QContactDetailFilter modemFilter; |
|
71 modemFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
72 modemFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeModem)); |
|
73 unionFilter << modemFilter; |
|
74 |
|
75 QContactDetailFilter videoFilter; |
|
76 videoFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
77 videoFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeVideo)); |
|
78 unionFilter << videoFilter; |
|
79 |
|
80 QContactDetailFilter carFilter; |
|
81 carFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
82 carFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeCar)); |
|
83 unionFilter << carFilter; |
|
84 |
|
85 QContactDetailFilter bulletinBoardFilter; |
|
86 bulletinBoardFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); |
|
87 bulletinBoardFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeBulletinBoardSystem)); |
|
88 unionFilter << bulletinBoardFilter; |
|
89 |
|
90 return unionFilter; |
|
91 } |
|
92 |
|
93 //virtual function, common code for call, videocall and message actions |
|
94 bool CntAction::isDetailSupported(const QContactDetail &detail, const QContact &/*contact*/) const |
|
95 { |
|
96 return (detail.definitionName() == QContactPhoneNumber::DefinitionName); |
|
97 } |
|
98 |
|
99 //virtual function, common code for call, videocall and message actions |
|
100 QList<QContactDetail> CntAction::supportedDetails(const QContact& contact) const |
|
101 { |
|
102 return contact.details(QContactPhoneNumber::DefinitionName); |
|
103 } |
|
104 |
|
105 QContactActionDescriptor CntAction::actionDescriptor() const |
|
106 { |
|
107 QContactActionDescriptor ret; |
|
108 ret.setActionName(m_actionName); |
|
109 ret.setVendorName(m_vendorName); |
|
110 ret.setImplementationVersion(m_implementationVersion); |
|
111 return ret; |
|
112 } |
|
113 |
|
114 |
|
115 bool CntAction::invokeAction(const QContact& contact, const QContactDetail& detail, const QVariantMap& /*parameters*/) |
|
116 { |
|
117 m_contact = contact; |
|
118 m_detail = detail; |
|
119 |
|
120 QTimer::singleShot(1, this, SLOT(performAction())); |
|
121 m_state = QContactAction::ActiveState; |
|
122 return true; |
|
123 } |
|
124 |
|
125 QContactAction::State CntAction::state() const |
|
126 { |
|
127 return m_state; |
|
128 } |
|
129 |
|
130 QVariantMap CntAction::results() const |
|
131 { |
|
132 return m_result; |
|
133 } |
|
134 |
|
135 //Clears the action data, is called after the result has been emitted to contact (emitResult function) |
|
136 void CntAction::resetAction() |
|
137 { |
|
138 m_contact = QContact(); |
|
139 m_detail = QContactDetail(); |
|
140 } |
|
141 |
|
142 //returns whether the actionDescription is supported by this action |
|
143 bool CntAction::actionDescriptionSupported(const QContactActionDescriptor& descriptor) const |
|
144 { |
|
145 bool supported(false); |
|
146 |
|
147 if ((descriptor.actionName() == m_actionName) && (descriptor.vendorName() == m_vendorName) && (descriptor.implementationVersion() == m_implementationVersion)) |
|
148 supported = true; |
|
149 else |
|
150 supported = false; |
|
151 |
|
152 return supported; |
|
153 } |
|
154 |
|
155 //common code to perform a call, videocall and message action |
|
156 void CntAction::performNumberAction(const QString &service, const QString &type) |
|
157 { |
|
158 XQServiceRequest snd(service, type, false); |
|
159 |
|
160 QVariant retValue; |
|
161 |
|
162 //detail exist use it |
|
163 if (m_detail.definitionName() == QContactPhoneNumber::DefinitionName) |
|
164 { |
|
165 const QContactPhoneNumber &phoneNumber = static_cast<const QContactPhoneNumber &>(m_detail); |
|
166 |
|
167 snd << phoneNumber.number() << m_contact.localId() << m_contact.displayLabel(); |
|
168 |
|
169 emitResult(snd.send(retValue), retValue); |
|
170 } |
|
171 |
|
172 //if no detail, pick preferred |
|
173 else if(m_detail.isEmpty()) |
|
174 { |
|
175 QContactDetail detail = m_contact.preferredDetail(m_actionName); |
|
176 QContactPhoneNumber phoneNumber; |
|
177 |
|
178 //if preferred is empty pick first phonenumber |
|
179 if(detail.isEmpty()) |
|
180 { |
|
181 phoneNumber = m_contact.detail<QContactPhoneNumber>(); |
|
182 } |
|
183 |
|
184 //if not empty, cast detail to phonenumber |
|
185 else |
|
186 { |
|
187 phoneNumber = static_cast<QContactPhoneNumber>(detail); |
|
188 } |
|
189 |
|
190 snd << phoneNumber.number() << m_contact.localId() << m_contact.displayLabel(); |
|
191 |
|
192 emitResult(snd.send(retValue), retValue); |
|
193 } |
|
194 |
|
195 //else return an error |
|
196 else |
|
197 { |
|
198 emitResult(GeneralError, retValue); |
|
199 } |
|
200 } |
|
201 |
|
202 //emit the result to the client |
|
203 void CntAction::emitResult(int errorCode, const QVariant &retValue) |
|
204 { |
|
205 m_result.clear(); |
|
206 m_result.insert("Error", QVariant(errorCode)); |
|
207 m_result.insert("ReturnValue", retValue); |
|
208 |
|
209 if (errorCode == 0){ |
|
210 m_state = QContactAction::FinishedState; |
|
211 } |
|
212 |
|
213 else{ |
|
214 m_state = QContactAction::FinishedWithErrorState; |
|
215 } |
|
216 |
|
217 //emit progress(state, m_result); |
|
218 emit stateChanged(m_state); |
|
219 emit resultsAvailable(); |
|
220 |
|
221 resetAction(); //reset values in the action |
|
222 } |