Skip to content

Commit

Permalink
Track availability of connman service. Fix NEMO#226
Browse files Browse the repository at this point in the history
Applied patch from Kuisma Salonen
  • Loading branch information
rojkov committed Aug 10, 2012
1 parent ad46c9f commit c300361
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 17 deletions.
64 changes: 47 additions & 17 deletions libconnman-qt/networkmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,26 +33,31 @@ NetworkManager::NetworkManager(QObject* parent)
m_getTechnologiesWatcher(NULL),
m_getServicesWatcher(NULL),
m_defaultRoute(NULL),
watcher(NULL)
watcher(NULL),
m_available(false)
{
registerCommonDataTypes();
connectToConnman();


watcher = new QDBusServiceWatcher("net.connman",QDBusConnection::systemBus(),
QDBusServiceWatcher::WatchForRegistration |
QDBusServiceWatcher::WatchForUnregistration, this);
connect(watcher, SIGNAL(serviceRegistered(QString)),
this, SLOT(connectToConnman(QString)));
connect(watcher, SIGNAL(serviceUnregistered(QString)),
this, SLOT(connmanUnregistered(QString)));


m_available = QDBusConnection::systemBus().interface()->isServiceRegistered("net.connman");

if(m_available)
connectToConnman();
}

NetworkManager::~NetworkManager() {}

void NetworkManager::connectToConnman(QString)
{
if(!watcher) {
watcher = new QDBusServiceWatcher("net.connman",QDBusConnection::systemBus(),
QDBusServiceWatcher::WatchForRegistration |
QDBusServiceWatcher::WatchForUnregistration, this);
connect(watcher, SIGNAL(serviceRegistered(QString)),
this, SLOT(connectToConnman(QString)));
connect(watcher, SIGNAL(serviceUnregistered(QString)),
this, SLOT(disconnectFromConnman(QString)));
}

disconnectFromConnman();
m_manager = new Manager("net.connman", "/",
QDBusConnection::systemBus(), this);
Expand All @@ -61,6 +66,10 @@ void NetworkManager::connectToConnman(QString)
qDebug("manager is invalid. connman may not be running or is invalid");
delete m_manager;
m_manager = NULL;

// shouldn't happen but in this case service isn't available
if(m_available)
emit availabilityChanged(m_available = false);
} else {
QDBusPendingReply<QVariantMap> props_reply = m_manager->GetProperties();
m_getPropertiesWatcher = new QDBusPendingCallWatcher(props_reply, m_manager);
Expand All @@ -83,8 +92,11 @@ void NetworkManager::connectToConnman(QString)
this,
SLOT(getServicesReply(QDBusPendingCallWatcher*)));

if(!m_available)
emit availabilityChanged(m_available = true);

qDebug("connected");
}
qDebug("connected");
}

void NetworkManager::disconnectFromConnman(QString)
Expand All @@ -96,6 +108,16 @@ void NetworkManager::disconnectFromConnman(QString)
// FIXME: should we delete technologies and services?
}


void NetworkManager::connmanUnregistered(QString)
{
disconnectFromConnman();

if(m_available)
emit availabilityChanged(m_available = false);
}


// These functions is a part of setup procedure

void NetworkManager::getPropertiesReply(QDBusPendingCallWatcher *call)
Expand Down Expand Up @@ -234,6 +256,13 @@ void NetworkManager::propertyChanged(const QString &name,

// Getters


bool NetworkManager::isAvailable() const
{
return m_available;
}


const QString NetworkManager::state() const
{
return m_propertiesCache[State].toString();
Expand Down Expand Up @@ -279,14 +308,15 @@ void NetworkManager::setOfflineMode(const bool &offlineMode)
QDBusVariant(QVariant(offlineMode)));
}

// these shouldn't crash even if connman isn't available
void NetworkManager::registerAgent(const QString &path)
{
Q_ASSERT(m_manager);
m_manager->RegisterAgent(QDBusObjectPath(path));
if(m_manager)
m_manager->RegisterAgent(QDBusObjectPath(path));
}

void NetworkManager::unregisterAgent(const QString &path)
{
Q_ASSERT(m_manager);
m_manager->UnregisterAgent(QDBusObjectPath(path));
if(m_manager)
m_manager->UnregisterAgent(QDBusObjectPath(path));
}
8 changes: 8 additions & 0 deletions libconnman-qt/networkmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class NetworkManager : public QObject
{
Q_OBJECT;

Q_PROPERTY(bool available READ isAvailable NOTIFY availabilityChanged);
Q_PROPERTY(QString state READ state NOTIFY stateChanged);
Q_PROPERTY(bool offlineMode READ offlineMode WRITE setOfflineMode NOTIFY offlineModeChanged);
Q_PROPERTY(NetworkService* defaultRoute READ defaultRoute NOTIFY defaultRouteChanged);
Expand All @@ -39,6 +40,8 @@ class NetworkManager : public QObject
NetworkManager(QObject* parent=0);
virtual ~NetworkManager();

bool isAvailable() const;

NetworkTechnology* getTechnology(const QString &type) const;
const QVector<NetworkService*> getServices() const;

Expand All @@ -52,6 +55,8 @@ public slots:
void unregisterAgent(const QString &path);

signals:
void availabilityChanged(bool available);

void stateChanged(const QString &state);
void offlineModeChanged(bool offlineMode);
void technologiesChanged(const QMap<QString, NetworkTechnology*> &added,
Expand All @@ -76,9 +81,12 @@ public slots:
static const QString State;
static const QString OfflineMode;

bool m_available;

private slots:
void connectToConnman(QString = "");
void disconnectFromConnman(QString = "");
void connmanUnregistered(QString = "");
void getPropertiesReply(QDBusPendingCallWatcher *call);
void getTechnologiesReply(QDBusPendingCallWatcher *call);
void getServicesReply(QDBusPendingCallWatcher *call);
Expand Down
15 changes: 15 additions & 0 deletions plugin/networkingmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ NetworkingModel::NetworkingModel(QObject* parent)
this,
SIGNAL(wifiPoweredChanged(bool)));
}
connect(m_manager, SIGNAL(availabilityChanged(bool)),
this, SLOT(managerAvailabilityChanged(bool)));
connect(m_manager,
SIGNAL(technologiesChanged(QMap<QString, NetworkTechnology*>, QStringList)),
this,
Expand All @@ -45,6 +47,11 @@ NetworkingModel::~NetworkingModel()
m_manager->unregisterAgent(QString(AGENT_PATH));
}

bool NetworkingModel::isAvailable() const
{
return m_manager->isAvailable();
}

QList<QObject*> NetworkingModel::networks() const
{
const QString wifi("wifi");
Expand Down Expand Up @@ -102,6 +109,14 @@ void NetworkingModel::updateTechnologies(const QMap<QString, NetworkTechnology*>
emit technologiesChanged();
}

void NetworkingModel::managerAvailabilityChanged(bool available)
{
if(available)
m_manager->registerAgent(QString(AGENT_PATH));

emit availabilityChanged(available);
}

void NetworkingModel::requestUserInput(ServiceReqData* data)
{
m_req_data = data;
Expand Down
6 changes: 6 additions & 0 deletions plugin/networkingmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,16 @@ class NetworkingModel : public QObject
{
Q_OBJECT;

Q_PROPERTY(bool available READ isAvailable NOTIFY availabilityChanged);
Q_PROPERTY(bool wifiPowered READ isWifiPowered WRITE setWifiPowered NOTIFY wifiPoweredChanged);
Q_PROPERTY(QList<QObject*> networks READ networks NOTIFY networksChanged);

public:
NetworkingModel(QObject* parent=0);
virtual ~NetworkingModel();

bool isAvailable() const;

QList<QObject*> networks() const;
bool isWifiPowered() const;
void requestUserInput(ServiceReqData* data);
Expand All @@ -45,6 +48,7 @@ public slots:
void sendUserReply(const QVariantMap &input);

signals:
void availabilityChanged(bool available);
void wifiPoweredChanged(const bool &wifiPowered);
void networksChanged();
void technologiesChanged();
Expand All @@ -60,6 +64,8 @@ private slots:
void updateTechnologies(const QMap<QString, NetworkTechnology*> &added,
const QStringList &removed);

void managerAvailabilityChanged(bool available);

private:
Q_DISABLE_COPY(NetworkingModel);
};
Expand Down

0 comments on commit c300361

Please sign in to comment.