From c985fb077154e3be3ecf580be7f349f6fded085b Mon Sep 17 00:00:00 2001
From: jdh8d <jdh8d@git.zephyr-software.com>
Date: Thu, 18 Feb 2016 16:05:08 +0000
Subject: [PATCH] added contents to scoops

Former-commit-id: 589996f6bef79940c04ad67b813969c69950723b
---
 libIRDB/include/core/scoop.hpp | 15 +++++++++++----
 libIRDB/src/core/fileir.cpp    |  3 ++-
 libIRDB/test/fill_in_cfg.cpp   | 10 ++++++++--
 3 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/libIRDB/include/core/scoop.hpp b/libIRDB/include/core/scoop.hpp
index 8da3bbf72..4fe24dca9 100644
--- a/libIRDB/include/core/scoop.hpp
+++ b/libIRDB/include/core/scoop.hpp
@@ -30,29 +30,35 @@ class DataScoop_t : public BaseObj_t
 				libIRDB::AddressID_t* p_start,
 				libIRDB::AddressID_t* p_end,
 				libIRDB::Type_t* p_type,
-				int p_permissions) 
+				int p_permissions, 
+				std::string p_contents)
 			:
 				BaseObj_t(NULL),
 				name(p_name),
 				start(p_start),
 				end(p_end),
 				type(p_type),
-				permissions(p_permissions)
+				permissions(p_permissions),
+				contents(p_contents)
 		{
+			assert(start && end);
 			SetBaseID(id);
 		}
 
 		std::string GetName() const { return name; }
+		std::string GetContents() const { return contents; }
 		libIRDB::AddressID_t* GetStart() const { return start; }
 		libIRDB::AddressID_t* GetEnd() const { return end; }
 		libIRDB::Type_t* GetType() const { return type; }
+		libIRDB::virtual_offset_t GetSize() { assert(start && end); return end->GetVirtualOffset() - start->GetVirtualOffset() ; }
 		bool isReadable() const  { return (permissions & permissions_r) == permissions_r; }
 		bool isWriteable() const { return (permissions & permissions_w) == permissions_w; };
 		bool isExecuteable() const { return (permissions & permissions_x) == permissions_x; };
 
 		void SetName(const std::string &n) { name=n; }
-		void SetStart( libIRDB::AddressID_t* addr) { start=addr; }
-		void SetEnd( libIRDB::AddressID_t* addr ) { end=addr; }
+		void SetContents(const std::string &n) { contents=n; }
+		void SetStart( libIRDB::AddressID_t* addr) { assert(addr); start=addr; }
+		void SetEnd( libIRDB::AddressID_t* addr ) { assert(addr); end=addr; }
 		void SetType( libIRDB::Type_t*  t) { type=t; }
 
 		void SetReadable() { permissions |= permissions_r; }
@@ -75,6 +81,7 @@ class DataScoop_t : public BaseObj_t
 		libIRDB::AddressID_t* end;
 		libIRDB::Type_t* type;
 		int permissions;
+		std::string contents;
 
 
 };
diff --git a/libIRDB/src/core/fileir.cpp b/libIRDB/src/core/fileir.cpp
index 466b21c80..9048747ef 100644
--- a/libIRDB/src/core/fileir.cpp
+++ b/libIRDB/src/core/fileir.cpp
@@ -1174,8 +1174,9 @@ std::map<db_id_t,DataScoop_t*> FileIR_t::ReadScoopsFromDB
                 db_id_t end_id=atoi(dbintr->GetResultColumn("end_address_id").c_str());
 		AddressID_t* end_addr=addrMap[end_id];
                 int permissions=atoi(dbintr->GetResultColumn("permissions").c_str());
+                std::string contents=dbintr->GetResultColumn("data");
 
-		DataScoop_t* newscoop=new DataScoop_t(sid,name,start_addr,end_addr,type,permissions);
+		DataScoop_t* newscoop=new DataScoop_t(sid,name,start_addr,end_addr,type,permissions,contents);
 		assert(newscoop);
 		GetDataScoops().insert(newscoop);
 		dbintr->MoveToNextRow();
diff --git a/libIRDB/test/fill_in_cfg.cpp b/libIRDB/test/fill_in_cfg.cpp
index 354e87625..cd70a20be 100644
--- a/libIRDB/test/fill_in_cfg.cpp
+++ b/libIRDB/test/fill_in_cfg.cpp
@@ -469,7 +469,13 @@ void fill_in_scoops(FileIR_t *firp)
 		endaddr->SetFileID(firp->GetFile()->GetBaseID());
 		firp->GetAddresses().insert(endaddr);
 
-		Type_t *chunk_type=NULL; /* FIXME -- need to figure out the type system for schoops, but NULL should remain valid */
+		string the_contents;
+		the_contents.resize(elfiop.sections[secndx]->get_size()); 
+		// deal with .bss segments that are 0 init'd.
+		if (elfiop.sections[secndx]->get_data()) 
+			the_contents.assign(elfiop.sections[secndx]->get_data(),elfiop.sections[secndx]->get_size());
+
+		Type_t *chunk_type=NULL; /* FIXME -- need to figure out the type system for scoops, but NULL should remain valid */
 
 		/* permissions */
 		int permissions= 
@@ -477,7 +483,7 @@ void fill_in_scoops(FileIR_t *firp)
 			( elfiop.sections[secndx]->isWriteable() << 1 ) | 
 			( elfiop.sections[secndx]->isExecutable() << 0 ) ;
 
-		DataScoop_t *newscoop=new DataScoop_t(BaseObj_t::NOT_IN_DATABASE, name, startaddr, endaddr, NULL, permissions);
+		DataScoop_t *newscoop=new DataScoop_t(BaseObj_t::NOT_IN_DATABASE, name, startaddr, endaddr, NULL, permissions, the_contents);
 		assert(newscoop);
 		firp->GetDataScoops().insert(newscoop);
 
-- 
GitLab