2 * This file is part of Jenirok.
4 * Jenirok is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * Jenirok is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with Jenirok. If not, see <http://www.gnu.org/licenses/>.
20 #include <QApplication>
21 #include <QtCore/QTimerEvent>
22 #include <QtCore/QVariant>
23 #include <icd/dbus_api.h>
24 #include "connectionmanager.h"
27 ConnectionManager::ConnectionManager(QObject* parent): QObject(parent),
28 ready_(false), connected_(false), timeout_(false), ignoreStateChanges_(false),
31 QDBusConnection systemBus = QDBusConnection::systemBus();
33 icd2interface_ = new QDBusInterface(ICD_DBUS_API_INTERFACE,
34 ICD_DBUS_API_PATH, ICD_DBUS_API_INTERFACE,
37 systemBus.connect(ICD_DBUS_API_INTERFACE, ICD_DBUS_API_PATH,
38 ICD_DBUS_API_INTERFACE, ICD_DBUS_API_STATE_SIG,
39 this, SLOT(stateChange(const QDBusMessage&)));
41 systemBus.connect(ICD_DBUS_API_INTERFACE, ICD_DBUS_API_PATH,
42 ICD_DBUS_API_INTERFACE, ICD_DBUS_API_CONNECT_SIG,
43 this, SLOT(connectionChange(const QDBusMessage&)));
48 ConnectionManager::~ConnectionManager()
50 QDBusConnection systemBus = QDBusConnection::systemBus();
52 systemBus.disconnect(ICD_DBUS_API_INTERFACE, ICD_DBUS_API_PATH,
53 ICD_DBUS_API_INTERFACE, ICD_DBUS_API_STATE_SIG,
54 this, SLOT(stateChange(const QDBusMessage&)));
56 systemBus.disconnect(ICD_DBUS_API_INTERFACE, ICD_DBUS_API_PATH,
57 ICD_DBUS_API_INTERFACE, ICD_DBUS_API_CONNECT_SIG,
58 this, SLOT(connectionChange(const QDBusMessage&)));
61 bool ConnectionManager::connect()
64 ignoreStateChanges_ = true;
65 unsigned int flags = static_cast<unsigned int>(ICD_CONNECTION_FLAG_USER_EVENT);
66 icd2interface_->call(ICD_DBUS_API_CONNECT_REQ, QVariant(flags));
71 bool ConnectionManager::disconnect()
79 ignoreStateChanges_ = false;
80 unsigned int flags = static_cast<unsigned int>(ICD_CONNECTION_FLAG_USER_EVENT);
81 icd2interface_->call(ICD_DBUS_API_DISCONNECT_REQ, QVariant(flags));
86 bool ConnectionManager::isConnected()
89 ignoreStateChanges_ = false;
90 QDBusMessage rep = icd2interface_->call(ICD_DBUS_API_STATE_REQ);
92 unsigned int numOfReplies = rep.arguments().value(0).value<unsigned int>();
103 void ConnectionManager::stateChange(const QDBusMessage& rep)
105 if(ignoreStateChanges_)
110 unsigned int status = rep.arguments().value(7).value<unsigned int>();
114 case ICD_STATE_CONNECTING:
116 case ICD_STATE_CONNECTED:
120 case ICD_STATE_DISCONNECTING:
122 case ICD_STATE_DISCONNECTED:
126 case ICD_STATE_LIMITED_CONN_ENABLED:
130 case ICD_STATE_LIMITED_CONN_DISABLED:
134 case ICD_STATE_SEARCH_START:
136 case ICD_STATE_SEARCH_STOP:
138 case ICD_STATE_INTERNAL_ADDRESS_ACQUIRED:
141 qDebug() << "Unknown connection status";
147 void ConnectionManager::connectionChange(const QDBusMessage& rep)
149 unsigned int status = rep.arguments().value(6).value<unsigned int>();
153 case ICD_CONNECTION_SUCCESSFUL:
157 case ICD_CONNECTION_NOT_CONNECTED:
161 case ICD_CONNECTION_DISCONNECTED:
166 qDebug() << "Unknown connection status";
171 bool ConnectionManager::waitSignal()
174 timer_ = startTimer(TIMEOUT);
176 while(!ready_ && !timeout_)
178 QCoreApplication::processEvents(QEventLoop::WaitForMoreEvents);
183 return ready_ || !timeout_;
186 void ConnectionManager::timerEvent(QTimerEvent* event)
193 qDebug() << "Connection request timed out";