|
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 "mobcntaction.h" |
|
18 |
|
19 #include <xqservicerequest.h> |
|
20 #include <qcontactphonenumber.h> |
|
21 #include <qcontactfilters.h> |
|
22 #include <QTimer> |
|
23 #include <QDebug> |
|
24 |
|
25 MobCntAction::MobCntAction(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 MobCntAction::~MobCntAction() |
|
36 { |
|
37 } |
|
38 |
|
39 QVariantMap MobCntAction::metadata() const |
|
40 { |
|
41 return QVariantMap(); |
|
42 } |
|
43 |
|
44 QContactFilter MobCntAction::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 MobCntAction::supportsDetail(const QContactDetail& detail) const |
|
95 { |
|
96 return (detail.definitionName() == QContactPhoneNumber::DefinitionName); |
|
97 } |
|
98 |
|
99 QContactActionDescriptor MobCntAction::actionDescriptor() const |
|
100 { |
|
101 QContactActionDescriptor ret; |
|
102 ret.setActionName(m_actionName); |
|
103 ret.setVendorName(m_vendorName); |
|
104 ret.setImplementationVersion(m_implementationVersion); |
|
105 return ret; |
|
106 } |
|
107 |
|
108 |
|
109 QVariantMap MobCntAction::result() const |
|
110 { |
|
111 return m_result; |
|
112 } |
|
113 |
|
114 void MobCntAction::invokeAction(const QContact& contact, const QContactDetail& detail) |
|
115 { |
|
116 m_contact = contact; |
|
117 m_detail = detail; |
|
118 |
|
119 QTimer::singleShot(1, this, SLOT(performAction())); |
|
120 } |
|
121 |
|
122 //Clears the action data, is called after the result has been emitted to contact (emitResult function) |
|
123 void MobCntAction::resetAction() |
|
124 { |
|
125 m_contact = QContact(); |
|
126 m_detail = QContactDetail(); |
|
127 } |
|
128 |
|
129 //returns whether the actionDescription is supported by this action |
|
130 bool MobCntAction::actionDescriptionSupported(const QContactActionDescriptor& descriptor) const |
|
131 { |
|
132 bool supported(false); |
|
133 |
|
134 if ((descriptor.actionName() == m_actionName) && (descriptor.vendorName() == m_vendorName) && (descriptor.implementationVersion() == m_implementationVersion)) |
|
135 supported = true; |
|
136 else |
|
137 supported = false; |
|
138 |
|
139 return supported; |
|
140 } |
|
141 |
|
142 //common code to perform a call, videocall and message action |
|
143 void MobCntAction::performNumberAction(const QString &service, const QString &type) |
|
144 { |
|
145 XQServiceRequest snd(service, type, false); |
|
146 |
|
147 QVariant retValue; |
|
148 |
|
149 //detail exist use it |
|
150 if (m_detail.definitionName() == QContactPhoneNumber::DefinitionName) |
|
151 { |
|
152 const QContactPhoneNumber &phoneNumber = static_cast<const QContactPhoneNumber &>(m_detail); |
|
153 |
|
154 snd << phoneNumber.number() << m_contact.localId() << m_contact.displayLabel(); |
|
155 |
|
156 emitResult(snd.send(retValue), retValue); |
|
157 } |
|
158 |
|
159 //if no detail, pick preferred |
|
160 else if(m_detail.isEmpty()) |
|
161 { |
|
162 QContactDetail detail = m_contact.preferredDetail(m_actionName); |
|
163 QContactPhoneNumber phoneNumber; |
|
164 |
|
165 //if preferred is empty pick first phonenumber |
|
166 if(detail.isEmpty()) |
|
167 { |
|
168 phoneNumber = m_contact.detail<QContactPhoneNumber>(); |
|
169 } |
|
170 |
|
171 //if not empty, cast detail to phonenumber |
|
172 else |
|
173 { |
|
174 phoneNumber = static_cast<QContactPhoneNumber>(detail); |
|
175 } |
|
176 |
|
177 snd << phoneNumber.number() << m_contact.localId() << m_contact.displayLabel(); |
|
178 |
|
179 emitResult(snd.send(retValue), retValue); |
|
180 } |
|
181 |
|
182 //else return an error |
|
183 else |
|
184 { |
|
185 emitResult(GeneralError, retValue); |
|
186 } |
|
187 } |
|
188 |
|
189 //emit the result to the client |
|
190 void MobCntAction::emitResult(int errorCode, const QVariant &retValue) |
|
191 { |
|
192 m_result.clear(); |
|
193 m_result.insert("Error", QVariant(errorCode)); |
|
194 m_result.insert("ReturnValue", retValue); |
|
195 |
|
196 QContactAction::Status status; |
|
197 |
|
198 if (errorCode == 0){ |
|
199 status = QContactAction::Finished; |
|
200 } |
|
201 |
|
202 else{ |
|
203 status = QContactAction::FinishedWithError; |
|
204 } |
|
205 |
|
206 emit progress(status, m_result); |
|
207 |
|
208 resetAction(); //reset values in the action |
|
209 } |