From 77560a735b0d9fcb4da5dd1f65d0b5d263710bfa Mon Sep 17 00:00:00 2001 From: Vadim Kurland Date: Sun, 29 May 2011 14:33:21 -0700 Subject: [PATCH] see #2446 fixed deduplication of address table objects --- src/import/PFImporter.cpp | 15 ++++++++------- src/import/addressObjectMaker.cpp | 24 ++++++++++++++++++++---- src/import/addressObjectMaker.h | 1 + src/import/objectMaker.cpp | 4 ++-- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/import/PFImporter.cpp b/src/import/PFImporter.cpp index 42c86d38d..2fdd6fef1 100644 --- a/src/import/PFImporter.cpp +++ b/src/import/PFImporter.cpp @@ -810,15 +810,16 @@ Interface* PFImporter::getInterfaceByName(const string &name) void PFImporter::newAddressTableObject(const string &name, const string &file) { ObjectMaker maker(Library::cast(library), error_tracker); - AddressTable *at = AddressTable::cast( - commitObject(maker.createObject(AddressTable::TYPENAME, name.c_str()))); - assert(at!=NULL); - at->setRunTime(true); - at->setSourceName(file); - address_table_registry[name.c_str()] = at; + ObjectSignature sig(error_tracker); + sig.type_name = AddressTable::TYPENAME; + sig.object_name = QString::fromUtf8(name.c_str()); + sig.address_table_name = QString::fromUtf8(file.c_str()); + FWObject *at = address_maker->createObject(sig); + + address_table_registry[sig.object_name] = at; addMessageToLog(QString("Address Table: <%1> file %2") - .arg(name.c_str()).arg(file.c_str())); + .arg(sig.object_name).arg(file.c_str())); } void PFImporter::newAddressTableObject(const string &name, diff --git a/src/import/addressObjectMaker.cpp b/src/import/addressObjectMaker.cpp index f36fdf764..c714d9e44 100644 --- a/src/import/addressObjectMaker.cpp +++ b/src/import/addressObjectMaker.cpp @@ -25,6 +25,7 @@ #include "fwbuilder/Address.h" #include "fwbuilder/AddressRange.h" +#include "fwbuilder/AddressTable.h" #include "fwbuilder/DNSName.h" #include "fwbuilder/FWObject.h" #include "fwbuilder/FWObjectDatabase.h" @@ -54,7 +55,12 @@ FWObject* AddressObjectMaker::createObject(ObjectSignature &sig) if (sig.type_name == AddressRange::TYPENAME) obj = createAddressRange(sig); else - obj = createAddress(sig); + { + if (sig.type_name == AddressTable::TYPENAME) + obj = createAddressTable(sig); + else + obj = createAddress(sig); + } // Now I should build new signature because actual object type has // only been determined in createAddress() @@ -133,7 +139,6 @@ FWObject* AddressObjectMaker::createAddress(ObjectSignature &sig) net->setAddress( InetAddr(sig.address.toStdString()) ); } catch (FWException &ex) { -// throw ObjectMakerException( error_tracker->registerError( QString("Error converting address '%1'").arg(sig.address)); } @@ -163,7 +168,6 @@ FWObject* AddressObjectMaker::createAddressRange(ObjectSignature &sig) ar->setRangeStart( InetAddr(addr1.toStdString()) ); } catch (FWException &ex) { -// throw ObjectMakerException( error_tracker->registerError( QString("Error converting address '%1'").arg(addr1)); } @@ -173,7 +177,6 @@ FWObject* AddressObjectMaker::createAddressRange(ObjectSignature &sig) ar->setRangeEnd( InetAddr(addr2.toStdString()) ); } catch (FWException &ex) { -// throw ObjectMakerException( error_tracker->registerError( QString("Error converting address '%1'").arg(addr2)); } @@ -182,3 +185,16 @@ FWObject* AddressObjectMaker::createAddressRange(ObjectSignature &sig) } +FWObject* AddressObjectMaker::createAddressTable(ObjectSignature &sig) +{ + FWObject *obj = findMatchingObject(sig); + if (obj) return obj; + + AddressTable *at = AddressTable::cast( + ObjectMaker::createObject(AddressTable::TYPENAME, + sig.object_name.toUtf8().constData())); + assert(at!=NULL); + at->setRunTime(true); + at->setSourceName(sig.address_table_name.toStdString()); + return at; +} diff --git a/src/import/addressObjectMaker.h b/src/import/addressObjectMaker.h index e48b9f59a..f38a15bf3 100644 --- a/src/import/addressObjectMaker.h +++ b/src/import/addressObjectMaker.h @@ -51,6 +51,7 @@ public: protected: virtual libfwbuilder::FWObject* createAddress(ObjectSignature &sig); virtual libfwbuilder::FWObject* createAddressRange(ObjectSignature &sig); + virtual libfwbuilder::FWObject* createAddressTable(ObjectSignature &sig); }; diff --git a/src/import/objectMaker.cpp b/src/import/objectMaker.cpp index febe33e82..e04cc9a41 100644 --- a/src/import/objectMaker.cpp +++ b/src/import/objectMaker.cpp @@ -748,7 +748,7 @@ void* ObjectSignature::dispatch(AddressTable *obj, void*) { object_name = QString::fromUtf8(obj->getName().c_str()); type_name = obj->getTypeName().c_str(); - address_table_name = obj->getSourceName().c_str(); + address_table_name = QString::fromUtf8(obj->getSourceName().c_str()); return this; } @@ -1038,7 +1038,7 @@ void ObjectMaker::prepareForDeduplication(FWObject *root) Host::cast(root) || FWOptions::cast(root)) return; - if (Address::cast(root) || Service::cast(root)) + if (Address::cast(root) || MultiAddress::cast(root) || Service::cast(root)) { ObjectSignature sig(error_tracker);