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 QDBusReply<OfonoVoiceCallManagerList> reply;
62 OfonoVoiceCallManagerList calls;
66 qDBusRegisterMetaType<OfonoVoiceCallManagerStruct>();
67 qDBusRegisterMetaType<OfonoVoiceCallManagerList>();
69 request = QDBusMessage::createMethodCall("org.ofono",
70 path(), m_if->ifname(),
72 reply = QDBusConnection::systemBus().call(request);
75 foreach(OfonoVoiceCallManagerStruct call, calls) {
76 m_calllist<< call.path.path();
79 connect(m_if, SIGNAL(propertyChanged(const QString&, const QVariant&)),
80 this, SLOT(propertyChanged(const QString&, const QVariant&)));
82 QDBusConnection::systemBus().connect("org.ofono",path(),m_if->ifname(),
84 SLOT(callAddedChanged(const QDBusObjectPath&, const QVariantMap&)));
86 QDBusConnection::systemBus().connect("org.ofono",path(),m_if->ifname(),
88 SLOT(callRemovedChanged(const QDBusObjectPath&)));
91 OfonoVoiceCallManager::~OfonoVoiceCallManager()
95 void OfonoVoiceCallManager::dial(const QString &number, const QString &callerid_hide)
98 request = QDBusMessage::createMethodCall("org.ofono",
99 path(), m_if->ifname(),
102 arg.append(QVariant(number));
103 arg.append(QVariant(callerid_hide));
104 request.setArguments(arg);
105 QDBusConnection::systemBus().callWithCallback(request, this,
107 SLOT(dialErr(const QDBusError&)),
111 void OfonoVoiceCallManager::hangupAll()
113 QDBusMessage request;
114 request = QDBusMessage::createMethodCall("org.ofono",
115 path(), m_if->ifname(),
118 QDBusConnection::systemBus().callWithCallback(request, this,
119 SLOT(hangupAllResp()),
120 SLOT(hangupAllErr(const QDBusError&)),
124 void OfonoVoiceCallManager::sendTones(const QString &tonestring)
126 QDBusMessage request;
127 request = QDBusMessage::createMethodCall("org.ofono",
128 path(), m_if->ifname(),
131 arg.append(QVariant(tonestring));
132 request.setArguments(arg);
134 QDBusConnection::systemBus().callWithCallback(request, this,
135 SLOT(sendTonesResp()),
136 SLOT(sendTonesErr(const QDBusError&)),
137 (TONE_TIMEOUT*tonestring.length()));
140 void OfonoVoiceCallManager::transfer()
142 QDBusMessage request;
143 request = QDBusMessage::createMethodCall("org.ofono",
144 path(), m_if->ifname(),
147 QDBusConnection::systemBus().callWithCallback(request, this,
148 SLOT(transferResp()),
149 SLOT(transferErr(const QDBusError&)),
153 void OfonoVoiceCallManager::swapCalls()
155 QDBusMessage request;
156 request = QDBusMessage::createMethodCall("org.ofono",
157 path(), m_if->ifname(),
160 QDBusConnection::systemBus().callWithCallback(request, this,
161 SLOT(swapCallsResp()),
162 SLOT(swapCallsErr(const QDBusError&)),
166 void OfonoVoiceCallManager::releaseAndAnswer()
168 QDBusMessage request;
169 request = QDBusMessage::createMethodCall("org.ofono",
170 path(), m_if->ifname(),
173 QDBusConnection::systemBus().callWithCallback(request, this,
174 SLOT(releaseAndAnswerResp()),
175 SLOT(releaseAndAnswerErr(const QDBusError&)),
179 void OfonoVoiceCallManager::holdAndAnswer()
181 QDBusMessage request;
182 request = QDBusMessage::createMethodCall("org.ofono",
183 path(), m_if->ifname(),
186 QDBusConnection::systemBus().callWithCallback(request, this,
187 SLOT(holdAndAnswerResp()),
188 SLOT(holdAndAnswerErr(const QDBusError&)),
192 void OfonoVoiceCallManager::privateChat(const QString &call)
194 QDBusMessage request;
195 request = QDBusMessage::createMethodCall("org.ofono",
196 path(), m_if->ifname(),
200 arg.append(qVariantFromValue(QDBusObjectPath(call)));
201 request.setArguments(arg);
202 QDBusConnection::systemBus().callWithCallback(request, this,
203 SLOT(privateChatResp()),
204 SLOT(privateChatErr(const QDBusError&)),
205 PRIVATE_CHAT_TIMEOUT);
208 void OfonoVoiceCallManager::createMultiparty()
210 QDBusMessage request;
211 request = QDBusMessage::createMethodCall("org.ofono",
212 path(), m_if->ifname(),
215 QDBusConnection::systemBus().callWithCallback(request, this,
216 SLOT(createMultipartyResp()),
217 SLOT(createMultipartyErr(const QDBusError&)),
218 CREATE_MULTIPARTY_TIMEOUT);
221 void OfonoVoiceCallManager::hangupMultiparty()
223 QDBusMessage request;
224 request = QDBusMessage::createMethodCall("org.ofono",
225 path(), m_if->ifname(),
228 QDBusConnection::systemBus().callWithCallback(request, this,
229 SLOT(hangupMultipartyResp()),
230 SLOT(hangupMultipartyErr(const QDBusError&)),
234 void OfonoVoiceCallManager::hangupMultipartyResp()
236 emit hangupMultipartyComplete(TRUE);
239 void OfonoVoiceCallManager::hangupMultipartyErr(const QDBusError &error)
241 m_if->setError(error.name(), error.message());
242 emit hangupMultipartyComplete(FALSE);
245 void OfonoVoiceCallManager::createMultipartyResp()
247 emit createMultipartyComplete(TRUE);
250 void OfonoVoiceCallManager::createMultipartyErr(const QDBusError &error)
252 m_if->setError(error.name(), error.message());
253 emit createMultipartyComplete(FALSE);
256 void OfonoVoiceCallManager::privateChatResp()
258 emit privateChatComplete(TRUE);
261 void OfonoVoiceCallManager::privateChatErr(const QDBusError &error)
263 m_if->setError(error.name(), error.message());
264 emit privateChatComplete(FALSE);
267 void OfonoVoiceCallManager::holdAndAnswerResp()
269 emit holdAndAnswerComplete(TRUE);
272 void OfonoVoiceCallManager::holdAndAnswerErr(const QDBusError &error)
274 m_if->setError(error.name(), error.message());
275 emit holdAndAnswerComplete(FALSE);
278 void OfonoVoiceCallManager::releaseAndAnswerResp()
280 emit releaseAndAnswerComplete(TRUE);
283 void OfonoVoiceCallManager::releaseAndAnswerErr(const QDBusError &error)
285 m_if->setError(error.name(), error.message());
286 emit releaseAndAnswerComplete(FALSE);
289 void OfonoVoiceCallManager::swapCallsResp()
291 emit swapCallsComplete(TRUE);
294 void OfonoVoiceCallManager::swapCallsErr(const QDBusError &error)
296 m_if->setError(error.name(), error.message());
297 emit swapCallsComplete(FALSE);
300 void OfonoVoiceCallManager::dialResp()
302 emit dialComplete(TRUE);
305 void OfonoVoiceCallManager::dialErr(const QDBusError &error)
307 m_if->setError(error.name(), error.message());
308 emit dialComplete(FALSE);
311 void OfonoVoiceCallManager::hangupAllResp()
313 emit hangupAllComplete(TRUE);
316 void OfonoVoiceCallManager::hangupAllErr(const QDBusError &error)
318 m_if->setError(error.name(), error.message());
319 emit hangupAllComplete(FALSE);
321 void OfonoVoiceCallManager::sendTonesResp()
323 emit sendTonesComplete(TRUE);
326 void OfonoVoiceCallManager::sendTonesErr(const QDBusError &error)
328 m_if->setError(error.name(), error.message());
329 emit sendTonesComplete(FALSE);
332 void OfonoVoiceCallManager::transferResp()
334 emit transferComplete(TRUE);
337 void OfonoVoiceCallManager::transferErr(const QDBusError &error)
339 m_if->setError(error.name(), error.message());
340 emit transferComplete(FALSE);
343 QStringList OfonoVoiceCallManager::emergencyNumbers() const
345 return m_if->properties()["EmergencyNumbers"].value<QStringList>();
348 void OfonoVoiceCallManager::propertyChanged(const QString &property, const QVariant &value)
350 if (property == "EmergencyNumbers") {
351 emit emergencyNumbersChanged(value.value<QStringList>());
355 QStringList OfonoVoiceCallManager::getCalls() const
360 void OfonoVoiceCallManager::callAddedChanged(const QDBusObjectPath &path, const QVariantMap& /*values*/)
362 m_calllist << path.path();
363 emit callAdded(path.path());
366 void OfonoVoiceCallManager::callRemovedChanged(const QDBusObjectPath &path)
368 m_calllist.removeAll(path.path());
369 emit callRemoved(path.path());