diff --git a/client/fieldedit.cpp b/client/fieldedit.cpp
index 3d956d1..3663c60 100644
--- a/client/fieldedit.cpp
+++ b/client/fieldedit.cpp
@@ -29,6 +29,7 @@ void FieldEdit::setType(FieldType type)
{
// clear existing contents before changing the validator
clear();
+ setPlaceholderText("");
type_ = type;
switch (type_) {
@@ -40,6 +41,7 @@ void FieldEdit::setType(FieldType type)
break;
case kIp4Address:
setValidator(&ip4Validator_);
+ setPlaceholderText("0.0.0.0");
break;
case kIp6Address:
setValidator(&ip6Validator_);
@@ -65,6 +67,9 @@ QString FieldEdit::text() const
str.remove(QRegularExpression("[:-]"));
str.prepend("0x");
break;
+ case kIp4Address:
+ str = QString::number(QHostAddress(str).toIPv4Address());
+ break;
default:
break;
}
diff --git a/client/findreplace.cpp b/client/findreplace.cpp
index c96c65f..582852e 100644
--- a/client/findreplace.cpp
+++ b/client/findreplace.cpp
@@ -90,12 +90,19 @@ void FindReplaceDialog::on_field_currentIndexChanged(int index)
if (index < 0)
return;
+ QString fieldName = field->currentText();
FieldAttrib fieldAttrib = fieldAttrib_.at(index);
// Use heuristics to determine field type
if (fieldAttrib.bitSize == 48) {
findValue->setType(FieldEdit::kMacAddress);
replaceValue->setType(FieldEdit::kMacAddress);
+ } else if ((fieldAttrib.bitSize == 32)
+ && (fieldName.contains(QRegularExpression(
+ "address|source|destination",
+ QRegularExpression::CaseInsensitiveOption)))) {
+ findValue->setType(FieldEdit::kIp4Address);
+ replaceValue->setType(FieldEdit::kIp4Address);
} else {
qDebug("XXXXXX %s bitSize %d max %llx",
qPrintable(field->currentText()),
diff --git a/common/ipv4addressvalidator.h b/common/ipv4addressvalidator.h
index a9739ce..aaa03ae 100644
--- a/common/ipv4addressvalidator.h
+++ b/common/ipv4addressvalidator.h
@@ -21,54 +21,28 @@ along with this program. If not, see
#define _IPV4_ADDRESS_VALIDATOR_H
#include
-#include
+#include
-class IPv4AddressValidator : public QValidator
+class IPv4AddressValidator : public QRegularExpressionValidator
{
public:
IPv4AddressValidator(QObject *parent = 0)
- : QValidator(parent)
+ : QRegularExpressionValidator(
+ QRegularExpression(
+ "((25[0-5]|(2[0-4]|1\\d|[1-9]|)\\d)(\\.(?!$)|$)){4}"),
+ parent)
{
- _ip4ValidChars.setPattern("[0-9]{1,3}(.[0-9]{1,3}){0,4}");
}
- ~IPv4AddressValidator() {}
- virtual QValidator::State validate(QString &input, int& /*pos*/) const
- {
- QValidator::State state;
- QHostAddress addr(input);
-
- qDebug("%s: %s", __FUNCTION__, qPrintable(input));
-
- if (addr.protocol() == QAbstractSocket::IPv4Protocol)
- state = Acceptable;
- else
- if (_ip4ValidChars.exactMatch(input))
- state = Intermediate;
- else
- state = Invalid;
- qDebug("%s(%d): %s, ", __FUNCTION__, state, qPrintable(input));
- return state;
- }
virtual void fixup(QString &input) const
{
- input.append(".0.0.0.0");
- QHostAddress addr(input);
- int len = input.size();
+ QStringList bytes = input.split('.', QString::SkipEmptyParts);
- qDebug("%s: %s", __FUNCTION__, qPrintable(input));
+ while (bytes.count() < 4)
+ bytes.append("0");
- while (addr.protocol() != QAbstractSocket::IPv4Protocol)
- {
- len--;
- Q_ASSERT(len >= 0);
- addr.setAddress(input.left(len));
- }
-
- input = addr.toString();
+ input = bytes.join('.');
}
-private:
- QRegExp _ip4ValidChars;
};
#endif