Index: Makefile
===================================================================
--- Makefile	(revision 76bebfc9d489e4da5fafbb89b34edf92254696a5)
+++ Makefile	(revision e354032537c5474aee5a4d960a283020339ea977)
@@ -7,5 +7,5 @@
 
 netslow: netslow.o NetFlow9Processor.o NetFlowDataTemplateCache.o NetFlowDataTemplate.o
-	$(CC) -o netslow netslow.o NetFlow9Processor.o NetFlowDataTemplateCache.o $(LIBS)
+	$(CC) -o netslow netslow.o NetFlow9Processor.o NetFlowDataTemplateCache.o NetFlowDataTemplate.o $(LIBS)
 
 
Index: NetFlow9Processor.cpp
===================================================================
--- NetFlow9Processor.cpp	(revision 76bebfc9d489e4da5fafbb89b34edf92254696a5)
+++ NetFlow9Processor.cpp	(revision e354032537c5474aee5a4d960a283020339ea977)
@@ -72,6 +72,6 @@
 		if (flowSetID > 255) {
 			//DATA FlowSet
-			//printf("  -> Found data flowSetID %d, length %d.\n", flowSetID, flowSetLength);
-			//processDataFlowSet(b,nextIndex,flowSetID,flowSetLength);
+			printf("  -> Found data flowSetID %d, length %d.\n", flowSetID, flowSetLength);
+			processDataFlowSet(b,nextIndex,flowSetID,flowSetLength);
 		}
 		else if (flowSetID == 0) {
@@ -95,6 +95,27 @@
 }
 
-void NetFlow9Processor::processDataFlowSet(unsigned char b[], int nextIndex, unsigned short flowSetID, unsigned short flowSetLength) {
+void NetFlow9Processor::processDataFlowSet(unsigned char b[], int startIndex, unsigned short flowSetID, unsigned short flowSetLength) {
+	int nextIndex = startIndex + 4;             // Next place to look (skip 4 header bytes already parsed)
+	int endIndex = startIndex + flowSetLength ; // End the loop at the end of the template
+	NetFlowDataTemplate *dataTemplate;          // Data Template object
+	NetFlowDataTemplate::Field_t field;
+	int count = 0;
 
+	do {
+		
+		dataTemplate = dataTemplateCache->GetDataTemplate(flowSetID);
+		if (!dataTemplate) {
+			printf("  -> Template ID %d doesn't exist in the cache...  skipping\n", flowSetID);
+			return;
+		}
+		printf("  -> Parsing record %d.\n", count);
+		for (std::list<NetFlowDataTemplate::Field_t>::iterator it=dataTemplate->Fields.begin(); it != dataTemplate->Fields.end(); ++it) {
+			field = *it;
+			printf("    -> Code: %d, length: %d\n", field.code, field.length);
+			nextIndex += field.length;
+		}
+		count++;
+	}
+	while ( nextIndex < endIndex );
 }
 void NetFlow9Processor::processTemplateFlowSet(unsigned char b[], int startIndex, unsigned short flowSetLength) {
@@ -103,5 +124,8 @@
 	int endIndex = startIndex + flowSetLength ; // End the loop at the end of the template
 	unsigned short count = 0;					// Count of fields to extract
-	unsigned short id = 0;						// ID the template applies to	
+	unsigned short id = 0;						// ID the template applies to
+	NetFlowDataTemplate *dataTemplate;			// Data Template object
+	NetFlowDataTemplate *existingDataTemplate;	// Data Template object if it already exists
+	NetFlowDataTemplate::Field_t field;
 
 	do {
@@ -116,12 +140,40 @@
 		nextIndex += 4;
 
+		dataTemplate = new NetFlowDataTemplate(id, count);
+
 		int i;
 
 		for (i=0; i < count; i++) {
-			unsigned short field = ByteTouInt16(b,nextIndex);
-			unsigned short length = ByteTouInt16(b,nextIndex+2);
-			printf("    -> Field %d. Field Code %d, length %d\n", i, field, length );
+			field.code = ByteTouInt16(b,nextIndex);
+			field.length = ByteTouInt16(b,nextIndex+2);
+			printf("    -> Field %d. Field Code %d, length %d\n", i, field.code, field.length );
+			dataTemplate->Fields.push_back( field );
 			nextIndex += 4;
 		}
+
+		//Check if ID is in cache
+		if ( dataTemplateCache->ExistsDataTemplate(id) ) {
+			//Yes --> Update
+			printf("  -> Template ID %d in cache.\n", id);
+			existingDataTemplate = dataTemplateCache->DeleteDataTemplate(id);
+			delete existingDataTemplate;
+			if ( dataTemplateCache->AddDataTemplate(id, dataTemplate) ) {
+				printf("  -> Template ID %d updated.\n", id);
+			}
+			else {
+				printf("  -> ERROR: Failed to update Template ID %d.\n", id);
+			}
+		}
+		else {
+			//No --> Add
+			if ( dataTemplateCache->AddDataTemplate(id, dataTemplate) ) {
+				printf("  -> Template ID %d added.\n", id);
+			}
+			else {
+				printf("  -> ERROR: Failed to add Template ID %d.\n", id);
+			}
+		}
+
+
 	}
 	while ( nextIndex < endIndex );
Index: NetFlowDataTemplate.h
===================================================================
--- NetFlowDataTemplate.h	(revision 76bebfc9d489e4da5fafbb89b34edf92254696a5)
+++ NetFlowDataTemplate.h	(revision e354032537c5474aee5a4d960a283020339ea977)
@@ -9,11 +9,11 @@
 	public:
 
-	typedef struct Field Field_t;
 	struct Field {
 		unsigned short code;
 		unsigned short length;
 	};
+	typedef struct Field Field_t;
 
-	std::list<Field_t*> Fields;
+	std::list<Field_t> Fields;
 
 	//Constructor (id, length)
Index: NetFlowDataTemplateCache.cpp
===================================================================
--- NetFlowDataTemplateCache.cpp	(revision 76bebfc9d489e4da5fafbb89b34edf92254696a5)
+++ NetFlowDataTemplateCache.cpp	(revision e354032537c5474aee5a4d960a283020339ea977)
@@ -2,4 +2,5 @@
 #include <stdlib.h>
 #include <stdexcept>
+#include <stdio.h>
 
 NetFlowDataTemplateCache::NetFlowDataTemplateCache(void) {
@@ -8,13 +9,17 @@
 bool NetFlowDataTemplateCache::AddDataTemplate (unsigned short id, NetFlowDataTemplate* dataTemplate) {
 	NetFlowDataTemplate *test;
+	printf("    -> Adding DataTemplate ID %d.\n", id);
 	try {
+		printf("      -> Trying to fetch %d.\n", id);
 		test = Cache.at(id);
 	}
 	catch (const std::out_of_range oor) {
 		//Out of range --> Not in Cache - Great!
-		Cache.at(id) = dataTemplate;
+		printf("      -> Not found - adding.\n");
+		Cache[id] = dataTemplate;
 		return true;
 	}
 	//Uh-oh - this ID is already in the cache
+	printf("      -> Already in the cache - fail.\n", id);
 	return 0;
 }
@@ -22,11 +27,15 @@
 bool NetFlowDataTemplateCache::ExistsDataTemplate (unsigned short id) {
 	NetFlowDataTemplate *test;
+	printf("    -> Checking for DataTemplate ID %d.\n", id);
 	try {
+		printf("      -> Trying to fetch %d.\n", id);
 		test = Cache.at(id);
 	}
 	catch (const std::out_of_range oor) {
+		printf("      -> Not found.\n");
 		//Out of range --> Not in Cache
 		return 0;
 	}
+	printf("      -> Found.\n");
 	return 1;
 }
@@ -34,11 +43,32 @@
 NetFlowDataTemplate* NetFlowDataTemplateCache::GetDataTemplate (unsigned short id) {
 	NetFlowDataTemplate *dataTemplate;
+	printf("    -> Getting DataTemplate ID %d.\n", id);
 	try {
+		printf("      -> Trying to fetch %d.\n", id);
 		dataTemplate = Cache.at(id);
 	}
 	catch (const std::out_of_range oor) {
+		printf("      -> Not found.\n");
 		//Out of range --> Not in Cache
 		return 0;
 	}
+	printf("      -> Found.\n");
 	return dataTemplate;
 }
+
+NetFlowDataTemplate* NetFlowDataTemplateCache::DeleteDataTemplate (unsigned short id) {
+	NetFlowDataTemplate *dataTemplate;
+	printf("    -> Deleting DataTemplate ID %d.\n", id);
+	try {
+		printf("      -> Trying to fetch %d.\n", id);
+		dataTemplate = Cache.at(id);
+		Cache.erase(id);
+	}
+	catch (const std::out_of_range oor) {
+		printf("      -> Not found.\n");
+		//Out of range --> Not in Cache
+		return 0;
+	}
+	printf("      -> Deleted.\n");
+	return dataTemplate;
+}
Index: NetFlowDataTemplateCache.h
===================================================================
--- NetFlowDataTemplateCache.h	(revision 76bebfc9d489e4da5fafbb89b34edf92254696a5)
+++ NetFlowDataTemplateCache.h	(revision e354032537c5474aee5a4d960a283020339ea977)
@@ -15,4 +15,5 @@
 		bool AddDataTemplate(unsigned short id, NetFlowDataTemplate*);
 		bool ExistsDataTemplate(unsigned short id);
+		NetFlowDataTemplate* DeleteDataTemplate(unsigned short id);
 		NetFlowDataTemplate* GetDataTemplate(unsigned short id);
 		
