On 09/14/2010 11:46 AM, Rex Dieter wrote:

> To be clear, thepatch fixes both monolithic and plasma applet, and adds
> a solid method for enable/disable.  So, it's more than just monolithic
> knm being affected here.

Posterity, attached are the 2 patches in question,

kdebase-workspace/solid adding new method
isNetworkingEnabled
and the ability to monitor
org.freedesktop.DBus.GLib.CSymbol impl_manager_enable
via dbus.

networkmanagement adds "enable networking" to knm (the part you're not
interested in, that's fine), and adapts the plasma applet to use
isNetworkingEnabled from solid.

-- Rex
Index: applet/nmpopup.h
===================================================================
--- applet/nmpopup.h	(revision 1128863)
+++ applet/nmpopup.h	(working copy)
@@ -30,6 +30,7 @@
 #include <Plasma/PushButton>
 #include <Plasma/TabBar>
 
+#include <solid/networking.h>
 #include <solid/control/networkinterface.h>
 
 #include "activatable.h"
@@ -65,6 +66,7 @@
     void managerWirelessHardwareEnabledChanged(bool);
     void wirelessEnabledToggled(bool checked);
     void networkingEnabledToggled(bool checked);
+    void managerNetworkingEnabledChanged(bool);
     void manageConnections();
     void showMore();
     void showMore(bool);
Index: applet/nmpopup.cpp
===================================================================
--- applet/nmpopup.cpp	(revision 1128863)
+++ applet/nmpopup.cpp	(working copy)
@@ -118,6 +118,8 @@
     m_leftLayout->addItem(m_networkingCheckBox);
     connect(m_networkingCheckBox, SIGNAL(toggled(bool)),
             this, SLOT(networkingEnabledToggled(bool)));
+    connect(Solid::Control::NetworkManager::notifier(), SIGNAL(networkingEnabledChanged(bool)),
+            this, SLOT(managerNetworkingEnabledChanged(bool)));
 
     // flight-mode checkbox
     m_rfCheckBox = new Plasma::CheckBox(m_leftWidget);
@@ -384,6 +386,12 @@
     m_rfCheckBox->setEnabled(!enabled);
 }
 
+void NMPopup::managerNetworkingEnabledChanged(bool enabled)
+{
+    kDebug() << "NM daemon changed networking enable state" << enabled;
+    m_networkingCheckBox->setChecked(Solid::Control::NetworkManager::isNetworkingEnabled());
+}
+
 void NMPopup::showMore()
 {
     showMore(m_showMoreButton->isChecked());
Index: monolithic/knetworkmanagertrayicon.h
===================================================================
--- monolithic/knetworkmanagertrayicon.h	(revision 1128863)
+++ monolithic/knetworkmanagertrayicon.h	(working copy)
@@ -91,6 +91,11 @@
     void networkingStatusChanged(Solid::Networking::Status);
 
     /**
+     * Enable networking in response to user action
+     */
+    void enableNetworking(bool);
+
+    /**
      * Enable wireless in response to user action
      */
     void enableWireless(bool);
@@ -101,6 +106,11 @@
     void wirelessEnabledChanged();
 
     /**
+     * Update UI in response to system network management networkong state changes
+     */
+    void networkingEnabledChanged();
+
+    /**
      * Starts monitoring new network interfaces' state changes
      */
     void networkInterfaceAdded(const QString&);
Index: monolithic/knetworkmanagertrayicon.cpp
===================================================================
--- monolithic/knetworkmanagertrayicon.cpp	(revision 1128863)
+++ monolithic/knetworkmanagertrayicon.cpp	(working copy)
@@ -66,6 +66,7 @@
     KNetworkManagerTrayIconPrivate()
         : list(0),
         iconName(QLatin1String("networkmanager")),
+        networkingEnableAction(0),
         flightModeAction(0),
         prefsAction(0),
         copyIpAddrAction(0),
@@ -77,6 +78,7 @@
     QHash<Knm::Activatable *, QWidgetAction *> actions;
     QStringList deviceUnis;
     QString iconName;
+    KAction * networkingEnableAction;
     KAction * flightModeAction;
     KAction * prefsAction;
     KAction * copyIpAddrAction;
@@ -112,6 +114,13 @@
     setAssociatedWidget(contextMenu());
     setStatus( (!d->active || Solid::Control::NetworkManager::status() == Solid::Networking::Unknown )? PARENT_ICON_CLASS::Passive : PARENT_ICON_CLASS::Active);
 
+    d->networkingEnableAction = new KAction(i18nc("@action:inmenu turns off networking", "Enable networking"), this);
+    d->networkingEnableAction->setCheckable(true);
+    d->networkingEnableAction->setChecked(Solid::Control::NetworkManager::isNetworkingEnabled());
+    connect(d->networkingEnableAction, SIGNAL(toggled(bool)), this, SLOT(enableNetworking(bool)));
+    connect(Solid::Control::NetworkManager::notifier(), SIGNAL(networkingEnabledChanged(bool)),
+            this, SLOT(networkingEnabledChanged()));
+
     if (types.testFlag(Solid::Control::NetworkInterface::Ieee80211)) {
         d->flightModeAction = new KAction(i18nc("@action:inmenu turns off wireless networking", "Enable wireless"), this);
         d->flightModeAction->setCheckable(true);
@@ -202,7 +211,7 @@
         }
     }
 
-    // if not active, add a warning notice and stop
+    // if not active, add a warning notice, show Networking and Wireless check buttons and stop
     if (Solid::Control::NetworkManager::status() == Solid::Networking::Unknown) {
         QString passiveText = i18nc("@action:inmenu Disable action text used when the NetworkManager daemon is not running", "Network Management disabled");
         QString passiveTooltip = i18nc("@info:tooltip NetworkManager is not running, this client cannot do anything", "The system Network Management service is not running");
@@ -211,6 +220,12 @@
         passiveAction->setToolTip(passiveTooltip);
         passiveAction->setEnabled(false);
         contextMenu()->addAction(passiveAction);
+
+        // show "Enable" check buttons
+        contextMenu()->addAction(d->networkingEnableAction);
+        if (!wirelessDeviceUnis.isEmpty() /*TODO Bluetooth too */ && d->interfaceTypes.testFlag(Solid::Control::NetworkInterface::Ieee80211)) {
+            contextMenu()->addAction(d->flightModeAction);
+        }
         return;
     }
 
@@ -311,9 +326,11 @@
     // add the housekeeping actions
     contextMenu()->addSeparator();
 
+    contextMenu()->addAction(d->networkingEnableAction);
     if (!wirelessDeviceUnis.isEmpty() /*TODO Bluetooth too */ && d->interfaceTypes.testFlag(Solid::Control::NetworkInterface::Ieee80211)) {
         contextMenu()->addAction(d->flightModeAction);
     }
+    contextMenu()->addSeparator();
     contextMenu()->addAction(d->prefsAction);
 }
 
@@ -533,6 +550,12 @@
     }
 }
 
+void KNetworkManagerTrayIcon::enableNetworking(bool enabled)
+{
+    kDebug() << enabled;
+    Solid::Control::NetworkManager::setNetworkingEnabled(enabled);
+}
+
 void KNetworkManagerTrayIcon::enableWireless(bool enabled)
 {
     kDebug() << enabled;
@@ -550,6 +573,12 @@
     }
 }
 
+void KNetworkManagerTrayIcon::networkingEnabledChanged()
+{
+    Q_D(KNetworkManagerTrayIcon);
+    d->networkingEnableAction->setChecked(Solid::Control::NetworkManager::isNetworkingEnabled());
+}
+
 void KNetworkManagerTrayIcon::setActive(bool active)
 {
     Q_D(KNetworkManagerTrayIcon);
diff -up kdebase-workspace-4.4.85/libs/solid/control/ifaces/networkmanager.h.kde238325 kdebase-workspace-4.4.85/libs/solid/control/ifaces/networkmanager.h
--- kdebase-workspace-4.4.85/libs/solid/control/ifaces/networkmanager.h.kde238325	2009-04-28 08:46:11.000000000 -0500
+++ kdebase-workspace-4.4.85/libs/solid/control/ifaces/networkmanager.h	2010-06-08 14:40:43.554897330 -0500
@@ -164,6 +164,11 @@ namespace Ifaces
         void wirelessHardwareEnabledChanged(bool enabled);
 
         /**
+         * This signal is emitted when the status of overall networking changed
+         */
+        void networkingEnabledChanged(bool enabled);
+
+        /**
          * This signal is emitted when the set of active connections changes
          */
         void activeConnectionsChanged();
diff -up kdebase-workspace-4.4.85/libs/solid/control/networkmanager.cpp.kde238325 kdebase-workspace-4.4.85/libs/solid/control/networkmanager.cpp
--- kdebase-workspace-4.4.85/libs/solid/control/networkmanager.cpp.kde238325	2009-07-17 16:44:59.000000000 -0500
+++ kdebase-workspace-4.4.85/libs/solid/control/networkmanager.cpp	2010-06-08 14:40:43.555907737 -0500
@@ -56,6 +56,8 @@ Solid::Control::NetworkManagerPrivate::N
                 this, SIGNAL(wirelessEnabledChanged(bool)));
         connect(managerBackend(), SIGNAL(wirelessHardwareEnabledChanged(bool)),
                 this, SIGNAL(wirelessHardwareEnabledChanged(bool)));
+        connect(managerBackend(), SIGNAL(networkingEnabledChanged(bool)),
+                this, SIGNAL(networkingEnabledChanged(bool)));
         connect(managerBackend(), SIGNAL(activeConnectionsChanged()),
                 this, SIGNAL(activeConnectionsChanged()));
     }
diff -up kdebase-workspace-4.4.85/libs/solid/control/networkmanager.h.kde238325 kdebase-workspace-4.4.85/libs/solid/control/networkmanager.h
--- kdebase-workspace-4.4.85/libs/solid/control/networkmanager.h.kde238325	2009-04-28 08:46:11.000000000 -0500
+++ kdebase-workspace-4.4.85/libs/solid/control/networkmanager.h	2010-06-08 14:40:43.555907737 -0500
@@ -170,6 +170,10 @@ namespace Control
              */
             void wirelessHardwareEnabledChanged(bool enabled);
             /**
+             * This signal is emitted when the status of overall networking changed
+             */
+            void networkingEnabledChanged(bool enabled);
+            /**
              * This signal is emitted when the set of active connections changes
              */
             void activeConnectionsChanged();
diff -up kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager-client.xml.kde238325 kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager-client.xml
--- kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager-client.xml.kde238325	2008-05-15 13:37:15.000000000 -0500
+++ kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager-client.xml	2010-06-08 14:40:43.549905432 -0500
@@ -39,6 +39,12 @@ object.  dbus-glib generates the same bo
       <arg name="sleep" type="b" direction="in"/>
     </method>
 
+    <method name="Enable">
+      <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_manager_enable"/>
+      <arg name="enable" type="b" direction="in"/>
+    </method>
+
+    <property name="NetworkingEnabled" type="b" access="read"/>
     <property name="WirelessEnabled" type="b" access="readwrite"/>
     <property name="WirelessHardwareEnabled" type="b" access="read"/>
     <property name="ActiveConnections" type="ao" access="read"/>
diff -up kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager.xml.kde238325 kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager.xml
--- kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager.xml.kde238325	2008-05-15 13:37:15.000000000 -0500
+++ kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager.xml	2010-06-08 14:40:43.549905432 -0500
@@ -80,7 +80,10 @@
     <method name="Sleep">
       <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_manager_sleep"/>
       <tp:docstring>
-        Control the NetworkManager daemon's sleep state.  When asleep, all interfaces that it manages are deactivated.  When awake, devices are available to be activated.
+        Control the NetworkManager daemon's sleep state.  When asleep, all
+        interfaces that it manages are deactivated.  When awake, devices are
+        available to be activated.  This command should not be called directly
+        by users or clients; it is intended for system suspend/resume tracking.
       </tp:docstring>
       <arg name="sleep" type="b" direction="in">
         <tp:docstring>
@@ -89,6 +92,30 @@
       </arg>
     </method>
 
+    <method name="Enable">
+      <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_manager_enable"/>
+      <tp:docstring>
+        Control whether overall networking is enabled or disabled.  When
+        disabled, all interfaces that NM manages are deactivated.  When enabled,
+        all managed interfaces are re-enabled and available to be activated.
+        This command should be used by clients that provide to users the ability
+        to enable/disable all networking.
+      </tp:docstring>
+      <arg name="enable" type="b" direction="in">
+        <tp:docstring>
+          If FALSE, indicates that all networking should be disabled.  If TRUE,
+          indicates that NetworkManager should begin managing network devices.
+        </tp:docstring>
+      </arg>
+    </method>
+
+    <property name="NetworkingEnabled" type="b" access="read">
+      <tp:docstring>
+        Indicates if overall networking is currently enabled or not.  See the
+        Enable() method.
+      </tp:docstring>
+    </property>
+
     <property name="WirelessEnabled" type="b" access="readwrite">
       <tp:docstring>
         Indicates if wireless is currently enabled or not.
diff -up kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/nm-manager-clientinterface.h.kde238325 kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/nm-manager-clientinterface.h
--- kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/nm-manager-clientinterface.h.kde238325	2009-06-17 15:06:03.000000000 -0500
+++ kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/nm-manager-clientinterface.h	2010-06-08 14:40:43.551895445 -0500
@@ -2,7 +2,7 @@
  * This file was generated by qdbusxml2cpp version 0.7
  * Command line was: qdbusxml2cpp -N -m -p nm-manager-clientinterface /space/kde/sources/trunk/KDE/kdebase/workspace/solid/networkmanager-0.7/dbus/introspection/nm-manager-client.xml
  *
- * qdbusxml2cpp is Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * qdbusxml2cpp is Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
  *
  * This is an auto-generated file.
  * Do not edit! All changes made to it will be lost.
@@ -39,6 +39,10 @@ public:
     inline QList<QDBusObjectPath> activeConnections() const
     { return qvariant_cast< QList<QDBusObjectPath> >(internalPropGet("ActiveConnections")); }
 
+    Q_PROPERTY(bool NetworkingEnabled READ networkingEnabled)
+    inline bool networkingEnabled() const
+    { return qvariant_cast< bool >(internalPropGet("NetworkingEnabled")); }
+
     Q_PROPERTY(uint State READ state)
     inline uint state() const
     { return qvariant_cast< uint >(internalPropGet("State")); }
@@ -68,6 +72,13 @@ public Q_SLOTS: // METHODS
         return asyncCallWithArgumentList(QLatin1String("DeactivateConnection"), argumentList);
     }
 
+    inline QDBusPendingReply<> Enable(bool enable)
+    {
+        QList<QVariant> argumentList;
+        argumentList << qVariantFromValue(enable);
+        return asyncCallWithArgumentList(QLatin1String("Enable"), argumentList);
+    }
+
     inline QDBusPendingReply<QList<QDBusObjectPath> > GetDevices()
     {
         QList<QVariant> argumentList;
diff -up kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager.cpp.kde238325 kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager.cpp
--- kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager.cpp.kde238325	2010-02-09 08:30:15.000000000 -0600
+++ kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager.cpp	2010-06-08 14:40:43.552905013 -0500
@@ -49,6 +49,14 @@ NMNetworkManager::NMNetworkManager(QObje
     d->nmState = d->iface.state();
     d->isWirelessHardwareEnabled = d->iface.wirelessHardwareEnabled();
     d->isWirelessEnabled = d->iface.wirelessEnabled();
+    QVariant netEnabled = d->iface.property("NetworkingEnabled");
+    if (!netEnabled.isNull()) {
+        d->isNetworkingEnabled = netEnabled.toBool();
+        d->NetworkingEnabledPropertyAvailable = true;
+    } else {
+        d->isNetworkingEnabled = !(NM_STATE_UNKNOWN == d->nmState || NM_STATE_ASLEEP == d->nmState);
+        d->NetworkingEnabledPropertyAvailable = false;
+    }
     connect( &d->iface, SIGNAL(DeviceAdded(const QDBusObjectPath &)),
                 this, SLOT(deviceAdded(const QDBusObjectPath &)));
     connect( &d->iface, SIGNAL(DeviceRemoved(const QDBusObjectPath &)),
@@ -138,7 +146,7 @@ QObject *NMNetworkManager::createNetwork
 bool NMNetworkManager::isNetworkingEnabled() const
 {
     Q_D(const NMNetworkManager);
-    return !(NM_STATE_UNKNOWN == d->nmState || NM_STATE_ASLEEP == d->nmState);
+    return d->isNetworkingEnabled;
 }
 
 bool NMNetworkManager::isWirelessEnabled() const
@@ -182,7 +190,14 @@ void NMNetworkManager::deactivateConnect
 void NMNetworkManager::setNetworkingEnabled(bool enabled)
 {
     Q_D(NMNetworkManager);
-    d->iface.Sleep(!enabled);
+
+    QDBusPendingReply<> reply = d->iface.Enable(enabled);
+    reply.waitForFinished();
+    if (reply.isError()) {
+        kDebug(1441) << "Enable() D-Bus method not available:" << reply.error();
+        kDebug(1441) << "Calling Sleep() instead";
+        d->iface.Sleep(!enabled);
+    }
 }
 
 void NMNetworkManager::setWirelessEnabled(bool enabled)
@@ -211,9 +226,19 @@ void NMNetworkManager::stateChanged(uint
 {
     Q_D(NMNetworkManager);
     if ( d->nmState != state ) {
+
+        // When "NetworkingEnabled" property is not available, set isNetworkingEnabled flag and emit signal here.
+        // It has to be done before emitting statusChanged(), else it would cause infinite status switching.
+        if (!d->NetworkingEnabledPropertyAvailable) {
+            d->isNetworkingEnabled = !(NM_STATE_UNKNOWN == state || NM_STATE_ASLEEP == state);
+            emit networkingEnabledChanged(d->isNetworkingEnabled);
+        }
+
+        // set new state
         d->nmState = state;
         emit statusChanged( convertNMState( state ) );
     }
+
 }
 
 void NMNetworkManager::propertiesChanged(const QVariantMap &properties)
@@ -221,6 +246,7 @@ void NMNetworkManager::propertiesChanged
     Q_D(NMNetworkManager);
     kDebug(1441) << properties.keys();
     QLatin1String activeConnKey("ActiveConnections");
+    QLatin1String netEnabledKey("NetworkingEnabled");
     QLatin1String wifiHwKey("WirelessHardwareEnabled");
     QLatin1String wifiEnabledKey("WirelessEnabled");
     QVariantMap::const_iterator it = properties.find(activeConnKey);
@@ -248,6 +274,12 @@ void NMNetworkManager::propertiesChanged
         kDebug(1441) << wifiEnabledKey << d->isWirelessEnabled;
         emit wirelessEnabledChanged(d->isWirelessEnabled);
     }
+    it = properties.find(netEnabledKey);
+    if ( it != properties.end()) {
+        d->isNetworkingEnabled = it->toBool();
+        kDebug(1441) << netEnabledKey << d->isNetworkingEnabled;
+        emit networkingEnabledChanged(d->isNetworkingEnabled);
+    }
 }
 
 Solid::Networking::Status NMNetworkManager::convertNMState(uint state)
diff -up kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager_p.h.kde238325 kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager_p.h
--- kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager_p.h.kde238325	2008-06-10 06:41:03.000000000 -0500
+++ kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager_p.h	2010-06-08 14:40:43.552905013 -0500
@@ -35,6 +35,8 @@ public:
     uint nmState;
     bool isWirelessEnabled;
     bool isWirelessHardwareEnabled;
+    bool isNetworkingEnabled;
+    bool NetworkingEnabledPropertyAvailable;
     QStringList networkInterfaces;
     QStringList activeConnections;
 };
_______________________________________________
kde-networkmanager mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/kde-networkmanager

Reply via email to