You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
221 lines
5.8 KiB
221 lines
5.8 KiB
/***************************************************************************
|
|
*
|
|
* knetworkmanager-devicestore.cpp - A NetworkManager frontend for KDE
|
|
*
|
|
* Copyright (C) 2005, 2006 Novell, Inc.
|
|
*
|
|
* Author: Helmut Schaa <hschaa@suse.de>, <Helmut.Schaa@gmx.de>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
**************************************************************************/
|
|
|
|
#include <NetworkManager.h>
|
|
|
|
#include "knetworkmanager.h"
|
|
#include "knetworkmanager-devicestore.h"
|
|
#include "knetworkmanager-wired_device.h"
|
|
#include "knetworkmanager-wireless_device.h"
|
|
#include "knetworkmanager-gsm_device.h"
|
|
#include "knetworkmanager-cdma_device.h"
|
|
#include "knetworkmanager-device.h"
|
|
#include "knetworkmanager-nm_proxy.h"
|
|
#include "dbus/deviceproxy.h"
|
|
|
|
#include <tqdbuserror.h>
|
|
#include <tqdbusobjectpath.h>
|
|
#include <tqdbusconnection.h>
|
|
|
|
#include <kdebug.h>
|
|
|
|
#if !defined(NM_CHECK_VERSION)
|
|
#define NM_CHECK_VERSION(x,y,z) 0
|
|
#endif
|
|
|
|
class DeviceStorePrivate
|
|
{
|
|
public:
|
|
DeviceStorePrivate() {}
|
|
~DeviceStorePrivate() {}
|
|
|
|
TQMap<TQString, Device*> devices;
|
|
static DeviceStore* store;
|
|
};
|
|
|
|
DeviceStore* DeviceStorePrivate::store = NULL;
|
|
|
|
DeviceStore* DeviceStore::getInstance()
|
|
{
|
|
if (DeviceStorePrivate::store)
|
|
return DeviceStorePrivate::store;
|
|
return (DeviceStorePrivate::store = new DeviceStore());
|
|
}
|
|
|
|
void DeviceStore::slotDeviceRemoved(const TQT_DBusObjectPath & obj_path)
|
|
{
|
|
kdDebug() << "DeviceStore::slotDeviceRemoved" << endl;
|
|
TQMap<TQString, Device*>::Iterator it = d->devices.find(TQString(obj_path));
|
|
if (it != d->devices.end())
|
|
{
|
|
// remove this device
|
|
Device* dev = it.data();
|
|
|
|
emit DeviceRemoved(dev);
|
|
|
|
d->devices.remove(it);
|
|
delete dev;
|
|
dev = NULL;
|
|
}
|
|
}
|
|
|
|
void DeviceStore::slotDeviceAdded(const TQT_DBusObjectPath & obj_path)
|
|
{
|
|
// just start an update
|
|
Device* dev = createDevice(obj_path);
|
|
if (dev)
|
|
emit DeviceAdded(dev);
|
|
}
|
|
|
|
Device* DeviceStore::createDevice(const TQT_DBusObjectPath &obj_path)
|
|
{
|
|
TQT_DBusError err;
|
|
// if we have this device already in our list goto the next one
|
|
TQMap<TQString, Device*>::Iterator it = d->devices.find(obj_path);
|
|
if ( it != d->devices.end())
|
|
return it.data();
|
|
|
|
// FIXME: ugly stuff is going on here, better pass the DeviceProxy to the Device's constructor instead of the object_path
|
|
DBus::DeviceProxy* dev = new DBus::DeviceProxy(NM_DBUS_SERVICE, obj_path);
|
|
Device* new_dev = NULL;
|
|
|
|
if (dev)
|
|
{
|
|
dev->setConnection(TQT_DBusConnection::systemBus());
|
|
TQ_UINT32 type = dev->getDeviceType(err);
|
|
|
|
//printf("Device obj_path: %s\n\r", obj_path->data());
|
|
|
|
// FIXME: This should not be hardcoded, it would be better if wireless, wired etc. modules register their device type
|
|
// select the right device type and create the appropriate objects
|
|
switch(type)
|
|
{
|
|
#if NM_CHECK_VERSION(0,8,992)
|
|
case NM_DEVICE_TYPE_WIFI:
|
|
#else
|
|
case DEVICE_TYPE_802_11_WIRELESS:
|
|
#endif
|
|
new_dev = new WirelessDevice(obj_path);
|
|
break;
|
|
#if NM_CHECK_VERSION(0,8,992)
|
|
case NM_DEVICE_TYPE_ETHERNET:
|
|
#else
|
|
case DEVICE_TYPE_802_3_ETHERNET:
|
|
#endif
|
|
new_dev = new WiredDevice(obj_path);
|
|
break;
|
|
#if NM_CHECK_VERSION(0,8,992)
|
|
case NM_DEVICE_TYPE_MODEM:
|
|
#else
|
|
case DEVICE_TYPE_GSM:
|
|
#endif
|
|
new_dev = new GSMDevice(obj_path);
|
|
break;
|
|
#if NM_CHECK_VERSION(0,8,992)
|
|
#else
|
|
case DEVICE_TYPE_CDMA:
|
|
#endif
|
|
new_dev = new CDMADevice(obj_path);
|
|
break;
|
|
default:
|
|
kdWarning() << k_funcinfo << "Unknown devicetype" << endl;
|
|
new_dev = new Device(obj_path);
|
|
break;
|
|
}
|
|
|
|
// insert the new device into our list
|
|
if (new_dev)
|
|
d->devices.insert(obj_path, new_dev);
|
|
|
|
delete dev;
|
|
}
|
|
else
|
|
kdWarning() << k_funcinfo << "Dev is Null" << endl;
|
|
|
|
return new_dev;
|
|
}
|
|
|
|
void DeviceStore::updateDevices()
|
|
{
|
|
NMProxy* nm = NMProxy::getInstance();
|
|
TQValueList<TQT_DBusObjectPath> obj_paths;
|
|
TQT_DBusError err;
|
|
|
|
// get a list of NM devices
|
|
nm->GetDevices(obj_paths, err);
|
|
|
|
// create a list of KNM devices
|
|
for (TQValueList<TQT_DBusObjectPath>::Iterator it = obj_paths.begin(); it != obj_paths.end(); ++it)
|
|
{
|
|
createDevice((*it));
|
|
}
|
|
}
|
|
|
|
TQValueList<Device*> DeviceStore::getDevices(TQ_UINT32 type)
|
|
{
|
|
updateDevices();
|
|
|
|
if (type == 0)
|
|
return d->devices.values();
|
|
else
|
|
{
|
|
// only return devices of a special type
|
|
TQValueList<Device*> devs;
|
|
for (TQMap<TQString, Device*>::Iterator it = d->devices.begin(); it != d->devices.end(); ++it)
|
|
{
|
|
if (it.data()->getDeviceType() == type)
|
|
devs.append(it.data());
|
|
}
|
|
return devs;
|
|
}
|
|
}
|
|
|
|
Device* DeviceStore::getDevice(TQT_DBusObjectPath objpath)
|
|
{
|
|
return d->devices[objpath];
|
|
}
|
|
|
|
DeviceStore::DeviceStore ( TQObject * parent, const char * name ) : TQObject( parent, name )
|
|
{
|
|
d = new DeviceStorePrivate();
|
|
|
|
// get notified from NM when devices are added or removed
|
|
NMProxy* nm = NMProxy::getInstance();
|
|
connect(nm, TQT_SIGNAL(DeviceAdded(const TQT_DBusObjectPath& )), this, TQT_SLOT(slotDeviceAdded(const TQT_DBusObjectPath&)));
|
|
connect(nm, TQT_SIGNAL(DeviceRemoved(const TQT_DBusObjectPath& )), this, TQT_SLOT(slotDeviceRemoved(const TQT_DBusObjectPath&)));
|
|
}
|
|
|
|
DeviceStore::~DeviceStore ()
|
|
{
|
|
// delete all devicepointers
|
|
while (d->devices.begin() != d->devices.end())
|
|
delete d->devices.begin().data();
|
|
|
|
// delete private data
|
|
delete d;
|
|
}
|
|
|
|
|
|
#include "knetworkmanager-devicestore.moc"
|