diff --git a/tdecore/networkbackends/network-manager/network-manager.cpp b/tdecore/networkbackends/network-manager/network-manager.cpp index a9a076139..a3ebba325 100644 --- a/tdecore/networkbackends/network-manager/network-manager.cpp +++ b/tdecore/networkbackends/network-manager/network-manager.cpp @@ -160,6 +160,42 @@ TDENetworkGlobalManagerFlags::TDENetworkGlobalManagerFlags nmGlobalStateToTDEGlo return ret; } +TDENetworkGlobalManagerFlags::TDENetworkGlobalManagerFlags nmVPNStateToTDEGlobalState(TQ_UINT32 nmType) { + TDENetworkGlobalManagerFlags::TDENetworkGlobalManagerFlags ret = TDENetworkGlobalManagerFlags::Unknown; + + if (nmType == NM_VPN_STATE_UNKNOWN) { + ret |= TDENetworkGlobalManagerFlags::VPNUnknown; + } + else if (nmType == NM_VPN_STATE_PREPARE) { + ret |= TDENetworkGlobalManagerFlags::VPNDisconnected; + ret |= TDENetworkGlobalManagerFlags::VPNEstablishingLink; + } + else if (nmType == NM_VPN_STATE_NEED_AUTH) { + ret |= TDENetworkGlobalManagerFlags::VPNDisconnected; + ret |= TDENetworkGlobalManagerFlags::VPNNeedAuthorization; + } + else if (nmType == NM_VPN_STATE_CONNECT) { + ret |= TDENetworkGlobalManagerFlags::VPNDisconnected; + ret |= TDENetworkGlobalManagerFlags::VPNConfiguringProtocols; + } + else if (nmType == NM_VPN_STATE_IP_CONFIG_GET) { + ret |= TDENetworkGlobalManagerFlags::VPNDisconnected; + ret |= TDENetworkGlobalManagerFlags::VPNVerifyingProtocols; + } + else if (nmType == NM_VPN_STATE_ACTIVATED) { + ret |= TDENetworkGlobalManagerFlags::VPNConnected; + } + else if (nmType == NM_VPN_STATE_FAILED) { + ret |= TDENetworkGlobalManagerFlags::VPNDisconnected; + ret |= TDENetworkGlobalManagerFlags::VPNFailed; + } + else if (nmType == NM_VPN_STATE_DISCONNECTED) { + ret |= TDENetworkGlobalManagerFlags::VPNDisconnected; + } + + return ret; +} + TDENetworkConnectionStatus::TDENetworkConnectionStatus nmDeviceStateToTDEDeviceState(TQ_UINT32 nmType) { TDENetworkConnectionStatus::TDENetworkConnectionStatus ret = TDENetworkConnectionStatus::None; @@ -1282,6 +1318,8 @@ TDENetworkConnectionManager_BackendNM::TDENetworkConnectionManager_BackendNM(TQS d->m_networkManagerProxy->setConnection(TQT_DBusConnection::systemBus()); d->m_networkManagerSettings = new DBus::SettingsInterface(NM_DBUS_SERVICE, NM_DBUS_PATH_SETTINGS); d->m_networkManagerSettings->setConnection(TQT_DBusConnection::systemBus()); + d->m_vpnProxy = new DBus::VPNPluginProxy(NM_VPN_DBUS_PLUGIN_SERVICE, NM_VPN_DBUS_PLUGIN_PATH); + d->m_vpnProxy->setConnection(TQT_DBusConnection::systemBus()); TQString dbusDeviceString = deviceInterfaceString(macAddress); if (dbusDeviceString != "") { @@ -1296,6 +1334,13 @@ TDENetworkConnectionManager_BackendNM::TDENetworkConnectionManager_BackendNM(TQS // Connect global signals connect(d->m_networkManagerProxy, SIGNAL(StateChanged(TQ_UINT32)), d, SLOT(internalProcessGlobalStateChanged(TQ_UINT32))); + // Connect VPN signals + if (d->m_vpnProxy) { + connect(d->m_vpnProxy, SIGNAL(StateChanged(TQ_UINT32)), d, SLOT(internalProcessVPNStateChanged(TQ_UINT32))); + connect(d->m_vpnProxy, SIGNAL(LoginBanner(const TQString&)), d, SLOT(internalProcessVPNLoginBanner(const TQString&))); + connect(d->m_vpnProxy, SIGNAL(Failure(TQ_UINT32)), d, SLOT(internalProcessVPNFailure(TQ_UINT32))); + } + // Connect local signals if (d->m_networkDeviceProxy) { connect(d->m_networkDeviceProxy, SIGNAL(StateChanged(TQ_UINT32, TQ_UINT32, TQ_UINT32)), d, SLOT(internalProcessDeviceStateChanged(TQ_UINT32, TQ_UINT32, TQ_UINT32))); @@ -1330,7 +1375,21 @@ TDENetworkConnectionManager_BackendNM::~TDENetworkConnectionManager_BackendNM() } void TDENetworkConnectionManager_BackendNMPrivate::internalProcessGlobalStateChanged(TQ_UINT32 state) { - m_parent->internalNetworkConnectionStateChanged(nmGlobalStateToTDEGlobalState(state)); + m_parent->internalNetworkConnectionStateChanged(m_parent->backendStatus()); +} + +void TDENetworkConnectionManager_BackendNMPrivate::internalProcessVPNStateChanged(TQ_UINT32 state) { + m_parent->internalNetworkConnectionStateChanged(m_parent->backendStatus()); +} + +void TDENetworkConnectionManager_BackendNMPrivate::internalProcessVPNLoginBanner(const TQString& banner) { + m_parent->internalVpnEvent(TDENetworkVPNEventType::LoginBanner, banner); +} + +void TDENetworkConnectionManager_BackendNMPrivate::internalProcessVPNFailure(TQ_UINT32 reason) { + // FIXME + // This should provide a plain-text interpretation of the NetworkManager-specific error code + m_parent->internalVpnEvent(TDENetworkVPNEventType::Failure, TQString("%1").arg(reason)); } void TDENetworkConnectionManager_BackendNMPrivate::internalProcessDeviceStateChanged(TQ_UINT32 newState, TQ_UINT32 oldState, TQ_UINT32 reason) { @@ -1496,7 +1555,20 @@ TDENetworkGlobalManagerFlags::TDENetworkGlobalManagerFlags TDENetworkConnectionM return TDENetworkGlobalManagerFlags::BackendUnavailable; } else { - return nmGlobalStateToTDEGlobalState(ret); + TDENetworkGlobalManagerFlags::TDENetworkGlobalManagerFlags globalFlags = nmGlobalStateToTDEGlobalState(ret); + TDENetworkGlobalManagerFlags::TDENetworkGlobalManagerFlags vpnFlags = TDENetworkGlobalManagerFlags::Unknown; + if (d->m_vpnProxy) { + ret = d->m_vpnProxy->getState(error); + if (error.isValid()) { + // Error! + PRINT_ERROR(error.name()) + vpnFlags = TDENetworkGlobalManagerFlags::VPNUnknown; + } + else { + vpnFlags = nmVPNStateToTDEGlobalState(ret); + } + } + return globalFlags | vpnFlags; } } else { @@ -5032,7 +5104,7 @@ TQStringList TDENetworkConnectionManager_BackendNM::defaultNetworkDevices() { } } -TDENetworkConnectionManager_BackendNMPrivate::TDENetworkConnectionManager_BackendNMPrivate(TDENetworkConnectionManager_BackendNM* parent) : m_networkManagerProxy(NULL), m_networkManagerSettings(NULL), m_networkDeviceProxy(NULL), m_wiFiDeviceProxy(NULL), m_parent(parent) { +TDENetworkConnectionManager_BackendNMPrivate::TDENetworkConnectionManager_BackendNMPrivate(TDENetworkConnectionManager_BackendNM* parent) : m_networkManagerProxy(NULL), m_networkManagerSettings(NULL), m_networkDeviceProxy(NULL), m_wiFiDeviceProxy(NULL), m_vpnProxy(NULL), m_parent(parent) { // } diff --git a/tdecore/networkbackends/network-manager/network-manager.h b/tdecore/networkbackends/network-manager/network-manager.h index 11f08c65a..5b475eea7 100644 --- a/tdecore/networkbackends/network-manager/network-manager.h +++ b/tdecore/networkbackends/network-manager/network-manager.h @@ -26,10 +26,12 @@ #define NM_DBUS_PATH "/org/freedesktop/NetworkManager" #define NM_DBUS_PATH_SETTINGS "/org/freedesktop/NetworkManager/Settings" #define NM_DBUS_PATH_SETTINGS_CONNECTION "/org/freedesktop/NetworkManager/Settings/Connection" +#define NM_VPN_DBUS_PLUGIN_PATH "/org/freedesktop/NetworkManager/VPN/Plugin" #define NM_DBUS_SERVICE "org.freedesktop.NetworkManager" #define NM_DBUS_SETTINGS_SERVICE "org.freedesktop.NetworkManager.Settings" #define NM_DBUS_SETTINGS_CONNECTION_SERVICE "org.freedesktop.NetworkManager.Settings.Connection" +#define NM_VPN_DBUS_PLUGIN_SERVICE "org.freedesktop.NetworkManager.VPN.Plugin" //==================================================================================================== //==================================================================================================== @@ -72,6 +74,15 @@ #define NM_DEVICE_STATE_DEACTIVATING 110 #define NM_DEVICE_STATE_FAILED 120 //==================================================================================================== +#define NM_VPN_STATE_UNKNOWN 0 +#define NM_VPN_STATE_PREPARE 1 +#define NM_VPN_STATE_NEED_AUTH 2 +#define NM_VPN_STATE_CONNECT 3 +#define NM_VPN_STATE_IP_CONFIG_GET 4 +#define NM_VPN_STATE_ACTIVATED 5 +#define NM_VPN_STATE_FAILED 6 +#define NM_VPN_STATE_DISCONNECTED 7 +//==================================================================================================== #define NM_DEVICE_CAP_NONE 0 #define NM_DEVICE_CAP_NM_SUPPORTED 1 #define NM_DEVICE_CAP_CARRIER_DETECT 2 diff --git a/tdecore/networkbackends/network-manager/network-manager_p.h b/tdecore/networkbackends/network-manager/network-manager_p.h index 758e7fe77..4ef3affe8 100644 --- a/tdecore/networkbackends/network-manager/network-manager_p.h +++ b/tdecore/networkbackends/network-manager/network-manager_p.h @@ -54,6 +54,7 @@ #include "olpcmeshproxy.h" #include "activeconnectionproxy.h" #include "accesspointproxy.h" +#include "vpnpluginproxy.h" typedef TQT_DBusDataMap TQT_DBusTQStringDataMap; typedef TQValueList TQT_DBusDataValueList; @@ -79,6 +80,7 @@ class TDENetworkConnectionManager_BackendNMPrivate : public TQObject DBus::SettingsInterface* m_networkManagerSettings; DBus::DeviceProxy* m_networkDeviceProxy; DBus::WiFiDeviceProxy* m_wiFiDeviceProxy; + DBus::VPNPluginProxy* m_vpnProxy; NMAsyncCallIDMap nmConnectionSettingsAsyncCallWaiting; NMAsyncSettingsResponseMap nmConnectionSettingsAsyncSettingsResponse; NMAddConnectionAsyncResponseMap nmAddConnectionAsyncResponse; @@ -89,6 +91,9 @@ class TDENetworkConnectionManager_BackendNMPrivate : public TQObject void processAddConnectionAsyncReply(int, const TQT_DBusObjectPath&); void internalProcessGlobalStateChanged(TQ_UINT32 state); + void internalProcessVPNStateChanged(TQ_UINT32 state); + void internalProcessVPNLoginBanner(const TQString& banner); + void internalProcessVPNFailure(TQ_UINT32 reason); void internalProcessDeviceStateChanged(TQ_UINT32 newState, TQ_UINT32 oldState, TQ_UINT32 reason); void internalProcessWiFiAccessPointAdded(const TQT_DBusObjectPath&); void internalProcessWiFiAccessPointRemoved(const TQT_DBusObjectPath&); diff --git a/tdecore/tdenetworkconnections.cpp b/tdecore/tdenetworkconnections.cpp index dcccc64c0..14117d990 100644 --- a/tdecore/tdenetworkconnections.cpp +++ b/tdecore/tdenetworkconnections.cpp @@ -839,6 +839,10 @@ void TDENetworkConnectionManager::internalNetworkDeviceEvent(TDENetworkDeviceEve emit(networkDeviceEvent(event)); } +void TDENetworkConnectionManager::internalVpnEvent(TDENetworkVPNEventType::TDENetworkVPNEventType event, TQString message) { + emit(vpnEvent(event, message)); +} + void TDENetworkConnectionManager::internalNetworkManagementEvent(TDENetworkGlobalEventType::TDENetworkGlobalEventType event) { emit(networkManagementEvent(event)); } @@ -853,6 +857,7 @@ TDEGlobalNetworkManager::TDEGlobalNetworkManager() : m_internalConnectionManager #endif // WITH_NETWORK_MANAGER_BACKEND if (m_internalConnectionManager) { connect(m_internalConnectionManager, SIGNAL(networkConnectionStateChanged(TDENetworkGlobalManagerFlags::TDENetworkGlobalManagerFlags, TDENetworkGlobalManagerFlags::TDENetworkGlobalManagerFlags)), this, SIGNAL(networkConnectionStateChanged(TDENetworkGlobalManagerFlags::TDENetworkGlobalManagerFlags, TDENetworkGlobalManagerFlags::TDENetworkGlobalManagerFlags))); + connect(m_internalConnectionManager, SIGNAL(vpnEvent(TDENetworkVPNEventType::TDENetworkVPNEventType, TQString)), this, SIGNAL(vpnEvent(TDENetworkVPNEventType::TDENetworkVPNEventType, TQString))); connect(m_internalConnectionManager, SIGNAL(networkManagementEvent(TDENetworkGlobalEventType::TDENetworkGlobalEventType)), this, SIGNAL(networkManagementEvent(TDENetworkGlobalEventType::TDENetworkGlobalEventType))); } } diff --git a/tdecore/tdenetworkconnections.h b/tdecore/tdenetworkconnections.h index 2ba894732..7a05a003f 100644 --- a/tdecore/tdenetworkconnections.h +++ b/tdecore/tdenetworkconnections.h @@ -201,6 +201,15 @@ namespace TDENetworkGlobalEventType { }; }; +namespace TDENetworkVPNEventType { + enum TDENetworkVPNEventType { + LoginBanner, + Failure, + Other, + Last = Other + }; +}; + namespace TDENetworkDeviceEventType { enum TDENetworkDeviceEventType { BitRateChanged, @@ -231,7 +240,17 @@ namespace TDENetworkGlobalManagerFlags { SiteLocalAccess = 0x00000020, GlobalAccess = 0x00000040, Sleeping = 0x00000080, - BackendUnavailable = 0x00000100 + BackendUnavailable = 0x00000100, + VPNUnknown = 0x00000200, + VPNEstablishingLink = 0x00000400, + VPNNeedAuthorization = 0x00000800, + VPNConfiguringProtocols = 0x00001000, + VPNVerifyingProtocols = 0x00002000, + VPNConnected = 0x00004000, + VPNFailed = 0x00008000, + VPNDisconnected = 0x00010000, + GlobalMask = 0x000001ff, + VPNMask = 0x0001fe00 }; CREATE_FLAG_BITWISE_MANIPULATION_FUNCTIONS(TDENetworkGlobalManagerFlags) @@ -1170,6 +1189,13 @@ class TDECORE_EXPORT TDENetworkConnectionManager : public TQObject */ void networkDeviceEvent(TDENetworkDeviceEventType::TDENetworkDeviceEventType event); + /** + * Emitted whenever a VPN-related event occurs + * The event type that caused the signal is available in @param event + * @param message contains additional information if available + */ + void vpnEvent(TDENetworkVPNEventType::TDENetworkVPNEventType event, TQString message); + /** * Emitted whenever a global network management event occurs * The event type that caused the signal is available in @param event @@ -1271,6 +1297,12 @@ class TDECORE_EXPORT TDENetworkConnectionManager : public TQObject */ void internalNetworkDeviceEvent(TDENetworkDeviceEventType::TDENetworkDeviceEventType event); + /** + * @internal This method must be called by the network backend whenever a VPN event occurs + * It emits the appropriate signals to notify client applications of the network device event + */ + void internalVpnEvent(TDENetworkVPNEventType::TDENetworkVPNEventType event, TQString message); + /** * @internal This method must be called by the network backend whenever it changes state * It emits the appropriate signals to notify client applications of the state change @@ -1464,6 +1496,13 @@ class TDECORE_EXPORT TDEGlobalNetworkManager : public TQObject */ void accessPointStatusChanged(TDEMACAddress BSSID, TDENetworkAPEventType::TDENetworkAPEventType event); + /** + * Emitted whenever a VPN-related event occurs + * The event type that caused the signal is available in @param event + * @param message contains additional information if available + */ + void vpnEvent(TDENetworkVPNEventType::TDENetworkVPNEventType event, TQString message); + /** * Emitted whenever a global network management event occurs * The event type that caused the signal is available in @param event