diff --git a/src/import/addressObjectMaker.cpp b/src/import/addressObjectMaker.cpp index 8392c7bfa..37ddff934 100644 --- a/src/import/addressObjectMaker.cpp +++ b/src/import/addressObjectMaker.cpp @@ -36,6 +36,9 @@ #include +#include + + extern int fwbdebug; using namespace libfwbuilder; @@ -46,10 +49,10 @@ AddressObjectMaker::~AddressObjectMaker() {} FWObject* AddressObjectMaker::createObject(ObjectSignature &sig) { - assert( ! sig.type_name.isEmpty()); +// FWObject *obj = findMatchingObject(sig); +// if (obj) return obj; - FWObject *obj = findMatchingObject(sig); - if (obj) return obj; + FWObject *obj = NULL; if (sig.type_name == AddressRange::TYPENAME) obj = createAddressRange(sig.address_range_start, sig.address_range_end); @@ -77,11 +80,49 @@ FWObject* AddressObjectMaker::createAddress(const QString &addr, correct_nm = (~orig_nm).toString().c_str(); } + try + { + InetAddr(correct_nm.toStdString()); + } catch (FWException &ex) + { + if (correct_nm.contains('.')) + { + // netmask has '.' in it but conversion failed. + throw ObjectMakerException( + QString("Error converting netmask '%1'").arg(correct_nm)); + } else + { + // no dot in netmask, perhaps it is specified by its length? + // if netmask is specified by length, need to use special + // constructor for class Netmask to convert + bool ok = false; + int nm_len = correct_nm.toInt(&ok); + if (ok) + { + correct_nm = InetAddr(nm_len).toString().c_str(); + } else + { + // could not convert netmask as simple integer + throw ObjectMakerException( + QString("Error converting netmask '%1'").arg(correct_nm)); + } + } + } + + ObjectSignature sig; + sig.address = addr; + sig.netmask = correct_nm; + if ( correct_nm == InetAddr::getAllOnes().toString().c_str() ) { QString name; try { + sig.type_name = IPv4::TYPENAME; + + FWObject *obj = findMatchingObject(sig); + if (obj) return obj; + InetAddr obj_addr(addr.toStdString()); // testing if string converts to an address name = QString("h-") + addr; Address *a = Address::cast( @@ -89,12 +130,17 @@ FWObject* AddressObjectMaker::createAddress(const QString &addr, a->setAddress(obj_addr); a->setNetmask(InetAddr(InetAddr::getAllOnes())); return a; + } catch(FWException &ex) { // address text line can not be converted to ipv4 address. // Since parsers do not understand ipv6 yet, assume this // is a host address and create DNSName object + sig.type_name = DNSName::TYPENAME; + FWObject *obj = findMatchingObject(sig); + if (obj) return obj; + name = addr; DNSName *da = DNSName::cast( ObjectMaker::createObject(DNSName::TYPENAME, name.toStdString())); @@ -105,6 +151,12 @@ FWObject* AddressObjectMaker::createAddress(const QString &addr, } else { + sig.type_name = Network::TYPENAME; + + qDebug() << "Search for " << sig.toString(); + + FWObject *obj = findMatchingObject(sig); + if (obj) return obj; QString name = QString("net-") + addr + "/" + correct_nm; Network *net = Network::cast( @@ -118,34 +170,8 @@ FWObject* AddressObjectMaker::createAddress(const QString &addr, QString("Error converting address '%1'").arg(addr)); } - try - { - net->setNetmask( InetAddr(correct_nm.toStdString()) ); - } catch (FWException &ex) - { - if (correct_nm.contains('.')) - { - // netmask has '.' in it but conversion failed. - throw ObjectMakerException( - QString("Error converting netmask '%1'").arg(correct_nm)); - } else - { - // no dot in netmask, perhaps it is specified by its length? - // if netmask is specified by length, need to use special - // constructor for class Netmask to convert - bool ok = false; - int nm_len = correct_nm.toInt(&ok); - if (ok) - { - net->setNetmask( InetAddr(nm_len) ); - } else - { - // could not convert netmask as simple integer - throw ObjectMakerException( - QString("Error converting netmask '%1'").arg(correct_nm)); - } - } - } + // we have already verified netmask above + net->setNetmask( InetAddr(correct_nm.toStdString()) ); return net; } diff --git a/src/import/objectMaker.cpp b/src/import/objectMaker.cpp index 130d30642..e207fe21a 100644 --- a/src/import/objectMaker.cpp +++ b/src/import/objectMaker.cpp @@ -838,12 +838,14 @@ void ObjectMaker::prepareForDeduplication(FWObject *root) root->dispatch(&sig, (void*)(NULL)); + qDebug() << "Registering " << sig.toString(); + registerNamedObject(sig, root); registerAnonymousObject(sig, root); // this erases sig.object_name } - if (Library::isA(root) && root->getId() == FWObjectDatabase::DELETED_OBJECTS_ID) - return; + if (Library::isA(root) && + root->getId() == FWObjectDatabase::DELETED_OBJECTS_ID) return; for (FWObject::iterator it=root->begin(); it!=root->end(); ++it) { diff --git a/src/parsers/PIXCfgLexer.cpp b/src/parsers/PIXCfgLexer.cpp index 9ccfcfeef..22c86d895 100644 --- a/src/parsers/PIXCfgLexer.cpp +++ b/src/parsers/PIXCfgLexer.cpp @@ -1,4 +1,4 @@ -/* $ANTLR 2.7.7 (20090306): "pix.g" -> "PIXCfgLexer.cpp"$ */ +/* $ANTLR 2.7.7 (20100319): "pix.g" -> "PIXCfgLexer.cpp"$ */ #line 42 "pix.g" // gets inserted before the antlr generated includes in the cpp diff --git a/src/parsers/PIXCfgLexer.hpp b/src/parsers/PIXCfgLexer.hpp index 896c369f2..9d542ff58 100644 --- a/src/parsers/PIXCfgLexer.hpp +++ b/src/parsers/PIXCfgLexer.hpp @@ -9,7 +9,7 @@ #line 11 "PIXCfgLexer.hpp" #include -/* $ANTLR 2.7.7 (20090306): "pix.g" -> "PIXCfgLexer.hpp"$ */ +/* $ANTLR 2.7.7 (20100319): "pix.g" -> "PIXCfgLexer.hpp"$ */ #include #include #include diff --git a/src/parsers/PIXCfgParser.cpp b/src/parsers/PIXCfgParser.cpp index 64ee57564..88ea6ed68 100644 --- a/src/parsers/PIXCfgParser.cpp +++ b/src/parsers/PIXCfgParser.cpp @@ -1,4 +1,4 @@ -/* $ANTLR 2.7.7 (20090306): "pix.g" -> "PIXCfgParser.cpp"$ */ +/* $ANTLR 2.7.7 (20100319): "pix.g" -> "PIXCfgParser.cpp"$ */ #line 42 "pix.g" // gets inserted before the antlr generated includes in the cpp diff --git a/src/parsers/PIXCfgParser.hpp b/src/parsers/PIXCfgParser.hpp index 1589adcbc..ea3d17b92 100644 --- a/src/parsers/PIXCfgParser.hpp +++ b/src/parsers/PIXCfgParser.hpp @@ -9,7 +9,7 @@ #line 11 "PIXCfgParser.hpp" #include -/* $ANTLR 2.7.7 (20090306): "pix.g" -> "PIXCfgParser.hpp"$ */ +/* $ANTLR 2.7.7 (20100319): "pix.g" -> "PIXCfgParser.hpp"$ */ #include #include #include "PIXCfgParserTokenTypes.hpp" diff --git a/src/parsers/PIXCfgParserTokenTypes.hpp b/src/parsers/PIXCfgParserTokenTypes.hpp index d70b891d8..92818a847 100644 --- a/src/parsers/PIXCfgParserTokenTypes.hpp +++ b/src/parsers/PIXCfgParserTokenTypes.hpp @@ -1,7 +1,7 @@ #ifndef INC_PIXCfgParserTokenTypes_hpp_ #define INC_PIXCfgParserTokenTypes_hpp_ -/* $ANTLR 2.7.7 (20090306): "pix.g" -> "PIXCfgParserTokenTypes.hpp"$ */ +/* $ANTLR 2.7.7 (20100319): "pix.g" -> "PIXCfgParserTokenTypes.hpp"$ */ #ifndef CUSTOM_API # define CUSTOM_API diff --git a/src/parsers/PIXCfgParserTokenTypes.txt b/src/parsers/PIXCfgParserTokenTypes.txt index 62bb2039d..e80c5f691 100644 --- a/src/parsers/PIXCfgParserTokenTypes.txt +++ b/src/parsers/PIXCfgParserTokenTypes.txt @@ -1,4 +1,4 @@ -// $ANTLR 2.7.7 (20090306): pix.g -> PIXCfgParserTokenTypes.txt$ +// $ANTLR 2.7.7 (20100319): pix.g -> PIXCfgParserTokenTypes.txt$ PIXCfgParser // output token vocab name NEWLINE=4 QUIT="quit"=5