|
@@ -1,6 +1,7 @@
|
|
|
+#include <QJsonObject>
|
|
|
#include "qappctrl.h"
|
|
|
-//#include "helpers.h"
|
|
|
#include "defines.h"
|
|
|
+#include "helpers.h"
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
@@ -10,6 +11,8 @@
|
|
|
#define _countof(a) (sizeof(a) / sizeof(*a))
|
|
|
#endif // _countof
|
|
|
|
|
|
+#define _PREFIX_TO_MASK(pf) htonl(~((1 << (32 - (pf))) - 1))
|
|
|
+
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
typedef struct _SCHEMA_MODEL_ROLES
|
|
@@ -97,17 +100,21 @@ static bool _IsValidNetmask(const struct in_addr &in)
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
-/////////////////////////////////////////////////////////////////////////////
|
|
|
-
|
|
|
-QGfaNetInterfacesSchemaTreeItem::QGfaNetInterfacesSchemaTreeItem(QGfaNetInterfacesSchemaTreeItem *pParentItem) : m_parentItem(pParentItem)
|
|
|
-{
|
|
|
-}
|
|
|
-
|
|
|
-QGfaNetInterfacesSchemaTreeItem::QGfaNetInterfacesSchemaTreeItem(const QVariant &name, const QVariant &data, const QVariant &dataF, QGfaNetInterfacesSchemaTreeItem *pParentItem) : m_parentItem(pParentItem)
|
|
|
+QGfaNetInterfacesSchemaTreeItem::QGfaNetInterfacesSchemaTreeItem(QGfaNetInterfacesSchemaModel &model, const QVariant &name, const QVariant &data, PFN_FORMATTED_VALUE pfnFmtVal, QGfaNetInterfacesSchemaTreeItem *pParentItem) :
|
|
|
+ m_parentItem(pParentItem),
|
|
|
+ m_model(model),
|
|
|
+ m_pfnFmtVal(pfnFmtVal)
|
|
|
{
|
|
|
- m_itemData.append(name);
|
|
|
- m_itemData.append(data);
|
|
|
- m_itemData.append(dataF.isValid() ? dataF : data);
|
|
|
+ if(name.isValid())
|
|
|
+ {
|
|
|
+ m_itemData.append(name);
|
|
|
+
|
|
|
+ if(data.isValid())
|
|
|
+ {
|
|
|
+ m_itemData.append(data);
|
|
|
+ m_itemData.append(m_pfnFmtVal ? (*m_pfnFmtVal)(data) : data);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
QGfaNetInterfacesSchemaTreeItem::~QGfaNetInterfacesSchemaTreeItem(void)
|
|
@@ -165,58 +172,21 @@ int QGfaNetInterfacesSchemaTreeItem::row() const
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-QGfaNetInterfacesSchemaTreeItem* QGfaNetInterfacesSchemaTreeItem::getChildItemByName(const char *pszName)
|
|
|
-{
|
|
|
- for(QGfaNetInterfacesSchemaTreeItem* pItem : m_childItems)
|
|
|
- {
|
|
|
- QVariant name = pItem->data(0);
|
|
|
-
|
|
|
- if(name.isValid())
|
|
|
- {
|
|
|
- if(name == QVariant(pszName))
|
|
|
- return pItem;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
-int QGfaNetInterfacesSchemaTreeItem::compareValue(const QVariant &val) const
|
|
|
-{
|
|
|
- if((m_itemData.size() >= 3) && val.isValid())
|
|
|
- {
|
|
|
- if(m_itemData[1].type() == val.type())
|
|
|
- return !(m_itemData[1] == val);
|
|
|
- }
|
|
|
-
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
-bool QGfaNetInterfacesSchemaTreeItem::updateValue(const QVariant &val, const QVariant &valF)
|
|
|
+bool QGfaNetInterfacesSchemaTreeItem::updateValue(const QVariant &val)
|
|
|
{
|
|
|
bool bUpdated = false;
|
|
|
|
|
|
if(m_itemData.size() >= 3)
|
|
|
{
|
|
|
+ QModelIndex idx = index();
|
|
|
+
|
|
|
if(val.isValid())
|
|
|
{
|
|
|
if(m_itemData[1] != val)
|
|
|
{
|
|
|
m_itemData[1] = val;
|
|
|
- bUpdated = true;
|
|
|
- }
|
|
|
-
|
|
|
- if(valF.isValid())
|
|
|
- {
|
|
|
- if(m_itemData[2] != valF)
|
|
|
- {
|
|
|
- m_itemData[2] = valF;
|
|
|
- bUpdated = true;
|
|
|
- }
|
|
|
- }
|
|
|
- else if(m_itemData[2] != val)
|
|
|
- {
|
|
|
- m_itemData[2] = val;
|
|
|
+ m_itemData[2] = m_pfnFmtVal ? (*m_pfnFmtVal)(val) : val;
|
|
|
+ emit m_model.dataChanged(idx, idx, QVector<int>());
|
|
|
bUpdated = true;
|
|
|
}
|
|
|
}
|
|
@@ -231,13 +201,28 @@ bool QGfaNetInterfacesSchemaTreeItem::updateValue(const QVariant &val, const QVa
|
|
|
return bUpdated;
|
|
|
}
|
|
|
|
|
|
+void QGfaNetInterfacesSchemaTreeItem::setIndex(const QModelIndex &index)
|
|
|
+{
|
|
|
+ m_index = index;
|
|
|
+}
|
|
|
+
|
|
|
+QModelIndex QGfaNetInterfacesSchemaTreeItem::index(void)
|
|
|
+{
|
|
|
+ return m_index;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaNetInterfacesSchemaTreeItem::onValueChanged(const QVariant &val)
|
|
|
+{
|
|
|
+ updateValue(val);
|
|
|
+}
|
|
|
+
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
QGfaNetInterfacesSchemaModel::QGfaNetInterfacesSchemaModel(QObject *pParent) : QAbstractItemModel(pParent)
|
|
|
{
|
|
|
- m_pRootItem = new QGfaNetInterfacesSchemaTreeItem();
|
|
|
+ m_pRootItem = new QGfaNetInterfacesSchemaTreeItem(*this);
|
|
|
|
|
|
for(size_t i = 0; i < _countof(g_roles); ++i)
|
|
|
{
|
|
@@ -308,7 +293,11 @@ QModelIndex QGfaNetInterfacesSchemaModel::index(int row, int column, const QMode
|
|
|
|
|
|
QGfaNetInterfacesSchemaTreeItem *pChildItem = pParentItem->child(row);
|
|
|
if(pChildItem)
|
|
|
- return createIndex(row, column, pChildItem);
|
|
|
+ {
|
|
|
+ QModelIndex index = createIndex(row, column, pChildItem);
|
|
|
+ pChildItem->setIndex(index);
|
|
|
+ return index;
|
|
|
+ }
|
|
|
return QModelIndex();
|
|
|
}
|
|
|
|
|
@@ -362,6 +351,24 @@ QHash<int, QByteArray> QGfaNetInterfacesSchemaModel::roleNames() const
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
+QObject* QGfaNetInterfacesSchemaModel::getChildObject(QObject *parent, std::vector<const char*> childNames)
|
|
|
+{
|
|
|
+ QObject *obj = NULL;
|
|
|
+
|
|
|
+ if(parent && !childNames.empty())
|
|
|
+ {
|
|
|
+ obj = parent;
|
|
|
+
|
|
|
+ for(const char *pszChild : childNames)
|
|
|
+ {
|
|
|
+ obj = qvariant_cast<QObject*>(obj->property(pszChild));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return obj;
|
|
|
+}
|
|
|
+
|
|
|
+#if 0
|
|
|
void QGfaNetInterfacesSchemaModel::setModelData(LPETC_NETWORK_INTERFACES pnif)
|
|
|
{
|
|
|
int i;
|
|
@@ -398,6 +405,16 @@ void QGfaNetInterfacesSchemaModel::setModelData(LPETC_NETWORK_INTERFACES pnif)
|
|
|
QGfaNetInterfacesSchemaTreeItem *pTmpTi = new QGfaNetInterfacesSchemaTreeItem("Inherits", ifb.inherits.c_str(), QVariant(), pNiTi);
|
|
|
pNiTi->appendChild(pTmpTi);
|
|
|
}
|
|
|
+
|
|
|
+ {
|
|
|
+ QGfaNetInterfacesSchemaTreeItem *pTmpTi = new QGfaNetInterfacesSchemaTreeItem("Up", ifb.up, ifb.up ? "yes" : "no", pNiTi);
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+
|
|
|
+ {
|
|
|
+ QGfaNetInterfacesSchemaTreeItem *pTmpTi = new QGfaNetInterfacesSchemaTreeItem("Running", ifb.running, ifb.running ? "yes" : "no", pNiTi);
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
|
|
|
if(ifb.method == IFM_Static)
|
|
|
{
|
|
@@ -571,6 +588,349 @@ void QGfaNetInterfacesSchemaModel::setModelData(LPETC_NETWORK_INTERFACES pnif)
|
|
|
|
|
|
endResetModel();
|
|
|
}
|
|
|
+#endif
|
|
|
+
|
|
|
+void QGfaNetInterfacesSchemaModel::setModelData(QObject *pifs)
|
|
|
+{
|
|
|
+ beginResetModel();
|
|
|
+ m_pRootItem->clear();
|
|
|
+
|
|
|
+ QQmlListProperty<QInterface> itfs = qvariant_cast<QQmlListProperty<QInterface>>(pifs->property("interfaces"));
|
|
|
+
|
|
|
+ for(int i = 0; i < itfs.count(&itfs); ++i)
|
|
|
+ {
|
|
|
+ QObject *pif = static_cast<QObject*>(itfs.at(&itfs, i));
|
|
|
+
|
|
|
+ if(pif)
|
|
|
+ {
|
|
|
+ QVariant vTmp;
|
|
|
+ QGfaNetInterfacesSchemaTreeItem *pNiTi, *pStats, *pTmpTi;
|
|
|
+
|
|
|
+ pNiTi = new QGfaNetInterfacesSchemaTreeItem(*this, pif->property("name"), pif->property("method"), &QGfaNetInterfacesSchemaModel::methodToString, m_pRootItem);
|
|
|
+
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "MAC-Addr.", pif->property("macAddr"), NULL, pNiTi);
|
|
|
+ QObject::connect(pif, SIGNAL(macAddrChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+
|
|
|
+ vTmp = pif->property("inherits");
|
|
|
+ if(qVariantStrLen(vTmp) > 0)
|
|
|
+ {
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Inherits", vTmp, NULL, pNiTi);
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Up", pif->property("up"), &QGfaNetInterfacesSchemaModel::boolToString, pNiTi);
|
|
|
+ QObject::connect(pif, SIGNAL(upChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Running", pif->property("running"), &QGfaNetInterfacesSchemaModel::boolToString, pNiTi);
|
|
|
+ QObject::connect(pif, SIGNAL(runningChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Addr. Family", pif->property("af"), &QGfaNetInterfacesSchemaModel::afToString, pNiTi);
|
|
|
+ QObject::connect(pif, SIGNAL(afChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+
|
|
|
+ QInterface::ItfMethod method = (QInterface::ItfMethod)pif->property("method").toInt();
|
|
|
+ QInterface::AddressFamily af = (QInterface::AddressFamily)pif->property("af").toInt();
|
|
|
+
|
|
|
+ if(method == QInterface::IM_Dhcp)
|
|
|
+ {
|
|
|
+ if(af == QInterface::AF_Inet)
|
|
|
+ {
|
|
|
+ int nTmp;
|
|
|
+ QObject *pDhcp, *pAddr;
|
|
|
+
|
|
|
+ if((pDhcp = getChildObject(pif, {"inet", "dhcp"})))
|
|
|
+ {
|
|
|
+ if((pAddr = getChildObject(pDhcp, {"ipAddress"})))
|
|
|
+ {
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Address", pAddr->property("addr"), &QGfaNetInterfacesSchemaModel::ipV4String, pNiTi);
|
|
|
+ QObject::connect(pAddr, SIGNAL(addrChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+
|
|
|
+ if((pAddr = getChildObject(pDhcp, {"netMask"})))
|
|
|
+ {
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Netmask", pAddr->property("addr"), &QGfaNetInterfacesSchemaModel::ipV4String, pNiTi);
|
|
|
+ QObject::connect(pAddr, SIGNAL(addrChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+
|
|
|
+ vTmp = pDhcp->property("leasetime");
|
|
|
+ if(qVariantInt(vTmp, nTmp) && nTmp >= 0)
|
|
|
+ {
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Lease Time", nTmp, NULL, pNiTi);
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+
|
|
|
+ vTmp = pDhcp->property("leasehours");
|
|
|
+ if(qVariantInt(vTmp, nTmp) && nTmp >= 0)
|
|
|
+ {
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Lease Hours", nTmp, NULL, pNiTi);
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+
|
|
|
+ vTmp = pDhcp->property("metric");
|
|
|
+ if(qVariantInt(vTmp, nTmp) && nTmp >= 0)
|
|
|
+ {
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Metric", nTmp, NULL, pNiTi);
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+
|
|
|
+ vTmp = pDhcp->property("hostname");
|
|
|
+ if(qVariantStrLen(vTmp) > 0)
|
|
|
+ {
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Hostname", vTmp, NULL, pNiTi);
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+
|
|
|
+ vTmp = pDhcp->property("vendor");
|
|
|
+ if(qVariantStrLen(vTmp) > 0)
|
|
|
+ {
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Vendor", vTmp, NULL, pNiTi);
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+
|
|
|
+ vTmp = pDhcp->property("client");
|
|
|
+ if(qVariantStrLen(vTmp) > 0)
|
|
|
+ {
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Client", vTmp, NULL, pNiTi);
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(method == QInterface::IM_Static)
|
|
|
+ {
|
|
|
+ if(af == QInterface::AF_Inet)
|
|
|
+ {
|
|
|
+ int nTmp;
|
|
|
+ unsigned int nUTmp;
|
|
|
+ QObject *pStatic, *pAddr;
|
|
|
+
|
|
|
+ if((pStatic = getChildObject(pif, {"inet", "stat"})))
|
|
|
+ {
|
|
|
+ if((pAddr = getChildObject(pStatic, {"ipAddress"})))
|
|
|
+ {
|
|
|
+ vTmp = pAddr->property("addr");
|
|
|
+ if(qVariantUInt(vTmp, nUTmp) && nUTmp != INADDR_ANY)
|
|
|
+ {
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Address", vTmp, &QGfaNetInterfacesSchemaModel::ipV4String, pNiTi);
|
|
|
+ QObject::connect(pAddr, SIGNAL(addrChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if((pAddr = getChildObject(pStatic, {"netMask"})))
|
|
|
+ {
|
|
|
+ vTmp = pAddr->property("addr");
|
|
|
+ if(qVariantUInt(vTmp, nUTmp) && nUTmp != INADDR_ANY)
|
|
|
+ {
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Netmask", vTmp, &QGfaNetInterfacesSchemaModel::ipV4String, pNiTi);
|
|
|
+ QObject::connect(pAddr, SIGNAL(addrChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if((pAddr = getChildObject(pStatic, {"gateway"})))
|
|
|
+ {
|
|
|
+ vTmp = pAddr->property("addr");
|
|
|
+ if(qVariantUInt(vTmp, nUTmp) && nUTmp != INADDR_ANY)
|
|
|
+ {
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Gateway", vTmp, &QGfaNetInterfacesSchemaModel::ipV4String, pNiTi);
|
|
|
+ QObject::connect(pAddr, SIGNAL(addrChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if((pAddr = getChildObject(pStatic, {"bcastAddress"})))
|
|
|
+ {
|
|
|
+ vTmp = pAddr->property("addr");
|
|
|
+ if(qVariantUInt(vTmp, nUTmp) && nUTmp != INADDR_ANY)
|
|
|
+ {
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "Broadcast", vTmp, &QGfaNetInterfacesSchemaModel::ipV4String, pNiTi);
|
|
|
+ QObject::connect(pAddr, SIGNAL(addrChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if((pAddr = getChildObject(pStatic, {"ptpAddress"})))
|
|
|
+ {
|
|
|
+ vTmp = pAddr->property("addr");
|
|
|
+ if(qVariantUInt(vTmp, nUTmp) && nUTmp != INADDR_ANY)
|
|
|
+ {
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "PointToPoint", vTmp, &QGfaNetInterfacesSchemaModel::ipV4String, pNiTi);
|
|
|
+ QObject::connect(pAddr, SIGNAL(addrChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pNiTi->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ QQmlListProperty<QIPv4Address> dns = qvariant_cast<QQmlListProperty<QIPv4Address>>(pStatic->property("dnsServer"));
|
|
|
+
|
|
|
+ if((nTmp = dns.count(&dns)) > 0)
|
|
|
+ {
|
|
|
+ int nCntDns = 0;
|
|
|
+ QGfaNetInterfacesSchemaTreeItem *pDns = new QGfaNetInterfacesSchemaTreeItem(*this, "DNS Server", QVariant(), NULL, pNiTi);
|
|
|
+
|
|
|
+ for(int i = 0; i < nTmp; ++i)
|
|
|
+ {
|
|
|
+ if((pAddr = static_cast<QObject*>(dns.at(&dns, i))))
|
|
|
+ {
|
|
|
+ vTmp = pAddr->property("addr");
|
|
|
+ if(qVariantUInt(vTmp, nUTmp) && nUTmp != INADDR_ANY)
|
|
|
+ {
|
|
|
+ char szDns[16];
|
|
|
+ sprintf(szDns, "DNS %d", ++nCntDns);
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, szDns, vTmp, &QGfaNetInterfacesSchemaModel::ipV4String, pDns);
|
|
|
+ QObject::connect(pAddr, SIGNAL(addrChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pDns->appendChild(pTmpTi);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(nCntDns)
|
|
|
+ pNiTi->appendChild(pDns);
|
|
|
+ else
|
|
|
+ delete pDns;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(method == QInterface::IM_Manual)
|
|
|
+ {
|
|
|
+ if(af == QInterface::AF_Inet)
|
|
|
+ {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ pStats = new QGfaNetInterfacesSchemaTreeItem(*this, "Stats", QVariant(), NULL, pNiTi);
|
|
|
+
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "RX Packets", pif->property("rxPacket"), NULL, pStats);
|
|
|
+ QObject::connect(pif, SIGNAL(rxPacketChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pStats->appendChild(pTmpTi);
|
|
|
+
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "TX Packets", pif->property("txPacket"), NULL, pStats);
|
|
|
+ QObject::connect(pif, SIGNAL(txPacketChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pStats->appendChild(pTmpTi);
|
|
|
+
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "RX Bytes", pif->property("rxByte"), &QGfaNetInterfacesSchemaModel::formatByteSize, pStats);
|
|
|
+ QObject::connect(pif, SIGNAL(rxByteChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pStats->appendChild(pTmpTi);
|
|
|
+
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "TX Bytes", pif->property("txByte"), &QGfaNetInterfacesSchemaModel::formatByteSize, pStats);
|
|
|
+ QObject::connect(pif, SIGNAL(txByteChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pStats->appendChild(pTmpTi);
|
|
|
+
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "RX Errors", pif->property("rxErrors"), NULL, pStats);
|
|
|
+ QObject::connect(pif, SIGNAL(rxErrorsChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pStats->appendChild(pTmpTi);
|
|
|
+
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "TX Errors", pif->property("txErrors"), NULL, pStats);
|
|
|
+ QObject::connect(pif, SIGNAL(txErrorsChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pStats->appendChild(pTmpTi);
|
|
|
+
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "RX Dropped", pif->property("rxDropped"), NULL, pStats);
|
|
|
+ QObject::connect(pif, SIGNAL(rxDroppedChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pStats->appendChild(pTmpTi);
|
|
|
+
|
|
|
+ pTmpTi = new QGfaNetInterfacesSchemaTreeItem(*this, "TX Dropped", pif->property("txDropped"), NULL, pStats);
|
|
|
+ QObject::connect(pif, SIGNAL(txDroppedChanged(const QVariant&)), pTmpTi, SLOT(onValueChanged(const QVariant&)));
|
|
|
+ pStats->appendChild(pTmpTi);
|
|
|
+
|
|
|
+ pNiTi->appendChild(pStats);
|
|
|
+ m_pRootItem->appendChild(pNiTi);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ endResetModel();
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QGfaNetInterfacesSchemaModel::boolToString(const QVariant &val)
|
|
|
+{
|
|
|
+ if(val.isValid() && val.canConvert(QMetaType::Bool))
|
|
|
+ return val.toBool() ? "✓" : "-";
|
|
|
+ return "error";
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QGfaNetInterfacesSchemaModel::ipV4String(const QVariant &val)
|
|
|
+{
|
|
|
+ if(val.isValid() && val.canConvert(QMetaType::UInt))
|
|
|
+ {
|
|
|
+ struct in_addr addr{::htonl(val.toUInt())};
|
|
|
+ return addr.s_addr ? ::inet_ntoa(addr) : "-";
|
|
|
+ }
|
|
|
+ return "error";
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QGfaNetInterfacesSchemaModel::afToString(const QVariant &val)
|
|
|
+{
|
|
|
+ if(val.isValid() && val.canConvert(QMetaType::Int))
|
|
|
+ {
|
|
|
+ const char *pszProto;
|
|
|
+ int proto = val.toInt();
|
|
|
+ switch(proto)
|
|
|
+ {
|
|
|
+ case QInterface::AF_Inet:
|
|
|
+ pszProto = "IPv4";
|
|
|
+ break;
|
|
|
+ case QInterface::AF_Inet6:
|
|
|
+ pszProto = "IPv6";
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ pszProto = ::GetIfaceProtoStr((IfaceProtos)_ENUM_TO_FLAG(proto));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if(pszProto && *pszProto)
|
|
|
+ return pszProto;
|
|
|
+ }
|
|
|
+ return "error";
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QGfaNetInterfacesSchemaModel::methodToString(const QVariant &val)
|
|
|
+{
|
|
|
+ if(val.isValid() && val.canConvert(QMetaType::Int))
|
|
|
+ {
|
|
|
+ return ::GetIfaceMethodStr((IfaceMethods)_FLAG_TO_ENUM(val.toInt()));
|
|
|
+ }
|
|
|
+ return "error";
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QGfaNetInterfacesSchemaModel::formatByteSize(const QVariant &val)
|
|
|
+{
|
|
|
+ if(val.isValid() && val.canConvert(QMetaType::ULongLong))
|
|
|
+ {
|
|
|
+ return ::FormatByteSize(val.toULongLong(), false, 1);
|
|
|
+ }
|
|
|
+ return "error";
|
|
|
+}
|
|
|
+
|
|
|
+int QGfaNetInterfacesSchemaModel::qVariantStrLen(const QVariant &val)
|
|
|
+{
|
|
|
+ if(val.isValid() && val.canConvert(QMetaType::QString))
|
|
|
+ return val.toString().length();
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+bool QGfaNetInterfacesSchemaModel::qVariantInt(const QVariant &val, int &nVal)
|
|
|
+{
|
|
|
+ if(val.isValid() && val.canConvert(QMetaType::Int))
|
|
|
+ {
|
|
|
+ nVal = val.toInt();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+bool QGfaNetInterfacesSchemaModel::qVariantUInt(const QVariant &val, unsigned int &nVal)
|
|
|
+{
|
|
|
+ if(val.isValid() && val.canConvert(QMetaType::UInt))
|
|
|
+ {
|
|
|
+ nVal = val.toUInt();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
@@ -610,6 +970,7 @@ void QNetworkInterfaces::componentComplete()
|
|
|
void QNetworkInterfaces::reset(void)
|
|
|
{
|
|
|
QInterface *pItf;
|
|
|
+ m_netMon.Close();
|
|
|
|
|
|
for(int i = 0; i < m_interfaces.count(); i++)
|
|
|
{
|
|
@@ -636,10 +997,14 @@ bool QNetworkInterfaces::initialize(void)
|
|
|
m_interfaces.append(new QInterface(ibl, static_cast<NotificationSink&>(*this), this));
|
|
|
}
|
|
|
|
|
|
- m_netInterfacesSchemaModel.setModelData(&m_eni);
|
|
|
+// m_netInterfacesSchemaModel.setModelData(&m_eni);
|
|
|
+ m_netInterfacesSchemaModel.setModelData(this);
|
|
|
|
|
|
emit interfacesChanged();
|
|
|
emit filteredInterfacesChanged();
|
|
|
+
|
|
|
+ m_netMon.Init();
|
|
|
+ m_netMon.StartMonitor(&QNetworkInterfaces::onStaticNetmonEvent, this);
|
|
|
}
|
|
|
|
|
|
return bRet;
|
|
@@ -651,7 +1016,8 @@ bool QNetworkInterfaces::save(void)
|
|
|
if( ::WriteEtcNetworkInterfaces(m_eni, NULL) &&
|
|
|
initialize())
|
|
|
{
|
|
|
- m_netInterfacesSchemaModel.setModelData(&m_eni);
|
|
|
+// m_netInterfacesSchemaModel.setModelData(&m_eni);
|
|
|
+ m_netInterfacesSchemaModel.setModelData(this);
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
@@ -666,7 +1032,8 @@ bool QNetworkInterfaces::saveAs(const QString &path)
|
|
|
if( ::WriteEtcNetworkInterfaces(m_eni, pszPath) &&
|
|
|
initialize())
|
|
|
{
|
|
|
- m_netInterfacesSchemaModel.setModelData(&m_eni);
|
|
|
+// m_netInterfacesSchemaModel.setModelData(&m_eni);
|
|
|
+ m_netInterfacesSchemaModel.setModelData(this);
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
@@ -677,7 +1044,8 @@ bool QNetworkInterfaces::reload(void)
|
|
|
m_netInterfacesSchemaModel.clearAll();
|
|
|
if(initialize())
|
|
|
{
|
|
|
- m_netInterfacesSchemaModel.setModelData(&m_eni);
|
|
|
+// m_netInterfacesSchemaModel.setModelData(&m_eni);
|
|
|
+ m_netInterfacesSchemaModel.setModelData(this);
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
@@ -992,7 +1360,6 @@ bool QNetworkInterfaces::cancelStartStopInterface(void)
|
|
|
bool bCancel = GetIfUpDownInProgress() && (pid != -1);
|
|
|
if(bCancel)
|
|
|
{
|
|
|
-// bCancel = !kill(-pid, SIGKILL);
|
|
|
bCancel = !system("killall -SIGTERM ifup");
|
|
|
}
|
|
|
m_mutex.Unlock();
|
|
@@ -1101,6 +1468,19 @@ int QNetworkInterfaces::getInterfaceSelConfig(QInterface &ri)
|
|
|
return mask;
|
|
|
}
|
|
|
|
|
|
+QInterface* QNetworkInterfaces::GetInterfaceByName(const char *pszName)
|
|
|
+{
|
|
|
+ if(pszName && *pszName)
|
|
|
+ {
|
|
|
+ for(QInterface *pif : m_interfaces)
|
|
|
+ {
|
|
|
+ if(!strcmp(pszName, pif->getName()))
|
|
|
+ return pif;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
bool QNetworkInterfaces::ifUpDownInProgress(void) const
|
|
|
{
|
|
|
return m_bIfUpDownInProgress;
|
|
@@ -1111,14 +1491,60 @@ QGfaNetInterfacesSchemaModel* QNetworkInterfaces::schemaModel(void)
|
|
|
return &m_netInterfacesSchemaModel;
|
|
|
}
|
|
|
|
|
|
+void QNetworkInterfaces::onNetmonEvent(unsigned int nEvtType, const void *pData, LPCRT_ATTRIBUTE pAtts, size_t nMaxAtts)
|
|
|
+{
|
|
|
+ QInterface *pif = NULL;
|
|
|
+
|
|
|
+ if(!pData)
|
|
|
+ return;
|
|
|
+
|
|
|
+ switch(nEvtType)
|
|
|
+ {
|
|
|
+ case RTM_NEWLINK:
|
|
|
+ case RTM_DELLINK:
|
|
|
+ if(nMaxAtts > IFLA_IFNAME)
|
|
|
+ pif = GetInterfaceByName((const char*)pAtts[IFLA_IFNAME].pData);
|
|
|
+ break;
|
|
|
+ case RTM_NEWADDR:
|
|
|
+ case RTM_DELADDR:
|
|
|
+ if(nMaxAtts > IFA_LABEL)
|
|
|
+ pif = GetInterfaceByName((const char*)pAtts[IFA_LABEL].pData);
|
|
|
+ break;
|
|
|
+ case RTM_NEWROUTE:
|
|
|
+ case RTM_DELROUTE:
|
|
|
+ // not implemented!
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(pif)
|
|
|
+ {
|
|
|
+ pif->onNetmonEvent(nEvtType, pData, pAtts, nMaxAtts);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void QNetworkInterfaces::onStaticNetmonEvent(unsigned int nEvtType, const void *pData, LPCRT_ATTRIBUTE pAtts, size_t nMaxAtts, void *pParam)
|
|
|
+{
|
|
|
+ QNetworkInterfaces *pThis = (QNetworkInterfaces*)pParam;
|
|
|
+ pThis->onNetmonEvent(nEvtType, pData, pAtts, nMaxAtts);
|
|
|
+}
|
|
|
+
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
QInterface::QInterface(ITF_IFACE_BLOCK &ifb, NotificationSink ¬ifyer, QObject *pParent) : QObject(pParent),
|
|
|
m_ifb(ifb),
|
|
|
m_inet(ifb, notifyer, this),
|
|
|
m_rNotifyer(notifyer),
|
|
|
- m_selCfg(notifyer.getInterfaceSelConfig(*this))
|
|
|
-{
|
|
|
+ m_selCfg(notifyer.getInterfaceSelConfig(*this)),
|
|
|
+ m_nRxPacket(0ULL),
|
|
|
+ m_nTxPacket(0ULL),
|
|
|
+ m_nRxByte(0ULL),
|
|
|
+ m_nTxByte(0ULL),
|
|
|
+ m_nRxErrors(0ULL),
|
|
|
+ m_nTxErrors(0ULL),
|
|
|
+ m_nRxDropped(0ULL),
|
|
|
+ m_nTxDropped(0ULL)
|
|
|
+{
|
|
|
+ memset(m_szMacAddr, 0, sizeof(m_szMacAddr));
|
|
|
setObjectName("QInterface");
|
|
|
}
|
|
|
|
|
@@ -1136,30 +1562,40 @@ QString QInterface::afName(void) const
|
|
|
return ::GetIfaceProtoStr(m_ifb.proto);
|
|
|
}
|
|
|
|
|
|
-int QInterface::af(void) const
|
|
|
+QVariant QInterface::af(void) const
|
|
|
{
|
|
|
return (int)_ENUM_TO_FLAG(m_ifb.proto);
|
|
|
}
|
|
|
|
|
|
-void QInterface::setAf(int af)
|
|
|
+void QInterface::setAf(const QVariant &val)
|
|
|
{
|
|
|
- if(!_IsPowerOf2(af) || (af < QInterface::AF_Unknown) || (af >= QInterface::AF_Invalid))
|
|
|
+ if(val.canConvert(QMetaType::Int))
|
|
|
{
|
|
|
- m_rNotifyer.reportError("Invalid address family: %d!", af);
|
|
|
- return;
|
|
|
- }
|
|
|
+ int af = val.toInt();
|
|
|
+
|
|
|
+ if(!_IsPowerOf2(af) || (af < QInterface::AF_Unknown) || (af >= QInterface::AF_Invalid))
|
|
|
+ {
|
|
|
+ m_rNotifyer.reportError("Invalid address family: %d!", af);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- IfaceProtos proto = (IfaceProtos)_FLAG_TO_ENUM(af);
|
|
|
+ IfaceProtos proto = (IfaceProtos)_FLAG_TO_ENUM(af);
|
|
|
|
|
|
- if(m_ifb.proto != proto)
|
|
|
- {
|
|
|
- m_ifb.proto = proto;
|
|
|
- emit afChanged(af);
|
|
|
- emit afNameChanged();
|
|
|
- m_rNotifyer.filterPropertyChanged();
|
|
|
+ if(m_ifb.proto != proto)
|
|
|
+ {
|
|
|
+ m_ifb.proto = proto;
|
|
|
+ emit afChanged(af);
|
|
|
+ emit afNameChanged();
|
|
|
+ m_rNotifyer.filterPropertyChanged();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+QString QInterface::inherits(void) const
|
|
|
+{
|
|
|
+ return m_ifb.inherits.c_str();
|
|
|
+}
|
|
|
+
|
|
|
QString QInterface::methodName(void) const
|
|
|
{
|
|
|
return ::GetIfaceMethodStr(m_ifb.method);
|
|
@@ -1216,6 +1652,342 @@ QInet* QInterface::inet(void)
|
|
|
return &m_inet;
|
|
|
}
|
|
|
|
|
|
+QVariant QInterface::up(void) const
|
|
|
+{
|
|
|
+ return m_ifb.up;
|
|
|
+}
|
|
|
+
|
|
|
+void QInterface::setUp(bool up)
|
|
|
+{
|
|
|
+ if(m_ifb.up != up)
|
|
|
+ {
|
|
|
+ m_ifb.up = up;
|
|
|
+ emit upChanged(m_ifb.up);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QInterface::running(void) const
|
|
|
+{
|
|
|
+ return m_ifb.running;
|
|
|
+}
|
|
|
+
|
|
|
+void QInterface::setRunning(bool running)
|
|
|
+{
|
|
|
+ if(m_ifb.running != running)
|
|
|
+ {
|
|
|
+ m_ifb.running = running;
|
|
|
+ emit runningChanged(m_ifb.running);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QInterface::txPacket(void) const
|
|
|
+{
|
|
|
+ return m_nTxPacket;
|
|
|
+}
|
|
|
+
|
|
|
+void QInterface::setTxPacket(const QVariant &val, bool bDelete)
|
|
|
+{
|
|
|
+ if(bDelete)
|
|
|
+ {
|
|
|
+ if(m_nTxPacket != 0)
|
|
|
+ {
|
|
|
+ m_nTxPacket = 0;
|
|
|
+ emit txPacketChanged(m_nTxPacket);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(val.canConvert(QMetaType::LongLong))
|
|
|
+ {
|
|
|
+ qint64 ll = val.toLongLong();
|
|
|
+ if(m_nTxPacket != ll)
|
|
|
+ {
|
|
|
+ m_nTxPacket = ll;
|
|
|
+ emit txPacketChanged(m_nTxPacket);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QInterface::rxPacket(void) const
|
|
|
+{
|
|
|
+ return m_nRxPacket;
|
|
|
+}
|
|
|
+
|
|
|
+void QInterface::setRxPacket(const QVariant &val, bool bDelete)
|
|
|
+{
|
|
|
+ if(bDelete)
|
|
|
+ {
|
|
|
+ if(m_nRxPacket != 0)
|
|
|
+ {
|
|
|
+ m_nRxPacket = 0;
|
|
|
+ emit rxPacketChanged(m_nRxPacket);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(val.canConvert(QMetaType::LongLong))
|
|
|
+ {
|
|
|
+ qint64 ll = val.toLongLong();
|
|
|
+ if(m_nRxPacket != ll)
|
|
|
+ {
|
|
|
+ m_nRxPacket = ll;
|
|
|
+ emit rxPacketChanged(m_nRxPacket);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QInterface::txByte(void) const
|
|
|
+{
|
|
|
+ return m_nTxByte;
|
|
|
+}
|
|
|
+
|
|
|
+void QInterface::setTxByte(const QVariant &val, bool bDelete)
|
|
|
+{
|
|
|
+ if(bDelete)
|
|
|
+ {
|
|
|
+ if(m_nTxByte != 0)
|
|
|
+ {
|
|
|
+ m_nTxByte = 0;
|
|
|
+ emit txByteChanged(m_nTxByte);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(val.canConvert(QMetaType::LongLong))
|
|
|
+ {
|
|
|
+ qint64 ll = val.toLongLong();
|
|
|
+ if(m_nTxByte != ll)
|
|
|
+ {
|
|
|
+ m_nTxByte = ll;
|
|
|
+ emit txByteChanged(m_nTxByte);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QInterface::rxByte(void) const
|
|
|
+{
|
|
|
+ return m_nRxByte;
|
|
|
+}
|
|
|
+
|
|
|
+void QInterface::setRxByte(const QVariant &val, bool bDelete)
|
|
|
+{
|
|
|
+ if(bDelete)
|
|
|
+ {
|
|
|
+ if(m_nRxByte != 0)
|
|
|
+ {
|
|
|
+ m_nRxByte = 0;
|
|
|
+ emit rxByteChanged(m_nRxByte);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(val.canConvert(QMetaType::LongLong))
|
|
|
+ {
|
|
|
+ qint64 ll = val.toLongLong();
|
|
|
+ if(m_nRxByte != ll)
|
|
|
+ {
|
|
|
+ m_nRxByte = ll;
|
|
|
+ emit rxByteChanged(m_nRxByte);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QInterface::rxErrors(void) const
|
|
|
+{
|
|
|
+ return m_nRxErrors;
|
|
|
+}
|
|
|
+
|
|
|
+void QInterface::setRxErrors(const QVariant &val, bool bDelete)
|
|
|
+{
|
|
|
+ if(bDelete)
|
|
|
+ {
|
|
|
+ if(m_nRxErrors != 0)
|
|
|
+ {
|
|
|
+ m_nRxErrors = 0;
|
|
|
+ emit rxErrorsChanged(m_nRxErrors);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(val.canConvert(QMetaType::LongLong))
|
|
|
+ {
|
|
|
+ qint64 ll = val.toLongLong();
|
|
|
+ if(m_nRxErrors != ll)
|
|
|
+ {
|
|
|
+ m_nRxErrors = ll;
|
|
|
+ emit rxErrorsChanged(m_nRxErrors);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QInterface::txErrors(void) const
|
|
|
+{
|
|
|
+ return m_nTxErrors;
|
|
|
+}
|
|
|
+
|
|
|
+void QInterface::setTxErrors(const QVariant &val, bool bDelete)
|
|
|
+{
|
|
|
+ if(bDelete)
|
|
|
+ {
|
|
|
+ if(m_nTxErrors != 0)
|
|
|
+ {
|
|
|
+ m_nTxErrors = 0;
|
|
|
+ emit txErrorsChanged(m_nTxErrors);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(val.canConvert(QMetaType::LongLong))
|
|
|
+ {
|
|
|
+ qint64 ll = val.toLongLong();
|
|
|
+ if(m_nTxErrors != ll)
|
|
|
+ {
|
|
|
+ m_nTxErrors = ll;
|
|
|
+ emit txErrorsChanged(m_nTxErrors);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QInterface::rxDropped(void) const
|
|
|
+{
|
|
|
+ return m_nRxDropped;
|
|
|
+}
|
|
|
+
|
|
|
+void QInterface::setRxDropped(const QVariant &val, bool bDelete)
|
|
|
+{
|
|
|
+ if(bDelete)
|
|
|
+ {
|
|
|
+ if(m_nRxDropped != 0)
|
|
|
+ {
|
|
|
+ m_nRxDropped = 0;
|
|
|
+ emit rxDroppedChanged(m_nRxDropped);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(val.canConvert(QMetaType::LongLong))
|
|
|
+ {
|
|
|
+ qint64 ll = val.toLongLong();
|
|
|
+ if(m_nRxDropped != ll)
|
|
|
+ {
|
|
|
+ m_nRxDropped = ll;
|
|
|
+ emit rxDroppedChanged(m_nRxDropped);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QInterface::txDropped(void) const
|
|
|
+{
|
|
|
+ return m_nTxDropped;
|
|
|
+}
|
|
|
+
|
|
|
+void QInterface::setTxDropped(const QVariant &val, bool bDelete)
|
|
|
+{
|
|
|
+ if(bDelete)
|
|
|
+ {
|
|
|
+ if(m_nTxDropped != 0)
|
|
|
+ {
|
|
|
+ m_nTxDropped = 0;
|
|
|
+ emit txDroppedChanged(m_nTxDropped);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(val.canConvert(QMetaType::LongLong))
|
|
|
+ {
|
|
|
+ qint64 ll = val.toLongLong();
|
|
|
+ if(m_nTxDropped != ll)
|
|
|
+ {
|
|
|
+ m_nTxDropped = ll;
|
|
|
+ emit txDroppedChanged(m_nTxDropped);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QInterface::macAddr(void) const
|
|
|
+{
|
|
|
+ char szMac[32];
|
|
|
+ memset(szMac, 0, sizeof(szMac));
|
|
|
+ sprintf(szMac, "%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX", m_szMacAddr[0], m_szMacAddr[1], m_szMacAddr[2], m_szMacAddr[3], m_szMacAddr[4], m_szMacAddr[5]);
|
|
|
+ return szMac;
|
|
|
+}
|
|
|
+
|
|
|
+void QInterface::setMacAddr(const unsigned char *mac, size_t nCbMac, bool bDelete)
|
|
|
+{
|
|
|
+ if(bDelete)
|
|
|
+ {
|
|
|
+ char szMac[32];
|
|
|
+ memset(szMac, 0, sizeof(szMac));
|
|
|
+ memset(m_szMacAddr, 0, sizeof(m_szMacAddr));
|
|
|
+ sprintf(szMac, "%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX", m_szMacAddr[0], m_szMacAddr[1], m_szMacAddr[2], m_szMacAddr[3], m_szMacAddr[4], m_szMacAddr[5]);
|
|
|
+ emit macAddrChanged(szMac);
|
|
|
+ }
|
|
|
+ else if(sizeof(m_szMacAddr) == nCbMac)
|
|
|
+ {
|
|
|
+ if(memcmp(m_szMacAddr, mac, nCbMac))
|
|
|
+ {
|
|
|
+ char szMac[32];
|
|
|
+ memset(szMac, 0, sizeof(szMac));
|
|
|
+ memcpy(m_szMacAddr, mac, nCbMac);
|
|
|
+ sprintf(szMac, "%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX", m_szMacAddr[0], m_szMacAddr[1], m_szMacAddr[2], m_szMacAddr[3], m_szMacAddr[4], m_szMacAddr[5]);
|
|
|
+ emit macAddrChanged(szMac);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void QInterface::onNetmonEvent(unsigned int nEvtType, const void *pData, LPCRT_ATTRIBUTE pAtts, size_t nMaxAtts)
|
|
|
+{
|
|
|
+ bool bDelAddr = false, bDelLink = false;
|
|
|
+
|
|
|
+ switch(nEvtType)
|
|
|
+ {
|
|
|
+ case RTM_DELLINK:
|
|
|
+ bDelLink = true;
|
|
|
+ case RTM_NEWLINK:
|
|
|
+ if(af() == AF_Inet)
|
|
|
+ {
|
|
|
+ const struct ifinfomsg &iim = *(const struct ifinfomsg*)pData;
|
|
|
+ bool bUp = !!(iim.ifi_flags & IFF_UP);
|
|
|
+ bool bRunning = !!(iim.ifi_flags & IFF_RUNNING);
|
|
|
+ setUp(bUp);
|
|
|
+ setRunning(bRunning);
|
|
|
+
|
|
|
+ if(nMaxAtts > IFLA_STATS64)
|
|
|
+ {
|
|
|
+ const RT_ATTRIBUTE &stats = pAtts[IFLA_STATS64];
|
|
|
+ if(stats.pat && stats.pat->rta_type == IFLA_STATS64 && RTA_PAYLOAD(stats.pat) == sizeof(struct rtnl_link_stats64) && stats.pData)
|
|
|
+ {
|
|
|
+ const struct rtnl_link_stats64 *pStats = (const struct rtnl_link_stats64*)stats.pData;
|
|
|
+ setRxPacket(pStats->rx_packets, bDelLink);
|
|
|
+ setTxPacket(pStats->tx_packets, bDelLink);
|
|
|
+ setRxByte(pStats->rx_bytes, bDelLink);
|
|
|
+ setTxByte(pStats->tx_bytes, bDelLink);
|
|
|
+ setRxErrors(pStats->rx_errors, bDelLink);
|
|
|
+ setTxErrors(pStats->tx_errors, bDelLink);
|
|
|
+ setRxDropped(pStats->rx_dropped, bDelLink);
|
|
|
+ setTxDropped(pStats->tx_dropped, bDelLink);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(nMaxAtts > IFLA_ADDRESS)
|
|
|
+ {
|
|
|
+ const RT_ATTRIBUTE &mac = pAtts[IFLA_ADDRESS];
|
|
|
+ if(mac.pat && mac.pat->rta_type == IFLA_ADDRESS && RTA_PAYLOAD(mac.pat) == ETH_ALEN && mac.pData)
|
|
|
+ {
|
|
|
+ setMacAddr((const unsigned char*)mac.pData, ETH_ALEN, bDelLink);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case RTM_DELADDR:
|
|
|
+ bDelAddr = true;
|
|
|
+ case RTM_NEWADDR:
|
|
|
+ if((af() == AF_Inet))
|
|
|
+ {
|
|
|
+ const struct ifaddrmsg &am = *(const struct ifaddrmsg*)pData;
|
|
|
+
|
|
|
+ if((am.ifa_family == AF_INET) && (nMaxAtts > IFA_LOCAL))
|
|
|
+ {
|
|
|
+ if(method() == IM_Dhcp)
|
|
|
+ {
|
|
|
+ const struct in_addr &addr = *(const struct in_addr*)pAtts[IFA_LOCAL].pData;
|
|
|
+ const struct in_addr mask = {_PREFIX_TO_MASK(am.ifa_prefixlen)};
|
|
|
+ m_inet.dhcp()->setDynamicAddr(addr, mask, bDelAddr);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case RTM_NEWROUTE:
|
|
|
+ case RTM_DELROUTE:
|
|
|
+ // not implemented!
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
QInet::QInet(ITF_IFACE_BLOCK &ifb, NotificationSink ¬ifyer, QObject *pParent) : QObject(pParent),
|
|
@@ -1258,7 +2030,7 @@ QStatic::QStatic(IFACE_INET_STATIC &itfs, NotificationSink ¬ifyer, QObject *p
|
|
|
m_dnsList.append(addr);
|
|
|
}
|
|
|
|
|
|
- QObject::connect(&m_netmask, SIGNAL(addressChanged(const QString&)), this, SLOT(netmaskChanged(const QString&)));
|
|
|
+ QObject::connect(&m_netmask, SIGNAL(addressChanged(const QVariant&)), this, SLOT(netmaskChanged(const QVariant&)));
|
|
|
}
|
|
|
|
|
|
QStatic::~QStatic(void)
|
|
@@ -1351,13 +2123,12 @@ void QStatic::setNetPrefix(int netprefix)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void QStatic::netmaskChanged(const QString &mask)
|
|
|
+void QStatic::netmaskChanged(const QVariant &mask)
|
|
|
{
|
|
|
struct in_addr in;
|
|
|
- std::string sa = mask.toStdString();
|
|
|
+ std::string sa = mask.toString().toStdString();
|
|
|
|
|
|
- if( inet_aton(sa.c_str(), &in) &&
|
|
|
- _IsValidNetmask(in))
|
|
|
+ if(inet_aton(sa.c_str(), &in) && _IsValidNetmask(in))
|
|
|
{
|
|
|
m_itfs.netprefix = _Mask2Prefix(in);
|
|
|
emit netPrefixChanged(m_itfs.netprefix);
|
|
@@ -1371,7 +2142,11 @@ void QStatic::netmaskChanged(const QString &mask)
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
-QDhcp::QDhcp(IFACE_INET_DHCP &itfd, NotificationSink ¬ifyer, QObject *pParent) : QObject(pParent), m_itfd(itfd), m_rNotifyer(notifyer)
|
|
|
+QDhcp::QDhcp(IFACE_INET_DHCP &itfd, NotificationSink ¬ifyer, QObject *pParent) : QObject(pParent),
|
|
|
+ m_itfd(itfd),
|
|
|
+ m_ipAddr(itfd.addr, notifyer, this),
|
|
|
+ m_netmask(itfd.netmask, notifyer, this, _IsValidNetmask),
|
|
|
+ m_rNotifyer(notifyer)
|
|
|
{
|
|
|
setObjectName("QDhcp");
|
|
|
}
|
|
@@ -1380,6 +2155,22 @@ QDhcp::~QDhcp(void)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
+void QDhcp::setDynamicAddr(const struct in_addr &addr, const struct in_addr &mask, bool bDelete)
|
|
|
+{
|
|
|
+ m_ipAddr.setAddr(bDelete ? 0.0 : addr.s_addr);
|
|
|
+ m_netmask.setAddr(bDelete ? 0.0 : mask.s_addr);
|
|
|
+}
|
|
|
+
|
|
|
+QIPv4Address* QDhcp::ipAddress(void)
|
|
|
+{
|
|
|
+ return &m_ipAddr;
|
|
|
+}
|
|
|
+
|
|
|
+QIPv4Address* QDhcp::netMask(void)
|
|
|
+{
|
|
|
+ return &m_netmask;
|
|
|
+}
|
|
|
+
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
QIPv4Address::QIPv4Address(struct in_addr &addr, NotificationSink ¬ifyer, QObject *pParent, PFN_ADDRESS_VALIDATOR pfnAddrValidator) : QObject(pParent),
|
|
@@ -1394,9 +2185,9 @@ QIPv4Address::~QIPv4Address(void)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
-QString QIPv4Address::address(void) const
|
|
|
+QVariant QIPv4Address::address(void) const
|
|
|
{
|
|
|
- return inet_ntoa(m_addr);
|
|
|
+ return ::inet_ntoa(m_addr);
|
|
|
}
|
|
|
|
|
|
int QIPv4Address::b0(void) const
|
|
@@ -1423,17 +2214,17 @@ int QIPv4Address::b3(void) const
|
|
|
return (int)pb[3];
|
|
|
}
|
|
|
|
|
|
-double QIPv4Address::addr(void) const
|
|
|
+QVariant QIPv4Address::addr(void) const
|
|
|
{
|
|
|
- return ntohl(m_addr.s_addr);
|
|
|
+ return ::ntohl(m_addr.s_addr);
|
|
|
}
|
|
|
|
|
|
-void QIPv4Address::setAddress(const QString &addr)
|
|
|
+void QIPv4Address::setAddress(const QVariant &addr)
|
|
|
{
|
|
|
struct in_addr newAddr, oldAddr;
|
|
|
- std::string sa = addr.toStdString();
|
|
|
+ std::string sa = addr.toString().toStdString();
|
|
|
|
|
|
- if(!inet_aton(sa.c_str(), &newAddr))
|
|
|
+ if(!::inet_aton(sa.c_str(), &newAddr))
|
|
|
{
|
|
|
m_rNotifyer.reportError("Invalid IP address: '%s'!", sa.c_str());
|
|
|
return;
|
|
@@ -1529,14 +2320,9 @@ void QIPv4Address::setB3(int b)
|
|
|
emit addrChanged(m_addr.s_addr);
|
|
|
}
|
|
|
|
|
|
-void QIPv4Address::setAddr(double val)
|
|
|
+void QIPv4Address::setAddr(const QVariant &val)
|
|
|
{
|
|
|
- unsigned int addr = htonl((unsigned int)(int)val);
|
|
|
- if(val > 0xFFFFFFFF)
|
|
|
- {
|
|
|
- m_rNotifyer.reportError("Invalid IP address: '%.f'!", val);
|
|
|
- return;
|
|
|
- }
|
|
|
+ unsigned int addr = ::htonl(val.toUInt());
|
|
|
|
|
|
if(m_addr.s_addr != addr)
|
|
|
{
|