2 * This file is part of ofono-qt
4 * Copyright (C) 2010-2011 Nokia Corporation and/or its subsidiary(-ies).
6 * Contact: Alexander Kanavin <alex.kanavin@gmail.com>
8 * Portions of this file are Copyright (C) 2011 Intel Corporation
9 * Contact: Shane Bryan <shane.bryan@linux.intel.com>
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * version 2.1 as published by the Free Software Foundation.
15 * This library is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
27 #include <QtDBus/QtDBus>
28 #include <QtCore/QObject>
30 #include "ofonovoicecallmanager.h"
31 #include "ofonointerface.h"
33 #define DIAL_TIMEOUT 30000
34 #define TONE_TIMEOUT 10000
35 #define TRANSFER_TIMEOUT 20000
36 #define SWAP_TIMEOUT 20000
37 #define HANGUP_TIMEOUT 30000
38 #define HOLD_TIMEOUT 30000
39 #define PRIVATE_CHAT_TIMEOUT 30000
40 #define CREATE_MULTIPARTY_TIMEOUT 30000
42 QDBusArgument &operator<<(QDBusArgument &argument, const OfonoVoiceCallManagerStruct &call)
44 argument.beginStructure();
45 argument << call.path << call.properties;
46 argument.endStructure();
50 const QDBusArgument &operator>>(const QDBusArgument &argument, OfonoVoiceCallManagerStruct &call)
52 argument.beginStructure();
53 argument >> call.path >> call.properties;
54 argument.endStructure();
58 OfonoVoiceCallManager::OfonoVoiceCallManager(OfonoModem::SelectionSetting modemSetting, const QString &modemPath, QObject *parent)
59 : OfonoModemInterface(modemSetting, modemPath, "org.ofono.VoiceCallManager", OfonoGetAllOnStartup, parent)
61 qDBusRegisterMetaType<OfonoVoiceCallManagerStruct>();
62 qDBusRegisterMetaType<OfonoVoiceCallManagerList>();
64 m_calllist = getCallList();
66 connect(m_if, SIGNAL(propertyChanged(const QString&, const QVariant&)),
67 this, SLOT(propertyChanged(const QString&, const QVariant&)));
68 connect(this, SIGNAL(validityChanged(bool)),
69 this, SLOT(validityChanged(bool)));
70 connect(modem(), SIGNAL(pathChanged(QString)), this, SLOT(pathChanged(const QString&)));
72 connectDbusSignals(path());
75 OfonoVoiceCallManager::~OfonoVoiceCallManager()
80 void OfonoVoiceCallManager::validityChanged(bool /*validity*/)
82 m_calllist = getCallList();
85 void OfonoVoiceCallManager::pathChanged(const QString& path)
87 connectDbusSignals(path);
90 QStringList OfonoVoiceCallManager::getCallList()
92 QDBusReply<OfonoVoiceCallManagerList> reply;
93 OfonoVoiceCallManagerList calls;
96 QStringList messageList;
98 qDBusRegisterMetaType<OfonoVoiceCallManagerStruct>();
99 qDBusRegisterMetaType<OfonoVoiceCallManagerList>();
101 request = QDBusMessage::createMethodCall("org.ofono",
102 path(), m_if->ifname(),
104 reply = QDBusConnection::systemBus().call(request);
107 foreach(OfonoVoiceCallManagerStruct call, calls) {
108 messageList<< call.path.path();
113 void OfonoVoiceCallManager::connectDbusSignals(const QString& path)
115 QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(),
117 SLOT(callAddedChanged(const QDBusObjectPath&, const QVariantMap&)));
119 QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(),
121 SLOT(callRemovedChanged(const QDBusObjectPath&)));
123 QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(),
125 SLOT(callAddedChanged(const QDBusObjectPath&, const QVariantMap&)));
127 QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(),
129 SLOT(callRemovedChanged(const QDBusObjectPath&)));
132 void OfonoVoiceCallManager::dial(const QString &number, const QString &callerid_hide)
134 QDBusMessage request;
135 request = QDBusMessage::createMethodCall("org.ofono",
136 path(), m_if->ifname(),
139 arg.append(QVariant(number));
140 arg.append(QVariant(callerid_hide));
141 request.setArguments(arg);
142 QDBusConnection::systemBus().callWithCallback(request, this,
144 SLOT(dialErr(const QDBusError&)),
148 void OfonoVoiceCallManager::hangupAll()
150 QDBusMessage request;
151 request = QDBusMessage::createMethodCall("org.ofono",
152 path(), m_if->ifname(),
155 QDBusConnection::systemBus().callWithCallback(request, this,
156 SLOT(hangupAllResp()),
157 SLOT(hangupAllErr(const QDBusError&)),
161 void OfonoVoiceCallManager::sendTones(const QString &tonestring)
163 QDBusMessage request;
164 request = QDBusMessage::createMethodCall("org.ofono",
165 path(), m_if->ifname(),
168 arg.append(QVariant(tonestring));
169 request.setArguments(arg);
171 QDBusConnection::systemBus().callWithCallback(request, this,
172 SLOT(sendTonesResp()),
173 SLOT(sendTonesErr(const QDBusError&)),
174 (TONE_TIMEOUT*tonestring.length()));
177 void OfonoVoiceCallManager::transfer()
179 QDBusMessage request;
180 request = QDBusMessage::createMethodCall("org.ofono",
181 path(), m_if->ifname(),
184 QDBusConnection::systemBus().callWithCallback(request, this,
185 SLOT(transferResp()),
186 SLOT(transferErr(const QDBusError&)),
190 void OfonoVoiceCallManager::swapCalls()
192 QDBusMessage request;
193 request = QDBusMessage::createMethodCall("org.ofono",
194 path(), m_if->ifname(),
197 QDBusConnection::systemBus().callWithCallback(request, this,
198 SLOT(swapCallsResp()),
199 SLOT(swapCallsErr(const QDBusError&)),
203 void OfonoVoiceCallManager::releaseAndAnswer()
205 QDBusMessage request;
206 request = QDBusMessage::createMethodCall("org.ofono",
207 path(), m_if->ifname(),
210 QDBusConnection::systemBus().callWithCallback(request, this,
211 SLOT(releaseAndAnswerResp()),
212 SLOT(releaseAndAnswerErr(const QDBusError&)),
216 void OfonoVoiceCallManager::holdAndAnswer()
218 QDBusMessage request;
219 request = QDBusMessage::createMethodCall("org.ofono",
220 path(), m_if->ifname(),
223 QDBusConnection::systemBus().callWithCallback(request, this,
224 SLOT(holdAndAnswerResp()),
225 SLOT(holdAndAnswerErr(const QDBusError&)),
229 void OfonoVoiceCallManager::privateChat(const QString &call)
231 QDBusMessage request;
232 request = QDBusMessage::createMethodCall("org.ofono",
233 path(), m_if->ifname(),
237 arg.append(qVariantFromValue(QDBusObjectPath(call)));
238 request.setArguments(arg);
239 QDBusConnection::systemBus().callWithCallback(request, this,
240 SLOT(privateChatResp()),
241 SLOT(privateChatErr(const QDBusError&)),
242 PRIVATE_CHAT_TIMEOUT);
245 void OfonoVoiceCallManager::createMultiparty()
247 QDBusMessage request;
248 request = QDBusMessage::createMethodCall("org.ofono",
249 path(), m_if->ifname(),
252 QDBusConnection::systemBus().callWithCallback(request, this,
253 SLOT(createMultipartyResp()),
254 SLOT(createMultipartyErr(const QDBusError&)),
255 CREATE_MULTIPARTY_TIMEOUT);
258 void OfonoVoiceCallManager::hangupMultiparty()
260 QDBusMessage request;
261 request = QDBusMessage::createMethodCall("org.ofono",
262 path(), m_if->ifname(),
265 QDBusConnection::systemBus().callWithCallback(request, this,
266 SLOT(hangupMultipartyResp()),
267 SLOT(hangupMultipartyErr(const QDBusError&)),
271 void OfonoVoiceCallManager::hangupMultipartyResp()
273 emit hangupMultipartyComplete(TRUE);
276 void OfonoVoiceCallManager::hangupMultipartyErr(const QDBusError &error)
278 m_if->setError(error.name(), error.message());
279 emit hangupMultipartyComplete(FALSE);
282 void OfonoVoiceCallManager::createMultipartyResp()
284 emit createMultipartyComplete(TRUE);
287 void OfonoVoiceCallManager::createMultipartyErr(const QDBusError &error)
289 m_if->setError(error.name(), error.message());
290 emit createMultipartyComplete(FALSE);
293 void OfonoVoiceCallManager::privateChatResp()
295 emit privateChatComplete(TRUE);
298 void OfonoVoiceCallManager::privateChatErr(const QDBusError &error)
300 m_if->setError(error.name(), error.message());
301 emit privateChatComplete(FALSE);
304 void OfonoVoiceCallManager::holdAndAnswerResp()
306 emit holdAndAnswerComplete(TRUE);
309 void OfonoVoiceCallManager::holdAndAnswerErr(const QDBusError &error)
311 m_if->setError(error.name(), error.message());
312 emit holdAndAnswerComplete(FALSE);
315 void OfonoVoiceCallManager::releaseAndAnswerResp()
317 emit releaseAndAnswerComplete(TRUE);
320 void OfonoVoiceCallManager::releaseAndAnswerErr(const QDBusError &error)
322 m_if->setError(error.name(), error.message());
323 emit releaseAndAnswerComplete(FALSE);
326 void OfonoVoiceCallManager::swapCallsResp()
328 emit swapCallsComplete(TRUE);
331 void OfonoVoiceCallManager::swapCallsErr(const QDBusError &error)
333 m_if->setError(error.name(), error.message());
334 emit swapCallsComplete(FALSE);
337 void OfonoVoiceCallManager::dialResp()
339 emit dialComplete(TRUE);
342 void OfonoVoiceCallManager::dialErr(const QDBusError &error)
344 m_if->setError(error.name(), error.message());
345 emit dialComplete(FALSE);
348 void OfonoVoiceCallManager::hangupAllResp()
350 emit hangupAllComplete(TRUE);
353 void OfonoVoiceCallManager::hangupAllErr(const QDBusError &error)
355 m_if->setError(error.name(), error.message());
356 emit hangupAllComplete(FALSE);
358 void OfonoVoiceCallManager::sendTonesResp()
360 emit sendTonesComplete(TRUE);
363 void OfonoVoiceCallManager::sendTonesErr(const QDBusError &error)
365 m_if->setError(error.name(), error.message());
366 emit sendTonesComplete(FALSE);
369 void OfonoVoiceCallManager::transferResp()
371 emit transferComplete(TRUE);
374 void OfonoVoiceCallManager::transferErr(const QDBusError &error)
376 m_if->setError(error.name(), error.message());
377 emit transferComplete(FALSE);
380 QStringList OfonoVoiceCallManager::emergencyNumbers() const
382 return m_if->properties()["EmergencyNumbers"].value<QStringList>();
385 void OfonoVoiceCallManager::propertyChanged(const QString &property, const QVariant &value)
387 if (property == "EmergencyNumbers") {
388 emit emergencyNumbersChanged(value.value<QStringList>());
392 QStringList OfonoVoiceCallManager::getCalls() const
397 void OfonoVoiceCallManager::callAddedChanged(const QDBusObjectPath &path, const QVariantMap& /*values*/)
399 m_calllist << path.path();
400 emit callAdded(path.path());
403 void OfonoVoiceCallManager::callRemovedChanged(const QDBusObjectPath &path)
405 m_calllist.removeAll(path.path());
406 emit callRemoved(path.path());