File fix-bssid-bko238046.diff of Package NetworkManager-kde4

Index: libs/ui/802_11_wirelesswidget.cpp
===================================================================
--- libs/ui/802_11_wirelesswidget.cpp	(revision 1175103)
+++ libs/ui/802_11_wirelesswidget.cpp	(working copy)
@@ -128,6 +128,8 @@ void Wireless80211Widget::writeConfig()
 
     if (d->ui.bssid->text() != QString::fromLatin1(":::::")) {
         d->setting->setBssid(d->ui.bssid->text().toAscii());
+    } else {
+        d->setting->setBssid(QByteArray());
     }
     d->setting->setMtu(d->ui.mtu->value());
 }
Index: backends/NetworkManager/settingdbus.h
===================================================================
--- backends/NetworkManager/settingdbus.h	(revision 1175103)
+++ backends/NetworkManager/settingdbus.h	(working copy)
@@ -39,6 +39,10 @@ class SettingDbus
     virtual void fromMap(const QVariantMap &) = 0;
     virtual QVariantMap toMap() = 0;
     virtual QVariantMap toSecretsMap() = 0;
+
+    // static methods to convert between binary and hex string MAC representation
+    static QByteArray macHex2Bin(const QByteArray & hexMac);
+    static QByteArray macBin2Hex(const QByteArray & binMac);
 protected:
     static void insertIfTrue(QVariantMap& map, const char * key, bool value);
     static void insertIfNonZero(QVariantMap& map, const char * key, uint value);
Index: backends/NetworkManager/settings/802-11-wirelessdbus.cpp
===================================================================
--- backends/NetworkManager/settings/802-11-wirelessdbus.cpp	(revision 1175103)
+++ backends/NetworkManager/settings/802-11-wirelessdbus.cpp	(working copy)
@@ -29,7 +29,7 @@ void WirelessDbus::fromMap(const QVariantMap & map
     setting->setChannel(map.value("channel").value<uint>());
   }
   if (map.contains("bssid")) {
-    setting->setBssid(map.value("bssid").value<QByteArray>());
+    setting->setBssid(SettingDbus::macBin2Hex(map.value("bssid").value<QByteArray>()));
   }
   if (map.contains("rate")) {
     setting->setRate(map.value("rate").value<uint>());
@@ -38,7 +38,7 @@ void WirelessDbus::fromMap(const QVariantMap & map
     setting->setTxpower(map.value(QLatin1String(NM_SETTING_WIRELESS_TX_POWER)).value<uint>());
   }
   if (map.contains(QLatin1String(NM_SETTING_WIRELESS_MAC_ADDRESS))) {
-    setting->setMacaddress(map.value(QLatin1String(NM_SETTING_WIRELESS_MAC_ADDRESS)).value<QByteArray>());
+    setting->setMacaddress(SettingDbus::macBin2Hex(map.value(QLatin1String(NM_SETTING_WIRELESS_MAC_ADDRESS)).value<QByteArray>()));
   }
   if (map.contains("mtu")) {
     setting->setMtu(map.value("mtu").value<uint>());
@@ -77,12 +77,12 @@ QVariantMap WirelessDbus::toMap()
 #endif
   //map.insert("channel", setting->channel());
   if (!setting->bssid().isEmpty()) {
-      map.insert("bssid", setting->bssid());
+      map.insert("bssid", SettingDbus::macHex2Bin(setting->bssid()));
   }
   //map.insert("rate", setting->rate());
   //map.insert(QLatin1String(NM_SETTING_WIRELESS_TX_POWER), setting->txpower());
   if (!setting->macaddress().isEmpty()) {
-      map.insert(QLatin1String(NM_SETTING_WIRELESS_MAC_ADDRESS), setting->macaddress());
+      map.insert(QLatin1String(NM_SETTING_WIRELESS_MAC_ADDRESS), SettingDbus::macHex2Bin(setting->macaddress()));
   }
   if (setting->mtu() > 0 )
        map.insert("mtu", setting->mtu());
Index: backends/NetworkManager/settings/802-3-ethernetdbus.cpp
===================================================================
--- backends/NetworkManager/settings/802-3-ethernetdbus.cpp	(revision 1175103)
+++ backends/NetworkManager/settings/802-3-ethernetdbus.cpp	(working copy)
@@ -29,7 +29,7 @@ void WiredDbus::fromMap(const QVariantMap & map)
     setting->setAutonegotiate(map.value(QLatin1String(NM_SETTING_WIRED_AUTO_NEGOTIATE)).value<bool>());
   }
   if (map.contains(QLatin1String(NM_SETTING_WIRED_MAC_ADDRESS))) {
-    setting->setMacaddress(map.value(QLatin1String(NM_SETTING_WIRED_MAC_ADDRESS)).value<QByteArray>());
+    setting->setMacaddress(SettingDbus::macBin2Hex(map.value(QLatin1String(NM_SETTING_WIRED_MAC_ADDRESS)).value<QByteArray>()));
   }
   if (map.contains("mtu")) {
     setting->setMtu(map.value("mtu").value<uint>());
@@ -67,10 +67,10 @@ QVariantMap WiredDbus::toMap()
   }
   map.insert(QLatin1String(NM_SETTING_WIRED_AUTO_NEGOTIATE), setting->autonegotiate());
 #endif
-  // broken
-  //QString mac = setting->macaddress();
-  //map.insert(QLatin1String(NM_SETTING_WIRED_MAC_ADDRESS), mac.remove(':').toAscii());
-  if (setting->mtu() > 0 ) {
+  if (!setting->macaddress().isEmpty()) {
+    map.insert(QLatin1String(NM_SETTING_WIRED_MAC_ADDRESS), SettingDbus::macHex2Bin(setting->macaddress()));
+  }
+  if (setting->mtu() > 0) {
     map.insert("mtu", setting->mtu());
   }
   return map;
Index: backends/NetworkManager/settingdbus.cpp
===================================================================
--- backends/NetworkManager/settingdbus.cpp	(revision 1175103)
+++ backends/NetworkManager/settingdbus.cpp	(working copy)
@@ -18,6 +18,8 @@ You should have received a copy of the GNU Lesser
 License along with this library.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#include "ctype.h"
+
 #include "settingdbus.h"
 
 using namespace Knm;
@@ -33,6 +35,53 @@ SettingDbus::~SettingDbus()
 
 }
 
+// convert MAC from hex string to binary
+// e.g. 00:11:22:dd:ee:ff -> 6-byte array
+QByteArray SettingDbus::macHex2Bin(const QByteArray & hexMac)
+{
+    const int MAC_STR_LEN = 17;
+    QByteArray ba = hexMac;
+
+    if (ba.isEmpty()) return ba;
+
+    // Check the MAC first and correct it.
+    // Although fromHex() ignores invalid characters, it scans the array from
+    // the end; so add missing zeroes to have even number of characters.
+    for (int i = 0; i < MAC_STR_LEN; i++) {
+        char ch = i < ba.size() ? ba.at(i) : ':';
+        int mod = i%3;
+        if (mod != 2) {
+            if (ch == ':') ba.insert(i-mod, "0");
+            else if (!isxdigit(ch)) ba[i] = '0';
+        } else {
+            if (ch != ':') ba.insert(i, ":");
+        }
+    }
+    ba.resize(MAC_STR_LEN);
+
+    return QByteArray::fromHex(ba);
+}
+
+// convert binary MAC to hex string (human readable)
+// e.g. 6-byte array -> 00:11:22:dd:ee:ff
+QByteArray SettingDbus::macBin2Hex(const QByteArray & binMac)
+{
+    const int MAC_STR_LEN = 17;
+    QByteArray ba = binMac;
+
+    if (ba.isEmpty()) return ba;
+
+    ba = ba.toHex().toUpper();
+    ba.insert(2, ':');
+    ba.insert(5, ':');
+    ba.insert(8, ':');
+    ba.insert(11, ':');
+    ba.insert(14, ':');
+    ba.resize(MAC_STR_LEN);
+
+    return ba;
+}
+
 void SettingDbus::insertIfTrue(QVariantMap& map, const char * key, bool setting)
 {
     if (setting) {
openSUSE Build Service is sponsored by