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&)));
118
QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(),
120
SLOT(callRemovedChanged(const QDBusObjectPath&)));
121
QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(),
122
"BarringActive", this,
123
SIGNAL(barringActive(const QString&)));
124
QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(),
126
SIGNAL(forwarded(const QString&)));
128
QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(),
130
SLOT(callAddedChanged(const QDBusObjectPath&, const QVariantMap&)));
131
QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(),
133
SLOT(callRemovedChanged(const QDBusObjectPath&)));
134
QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(),
135
"BarringActive", this,
136
SIGNAL(barringActive(const QString&)));
137
QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(),
139
SIGNAL(forwarded(const QString&)));
142
QDBusObjectPath OfonoVoiceCallManager::dial(const QString &number, const QString &callerid_hide)
144
QDBusMessage request;
145
QDBusReply<QDBusObjectPath> reply;
146
QDBusObjectPath objpath;
147
request = QDBusMessage::createMethodCall("org.ofono",
148
path(), m_if->ifname(),
151
arg.append(QVariant(number));
152
arg.append(QVariant(callerid_hide));
153
request.setArguments(arg);
155
reply = QDBusConnection::systemBus().call(request);
156
if (reply.isValid()) {
162
void OfonoVoiceCallManager::hangupAll()
164
QDBusMessage request;
165
request = QDBusMessage::createMethodCall("org.ofono",
166
path(), m_if->ifname(),
169
QDBusConnection::systemBus().callWithCallback(request, this,
170
SLOT(hangupAllResp()),
171
SLOT(hangupAllErr(const QDBusError&)),
175
void OfonoVoiceCallManager::sendTones(const QString &tonestring)
177
QDBusMessage request;
178
request = QDBusMessage::createMethodCall("org.ofono",
179
path(), m_if->ifname(),
182
arg.append(QVariant(tonestring));
183
request.setArguments(arg);
185
QDBusConnection::systemBus().callWithCallback(request, this,
186
SLOT(sendTonesResp()),
187
SLOT(sendTonesErr(const QDBusError&)),
188
(TONE_TIMEOUT*tonestring.length()));
191
void OfonoVoiceCallManager::transfer()
193
QDBusMessage request;
194
request = QDBusMessage::createMethodCall("org.ofono",
195
path(), m_if->ifname(),
198
QDBusConnection::systemBus().callWithCallback(request, this,
199
SLOT(transferResp()),
200
SLOT(transferErr(const QDBusError&)),
204
void OfonoVoiceCallManager::swapCalls()
206
QDBusMessage request;
207
request = QDBusMessage::createMethodCall("org.ofono",
208
path(), m_if->ifname(),
211
QDBusConnection::systemBus().callWithCallback(request, this,
212
SLOT(swapCallsResp()),
213
SLOT(swapCallsErr(const QDBusError&)),
217
void OfonoVoiceCallManager::releaseAndAnswer()
219
QDBusMessage request;
220
request = QDBusMessage::createMethodCall("org.ofono",
221
path(), m_if->ifname(),
224
QDBusConnection::systemBus().callWithCallback(request, this,
225
SLOT(releaseAndAnswerResp()),
226
SLOT(releaseAndAnswerErr(const QDBusError&)),
230
void OfonoVoiceCallManager::holdAndAnswer()
232
QDBusMessage request;
233
request = QDBusMessage::createMethodCall("org.ofono",
234
path(), m_if->ifname(),
237
QDBusConnection::systemBus().callWithCallback(request, this,
238
SLOT(holdAndAnswerResp()),
239
SLOT(holdAndAnswerErr(const QDBusError&)),
243
void OfonoVoiceCallManager::privateChat(const QString &call)
245
QDBusMessage request;
246
request = QDBusMessage::createMethodCall("org.ofono",
247
path(), m_if->ifname(),
251
arg.append(qVariantFromValue(QDBusObjectPath(call)));
252
request.setArguments(arg);
253
QDBusConnection::systemBus().callWithCallback(request, this,
254
SLOT(privateChatResp(const QList<QDBusObjectPath>&)),
255
SLOT(privateChatErr(const QDBusError&)),
256
PRIVATE_CHAT_TIMEOUT);
259
void OfonoVoiceCallManager::createMultiparty()
261
QDBusMessage request;
262
request = QDBusMessage::createMethodCall("org.ofono",
263
path(), m_if->ifname(),
266
QDBusConnection::systemBus().callWithCallback(request, this,
267
SLOT(createMultipartyResp(const QList<QDBusObjectPath>&)),
268
SLOT(createMultipartyErr(const QDBusError&)),
269
CREATE_MULTIPARTY_TIMEOUT);
272
void OfonoVoiceCallManager::hangupMultiparty()
274
QDBusMessage request;
275
request = QDBusMessage::createMethodCall("org.ofono",
276
path(), m_if->ifname(),
279
QDBusConnection::systemBus().callWithCallback(request, this,
280
SLOT(hangupMultipartyResp()),
281
SLOT(hangupMultipartyErr(const QDBusError&)),
285
void OfonoVoiceCallManager::hangupMultipartyResp()
287
emit hangupMultipartyComplete(true);
290
void OfonoVoiceCallManager::hangupMultipartyErr(const QDBusError &error)
292
m_if->setError(error.name(), error.message());
293
emit hangupMultipartyComplete(false);
296
void OfonoVoiceCallManager::createMultipartyResp(const QList<QDBusObjectPath> &paths)
299
foreach(QDBusObjectPath path, paths)
300
calls << path.path();
301
emit createMultipartyComplete(true, calls);
304
void OfonoVoiceCallManager::createMultipartyErr(const QDBusError &error)
306
m_if->setError(error.name(), error.message());
307
emit createMultipartyComplete(false, QStringList());
310
void OfonoVoiceCallManager::privateChatResp(const QList<QDBusObjectPath> &paths)
313
foreach(QDBusObjectPath path, paths)
314
calls << path.path();
315
emit privateChatComplete(true, calls);
318
void OfonoVoiceCallManager::privateChatErr(const QDBusError &error)
320
m_if->setError(error.name(), error.message());
321
emit privateChatComplete(false, QStringList());
324
void OfonoVoiceCallManager::holdAndAnswerResp()
326
emit holdAndAnswerComplete(true);
329
void OfonoVoiceCallManager::holdAndAnswerErr(const QDBusError &error)
331
m_if->setError(error.name(), error.message());
332
emit holdAndAnswerComplete(false);
335
void OfonoVoiceCallManager::releaseAndAnswerResp()
337
emit releaseAndAnswerComplete(true);
340
void OfonoVoiceCallManager::releaseAndAnswerErr(const QDBusError &error)
342
m_if->setError(error.name(), error.message());
343
emit releaseAndAnswerComplete(false);
346
void OfonoVoiceCallManager::swapCallsResp()
348
emit swapCallsComplete(true);
351
void OfonoVoiceCallManager::swapCallsErr(const QDBusError &error)
353
m_if->setError(error.name(), error.message());
354
emit swapCallsComplete(false);
357
void OfonoVoiceCallManager::dialResp()
359
emit dialComplete(true);
362
void OfonoVoiceCallManager::dialErr(const QDBusError &error)
364
m_if->setError(error.name(), error.message());
365
emit dialComplete(false);
368
void OfonoVoiceCallManager::hangupAllResp()
370
emit hangupAllComplete(true);
373
void OfonoVoiceCallManager::hangupAllErr(const QDBusError &error)
375
m_if->setError(error.name(), error.message());
376
emit hangupAllComplete(false);
378
void OfonoVoiceCallManager::sendTonesResp()
380
emit sendTonesComplete(true);
383
void OfonoVoiceCallManager::sendTonesErr(const QDBusError &error)
385
m_if->setError(error.name(), error.message());
386
emit sendTonesComplete(false);
389
void OfonoVoiceCallManager::transferResp()
391
emit transferComplete(true);
394
void OfonoVoiceCallManager::transferErr(const QDBusError &error)
396
m_if->setError(error.name(), error.message());
397
emit transferComplete(false);
400
QStringList OfonoVoiceCallManager::emergencyNumbers() const
402
return m_if->properties()["EmergencyNumbers"].value<QStringList>();
405
void OfonoVoiceCallManager::propertyChanged(const QString &property, const QVariant &value)
407
if (property == "EmergencyNumbers") {
408
emit emergencyNumbersChanged(value.value<QStringList>());
412
QStringList OfonoVoiceCallManager::getCalls() const
417
void OfonoVoiceCallManager::callAddedChanged(const QDBusObjectPath &path, const QVariantMap& values)
419
m_calllist << path.path();
420
emit callAdded(path.path(), values);
423
void OfonoVoiceCallManager::callRemovedChanged(const QDBusObjectPath &path)
425
m_calllist.removeAll(path.path());
426
emit callRemoved(path.path());