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.
252 lines
9.8 KiB
252 lines
9.8 KiB
/*
|
|
Copyright (C) 2012 Timothy Pearson <kb9vqf@pearsoncomputing.net>
|
|
Copyright 2008 Will Stephenson <wstephenson@kde.org>
|
|
|
|
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) version 3 or any later version
|
|
accepted by the membership of KDE e.V. (or its successor approved
|
|
by the membership of KDE e.V.), which shall act as a proxy
|
|
defined in Section 14 of version 3 of the license.
|
|
|
|
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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "devicetraycomponent.h"
|
|
|
|
#include <kdebug.h>
|
|
#include <klocale.h>
|
|
#include <kiconloader.h>
|
|
#include <ksystemtray.h>
|
|
#include <knotifyclient.h>
|
|
#include <knotifydialog.h>
|
|
|
|
TQString DeviceTrayComponent::pixmapForConnState(TDENetworkConnectionStatus::TDENetworkConnectionStatus state) {
|
|
TDENetworkConnectionStatus::TDENetworkConnectionStatus flag = (TDENetworkConnectionStatus::TDENetworkConnectionStatus)0x80000000;
|
|
while ((TQ_UINT32)flag > 0) {
|
|
if (state & flag) {
|
|
if (m_pixmaps.contains(flag)) {
|
|
return m_pixmaps[flag];
|
|
}
|
|
}
|
|
flag = (TDENetworkConnectionStatus::TDENetworkConnectionStatus)((TQ_UINT32)flag >> 1);
|
|
}
|
|
return TQString::null;
|
|
}
|
|
|
|
TQString DeviceTrayComponent::movieForConnState(TDENetworkConnectionStatus::TDENetworkConnectionStatus state) {
|
|
TDENetworkConnectionStatus::TDENetworkConnectionStatus flag = (TDENetworkConnectionStatus::TDENetworkConnectionStatus)0x80000000;
|
|
while ((TQ_UINT32)flag > 0) {
|
|
if (state & flag) {
|
|
if (m_movies.contains(flag)) {
|
|
return m_movies[flag];
|
|
}
|
|
}
|
|
flag = (TDENetworkConnectionStatus::TDENetworkConnectionStatus)((TQ_UINT32)flag >> 1);
|
|
}
|
|
return TQString::null;
|
|
}
|
|
|
|
TQString DeviceTrayComponent::tooltipForConnState(TDENetworkConnectionStatus::TDENetworkConnectionStatus state) {
|
|
TDENetworkConnectionStatus::TDENetworkConnectionStatus flag = (TDENetworkConnectionStatus::TDENetworkConnectionStatus)0x80000000;
|
|
while ((TQ_UINT32)flag > 0) {
|
|
if (state & flag) {
|
|
if (m_tooltips.contains(flag)) {
|
|
return m_tooltips[flag];
|
|
}
|
|
}
|
|
flag = (TDENetworkConnectionStatus::TDENetworkConnectionStatus)((TQ_UINT32)flag >> 1);
|
|
}
|
|
return TQString::null;
|
|
}
|
|
|
|
DeviceTrayComponent::DeviceTrayComponent(TQString device, KSystemTray * parent, const char * name )
|
|
: TrayComponent(parent, name), m_tray(dynamic_cast<Tray*>(parent)), m_device(device)
|
|
{
|
|
lastKnownState = TDENetworkConnectionStatus::Invalid;
|
|
|
|
TDEHardwareDevices* hwdevices = TDEGlobal::hardwareDevices();
|
|
|
|
// Listen for hardware change events
|
|
connect(hwdevices, TQT_SIGNAL(hardwareEvent(TDEHardwareEvent::TDEHardwareEvent, TQString)), this, TQT_SLOT(tdeHardwareEventHandler(TDEHardwareEvent::TDEHardwareEvent, TQString)));
|
|
// Trigger an initial hardware information update
|
|
tdeHardwareEventHandler(TDEHardwareEvent::HardwareListModified, TQString::null);
|
|
|
|
m_pixmaps[TDENetworkConnectionStatus::Invalid] = "nm_no_connection";
|
|
m_pixmaps[TDENetworkConnectionStatus::UnManaged] = "nm_no_connection";
|
|
m_pixmaps[TDENetworkConnectionStatus::LinkUnavailable] = "nm_no_connection";
|
|
m_pixmaps[TDENetworkConnectionStatus::Disconnected] = "nm_no_connection";
|
|
m_pixmaps[TDENetworkConnectionStatus::Connected] = "ok";
|
|
m_pixmaps[TDENetworkConnectionStatus::Failed] = "nm_no_connection";
|
|
|
|
m_movies[TDENetworkConnectionStatus::EstablishingLink] = "nm_stage01_connecting";
|
|
m_movies[TDENetworkConnectionStatus::ConfiguringProtocols] = "nm_stage02_connecting";
|
|
m_movies[TDENetworkConnectionStatus::VerifyingProtocols] = "nm_stage03_connecting";
|
|
m_movies[TDENetworkConnectionStatus::NeedAuthorization] = m_movies[TDENetworkConnectionStatus::ConfiguringProtocols];
|
|
|
|
m_tooltips[TDENetworkConnectionStatus::Invalid] = i18n("Unknown");
|
|
m_tooltips[TDENetworkConnectionStatus::LinkUnavailable] = i18n("Down");
|
|
m_tooltips[TDENetworkConnectionStatus::UnManaged] = i18n("Unmanaged");
|
|
m_tooltips[TDENetworkConnectionStatus::Disconnected] = i18n("Disconnected");
|
|
m_tooltips[TDENetworkConnectionStatus::EstablishingLink] = i18n("Preparing");
|
|
m_tooltips[TDENetworkConnectionStatus::ConfiguringProtocols] = i18n("Configuration");
|
|
m_tooltips[TDENetworkConnectionStatus::NeedAuthorization] = i18n("Awaiting authentication");
|
|
m_tooltips[TDENetworkConnectionStatus::VerifyingProtocols] = i18n("IP configuration");
|
|
m_tooltips[TDENetworkConnectionStatus::Connected] = i18n("Activated");
|
|
m_tooltips[TDENetworkConnectionStatus::Failed] = i18n("Failed");
|
|
}
|
|
|
|
DeviceTrayComponent::~DeviceTrayComponent()
|
|
{
|
|
}
|
|
|
|
TQString DeviceTrayComponent::device() const
|
|
{
|
|
return m_device;
|
|
}
|
|
|
|
void DeviceTrayComponent::tdeHardwareEventHandler(TDEHardwareEvent::TDEHardwareEvent event, TQString)
|
|
{
|
|
if (event == TDEHardwareEvent::HardwareListModified) {
|
|
TDEHardwareDevices* hwdevices = TDEGlobal::hardwareDevices();
|
|
TDENetworkDevice* dev = dynamic_cast<TDENetworkDevice*>(hwdevices->findByUniqueID(m_device));
|
|
TDENetworkConnectionManager* deviceConnMan = dev->connectionManager();
|
|
|
|
connect(deviceConnMan, TQT_SIGNAL(networkDeviceStateChanged(TDENetworkConnectionStatus::TDENetworkConnectionStatus, TDENetworkConnectionStatus::TDENetworkConnectionStatus, TQString)), TQT_SLOT(deviceStateChanged(TDENetworkConnectionStatus::TDENetworkConnectionStatus, TDENetworkConnectionStatus::TDENetworkConnectionStatus, TQString)));
|
|
connect(deviceConnMan, TQT_SIGNAL(networkDeviceEvent(TDENetworkDeviceEventType::TDENetworkDeviceEventType, TQString)), this, TQT_SLOT(deviceEventHandler(TDENetworkDeviceEventType::TDENetworkDeviceEventType, TQString)));
|
|
}
|
|
}
|
|
|
|
void DeviceTrayComponent::deviceEventHandler(TDENetworkDeviceEventType::TDENetworkDeviceEventType event, TQString message) {
|
|
kdDebug() << "DeviceTrayComponent::deviceEventHandler" << endl;
|
|
|
|
if (event == TDENetworkDeviceEventType::Failure) {
|
|
KNotifyClient::event( tray()->winId(), "tdenm-nm-connection-attempt-failed", i18n(message) );
|
|
}
|
|
}
|
|
|
|
TQStringList DeviceTrayComponent::getToolTipText()
|
|
{
|
|
TDEHardwareDevices* hwdevices = TDEGlobal::hardwareDevices();
|
|
TDENetworkDevice* dev = dynamic_cast<TDENetworkDevice*>(hwdevices->findByUniqueID(m_device));
|
|
|
|
TQStringList list;
|
|
TDENetworkConnectionManager* deviceConnMan = dev->connectionManager();
|
|
TDENetworkConnectionStatus::TDENetworkConnectionStatus state = deviceConnMan->deviceStatus().statusFlags;
|
|
if (tooltipForConnState(state) != "") {
|
|
list.append(i18n("Device: %1").arg(dev->deviceNode()));
|
|
list.append(i18n("State: %1").arg(tooltipForConnState(state)));
|
|
}
|
|
return list;
|
|
}
|
|
|
|
|
|
TQPixmap DeviceTrayComponent::pixmapForState(TDENetworkConnectionStatus::TDENetworkConnectionStatus state)
|
|
{
|
|
if (pixmapForConnState(state) != "") {
|
|
TQString pixmapPath = pixmapForConnState(state);
|
|
if (pixmapPath != "") {
|
|
if (m_tray) {
|
|
if (m_tray->m_pixmapCache.contains(pixmapPath)) {
|
|
return m_tray->m_pixmapCache[pixmapPath];
|
|
}
|
|
}
|
|
return KSystemTray::loadIcon(pixmapPath);
|
|
}
|
|
else {
|
|
return TQPixmap();
|
|
}
|
|
}
|
|
else {
|
|
return TQPixmap();
|
|
}
|
|
}
|
|
|
|
TQMovie DeviceTrayComponent::movieForState(TDENetworkConnectionStatus::TDENetworkConnectionStatus state)
|
|
{
|
|
if (movieForConnState(state) != "") {
|
|
TQString moviePath = movieForConnState(state);
|
|
if (moviePath != "") {
|
|
if (m_tray) {
|
|
if (m_tray->m_movieCache.contains(moviePath)) {
|
|
return TQMovie(m_tray->m_movieCache[moviePath]);
|
|
}
|
|
}
|
|
if (m_tray) {
|
|
return TQMovie(TDEGlobal::iconLoader()->moviePath(moviePath, KIcon::Panel, m_tray->width()));
|
|
}
|
|
else {
|
|
return TQMovie(TDEGlobal::iconLoader()->moviePath(moviePath, KIcon::Panel));
|
|
}
|
|
}
|
|
else {
|
|
return TQMovie();
|
|
}
|
|
}
|
|
else {
|
|
return TQMovie();
|
|
}
|
|
}
|
|
|
|
void DeviceTrayComponent::setMovieForState(TDENetworkConnectionStatus::TDENetworkConnectionStatus state, TQString movie)
|
|
{
|
|
m_movies[state] = movie;
|
|
}
|
|
|
|
void DeviceTrayComponent::setPixmapForState(TDENetworkConnectionStatus::TDENetworkConnectionStatus state, TQString pixmap)
|
|
{
|
|
m_pixmaps[state] = pixmap;
|
|
}
|
|
|
|
void DeviceTrayComponent::deviceStateChanged(TDENetworkConnectionStatus::TDENetworkConnectionStatus newState, TDENetworkConnectionStatus::TDENetworkConnectionStatus prevState, TQString hwAddress)
|
|
{
|
|
lastKnownState = newState;
|
|
|
|
TDEHardwareDevices* hwdevices = TDEGlobal::hardwareDevices();
|
|
TDEGlobalNetworkManager* nm = TDEGlobal::networkManager();
|
|
TDENetworkDevice* dev = dynamic_cast<TDENetworkDevice*>(hwdevices->findByUniqueID(m_device));
|
|
|
|
if (dev->macAddress() != hwAddress) {
|
|
kdDebug() << k_funcinfo << "WARNING: Got networkDeviceStateChanged signal for HW address '" << hwAddress << "', but my HW address is '" << dev->macAddress() << "'! Ignoring...";
|
|
return;
|
|
}
|
|
|
|
#ifdef DEBUG_STATE
|
|
printf("Device tray state: 0x%08x\n\r", newState);
|
|
#endif // DEBUG_STATE
|
|
|
|
//check if our device now holds the default active connection
|
|
// if it is the default active connection
|
|
// or if it is activating. what if 2 devices are activating simultaneously?
|
|
if (newState & TDENetworkConnectionStatus::EstablishingLink) {
|
|
TQTimer::singleShot(0, this, TQT_SLOT(sendGetCenterStage()));
|
|
}
|
|
else if (newState & TDENetworkConnectionStatus::Connected) {
|
|
if (nm->defaultNetworkDevices().contains(m_device)) {
|
|
TQTimer::singleShot(0, this, TQT_SLOT(sendGetCenterStage()));
|
|
}
|
|
}
|
|
else if ((newState & TDENetworkConnectionStatus::LinkUnavailable)
|
|
|| (newState & TDENetworkConnectionStatus::Disconnected)
|
|
|| (newState & TDENetworkConnectionStatus::Failed)) {
|
|
TQTimer::singleShot(0, this, TQT_SLOT(sendReleaseCenterStage()));
|
|
}
|
|
}
|
|
|
|
void DeviceTrayComponent::sendGetCenterStage() {
|
|
emit needsCenterStage(this, true);
|
|
}
|
|
|
|
void DeviceTrayComponent::sendReleaseCenterStage() {
|
|
emit needsCenterStage(this, false);
|
|
}
|
|
|
|
#include "devicetraycomponent.moc"
|