diff options
Diffstat (limited to 'knetworkmanager-0.8/src/knetworkmanager-devicestore.cpp')
-rw-r--r-- | knetworkmanager-0.8/src/knetworkmanager-devicestore.cpp | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/knetworkmanager-0.8/src/knetworkmanager-devicestore.cpp b/knetworkmanager-0.8/src/knetworkmanager-devicestore.cpp new file mode 100644 index 0000000..6f217c1 --- /dev/null +++ b/knetworkmanager-0.8/src/knetworkmanager-devicestore.cpp @@ -0,0 +1,220 @@ +/*************************************************************************** + * + * knetworkmanager-devicestore.cpp - A NetworkManager frontend for KDE + * + * Copyright (C) 2005, 2006 Novell, Inc. + * + * Author: Helmut Schaa <[email protected]>, <[email protected]> + * + * 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" |