Commit 66b8339c authored by Andrea Zoli's avatar Andrea Zoli
Browse files

Store fields section offsets.

parent 2c8b3276
Loading
Loading
Loading
Loading
+11 −3
Original line number Original line Diff line number Diff line
@@ -46,6 +46,9 @@ public:
	
	
	/// Logical type
	/// Logical type
	enum LogicalFieldDataType type;
	enum LogicalFieldDataType type;

    int sectionOffsetBits;
    int sectionOffsetBytes;
};
};




@@ -56,7 +59,7 @@ class Field
public:
public:


    /// Constructor of class.
    /// Constructor of class.
	Field(std::string name, std::string typeStr, std::string dim, std::string prVal, int count);
	Field(std::string name, std::string typeStr, std::string dim, std::string prVal, int count, int sectionOffset);


    /// Destructor of class.
    /// Destructor of class.
    ~Field();
    ~Field();
@@ -101,6 +104,12 @@ public:
	
	
	void print();
	void print();


    /// Returns the offset in bytes of the field from the begin of the section.
    /// Warning: if the field is not aligned to 8-bit this method returns -1.
	int getSectionOffset() {
	    return type->sectionOffsetBytes;
	}

protected:
protected:


	static std::map<std::string, LogicalFieldDataType> typeStringToEnum;
	static std::map<std::string, LogicalFieldDataType> typeStringToEnum;
@@ -110,7 +119,6 @@ protected:
    int progressiv;
    int progressiv;


    FieldType * type;
    FieldType * type;

};
};


}
}
+4 −2
Original line number Original line Diff line number Diff line
@@ -62,7 +62,7 @@ std::map<std::string, LogicalFieldDataType> Field::makeMap()


std::map<std::string, LogicalFieldDataType> Field::typeStringToEnum = Field::makeMap();
std::map<std::string, LogicalFieldDataType> Field::typeStringToEnum = Field::makeMap();


Field::Field(std::string name, std::string typeStr, std::string dim, std::string prVal, int count)
Field::Field(std::string name, std::string typeStr, std::string dim, std::string prVal, int count, int sectionOffset)
	: progressiv(count)
	: progressiv(count)
{
{
    value = 0;
    value = 0;
@@ -93,8 +93,10 @@ Field::Field(std::string name, std::string typeStr, std::string dim, std::string
        type->name = name;
        type->name = name;
		type->dimension = atoi(dim.c_str());
		type->dimension = atoi(dim.c_str());
		type->type = Field::typeStringToEnum[typeStr];
		type->type = Field::typeStringToEnum[typeStr];
		type->sectionOffsetBits = sectionOffset;
        type->sectionOffsetBytes = (sectionOffset % 8) ? -1 : sectionOffset / 8;
#ifdef DEBUG
#ifdef DEBUG
		std::cout << "Adding field '" << name << "', " << type->dimension << " bits type " << typeStr << " (" << type->type << ")" << std::endl;
		std::cout << "Adding field '" << name << "', " << type->dimension << " bits type " << typeStr << " (" << type->type << ")" << " section offset " << type->sectionOffsetBits << " " << type->sectionOffsetBytes << std::endl;
#endif
#endif


        if(prVal.compare("none") != 0)
        if(prVal.compare("none") != 0)
+17 −9
Original line number Original line Diff line number Diff line
@@ -125,6 +125,7 @@ void PartOfPacket::loadFields(pugi::xml_node node)
    fields = new Field*[count];
    fields = new Field*[count];


	// field parsing
	// field parsing
    int sectionOffset = 0;
	for(pugi::xml_node_iterator it=node.begin(); it != node.end(); ++it)
	for(pugi::xml_node_iterator it=node.begin(); it != node.end(); ++it)
	{
	{
		if(string(it->name()).compare("field") != 0)
		if(string(it->name()).compare("field") != 0)
@@ -143,19 +144,21 @@ void PartOfPacket::loadFields(pugi::xml_node node)
				name = it->attribute("name").value();
				name = it->attribute("name").value();
				dimension = "16";
				dimension = "16";
				value = "none";
				value = "none";
				Field* f = new Field(name, typeStr, dimension, value, numberOfFields);
				Field* f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
				fieldsDimension += f->size();
				fieldsDimension += f->size();
				fields[numberOfFields] = f;
				fields[numberOfFields] = f;
				numberOfFields++;
				numberOfFields++;
				sectionOffset += 16;


				name = it->attribute("name").value();
				name = it->attribute("name").value();
				name += "__1";
				name += "__1";
				dimension = "16";
				dimension = "16";
				value = "none";
				value = "none";
				f = new Field(name, typeStr, dimension, value, numberOfFields);
				f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
				fieldsDimension += f->size();
				fieldsDimension += f->size();
				fields[numberOfFields] = f;
				fields[numberOfFields] = f;
				numberOfFields++;
				numberOfFields++;
				sectionOffset += 16;


				found = true;
				found = true;
				break;
				break;
@@ -172,37 +175,41 @@ void PartOfPacket::loadFields(pugi::xml_node node)
				name = it->attribute("name").value();
				name = it->attribute("name").value();
				dimension = "16";
				dimension = "16";
				value = "none";
				value = "none";
				Field* f = new Field(name, typeStr, dimension, value, numberOfFields);
				Field* f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
				fieldsDimension += f->size();
				fieldsDimension += f->size();
				fields[numberOfFields] = f;
				fields[numberOfFields] = f;
				numberOfFields++;
				numberOfFields++;
				sectionOffset += 16;


				name = it->attribute("name").value();
				name = it->attribute("name").value();
				name += "__1";
				name += "__1";
				dimension = "16";
				dimension = "16";
				value = "none";
				value = "none";
				f = new Field(name, typeStr, dimension, value, numberOfFields);
				f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
				fieldsDimension += f->size();
				fieldsDimension += f->size();
				fields[numberOfFields] = f;
				fields[numberOfFields] = f;
				numberOfFields++;
				numberOfFields++;
				sectionOffset += 16;


				name = it->attribute("name").value();
				name = it->attribute("name").value();
				name += "__2";
				name += "__2";
				dimension = "16";
				dimension = "16";
				value = "none";
				value = "none";
				f = new Field(name, typeStr, dimension, value, numberOfFields);
				f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
				fieldsDimension += f->size();
				fieldsDimension += f->size();
				fields[numberOfFields] = f;
				fields[numberOfFields] = f;
				numberOfFields++;
				numberOfFields++;
				sectionOffset += 16;


				name = it->attribute("name").value();
				name = it->attribute("name").value();
				name += "__3";
				name += "__3";
				dimension = "16";
				dimension = "16";
				value = "none";
				value = "none";
				f = new Field(name, typeStr, dimension, value, numberOfFields);
				f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
				fieldsDimension += f->size();
				fieldsDimension += f->size();
				fields[numberOfFields] = f;
				fields[numberOfFields] = f;
				numberOfFields++;
				numberOfFields++;
				sectionOffset += 16;


				found = true;
				found = true;
				break;
				break;
@@ -221,10 +228,11 @@ void PartOfPacket::loadFields(pugi::xml_node node)
			value = "none";
			value = "none";
		else
		else
			value = constvalue.value();
			value = constvalue.value();
		Field* f = new Field(name, typeStr, dimension, value, numberOfFields);
		Field* f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
		fieldsDimension += f->size();
		fieldsDimension += f->size();
		fields[numberOfFields] = f;
		fields[numberOfFields] = f;
		numberOfFields++;
		numberOfFields++;
		sectionOffset += atoi(dimension.c_str());
	}
	}
}
}


@@ -259,7 +267,7 @@ bool PartOfPacket::loadFields(InputText& fp) throw(PacketException*)


        dimension = fp.getLine();
        dimension = fp.getLine();
        value = fp.getLine();
        value = fp.getLine();
        Field* f = new Field(name, "", dimension, value, numberOfFields);
        Field* f = new Field(name, "", dimension, value, numberOfFields, -1);
        fieldsDimension += f->size();
        fieldsDimension += f->size();
        fields[numberOfFields] = f;
        fields[numberOfFields] = f;
        numberOfFields++;
        numberOfFields++;
@@ -298,7 +306,7 @@ bool PartOfPacket::loadFields(MemoryBuffer* buffer) throw(PacketException*)
    {
    {
        dimension = buffer->getbuffer();
        dimension = buffer->getbuffer();
        value = buffer->getbuffer();
        value = buffer->getbuffer();
        Field* f = new Field(name, "", dimension, value, numberOfFields);
        Field* f = new Field(name, "", dimension, value, numberOfFields, -1);
        fieldsDimension += f->size();
        fieldsDimension += f->size();
        fields[numberOfFields] = f;
        fields[numberOfFields] = f;
        numberOfFields++;
        numberOfFields++;