File fix_static_ip.patch of Package NetworkManager-kde

Index: knetworkmanager/src/knetworkmanager-connection_setting_ipv4.h
===================================================================
--- knetworkmanager/src/knetworkmanager-connection_setting_ipv4.h	(Revision 880482)
+++ knetworkmanager/src/knetworkmanager-connection_setting_ipv4.h	(Revision 880676)
@@ -95,6 +95,9 @@
 		
 		bool     useSetting();
 
+		Q_UINT32 toCIDRSuffix(const QHostAddress&) const;
+		QHostAddress fromCIDRSuffix(Q_UINT32 suffix);
+
 	private:
 		QValueList<QHostAddress> _dns;
 		QStringList              _dns_search;
Index: knetworkmanager-connection_setting_ipv4.cpp
===================================================================
--- knetworkmanager/src/knetworkmanager-connection_setting_ipv4.cpp	(Revision 880482)
+++ knetworkmanager/src/knetworkmanager-connection_setting_ipv4.cpp	(Revision 880676)
@@ -217,7 +217,7 @@
 			{
 				QValueList<QDBusData> cur_ip;
 				cur_ip.append(QDBusData::fromUInt32(swap32((*it).address.toIPv4Address())));
-				cur_ip.append(QDBusData::fromUInt32(swap32((*it).netmask.toIPv4Address())));
+				cur_ip.append(QDBusData::fromUInt32(toCIDRSuffix((*it).netmask)));
 				if (!(*it).gateway.isNull())
 					cur_ip.append(QDBusData::fromUInt32(swap32((*it).gateway.toIPv4Address())));
 				ips.append(QDBusData::fromQValueList(cur_ip));
@@ -278,7 +277,12 @@
 			IPv4Address address;
 
 			address.address = swap32(cur_ip[0].toUInt32());
-			address.netmask = swap32(cur_ip[1].toUInt32());
+
+			if (cur_ip[1].toUInt32() >= 0 && cur_ip[1].toUInt32() <= 32)
+				address.netmask = fromCIDRSuffix(cur_ip[1].toUInt32());
+			else
+				address.netmask = swap32(cur_ip[1].toUInt32());
+
 			if (cur_ip.size() > 2)
 				address.gateway = swap32(cur_ip[2].toUInt32());
 		
@@ -292,3 +296,23 @@
 	if ((it = map.find(NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS)) != map.end())
 		_ignore_auto_dns = it.data().toBool();
 }
+
+Q_UINT32 IPv4::toCIDRSuffix(const QHostAddress& adr) const
+{
+	Q_UINT32 netmask = adr.toIPv4Address();
+	Q_UINT32 suffix = 0;
+	while (netmask > 0)
+	{
+		suffix++;
+		netmask = netmask << 1;
+	}
+	return suffix;
+}
+
+QHostAddress IPv4::fromCIDRSuffix(Q_UINT32 suffix)
+{
+	Q_UINT32 netmask = 0xFFFFFFFF;
+	netmask = netmask << (32 - suffix);
+	return QHostAddress(netmask);
+}
+
openSUSE Build Service is sponsored by