From 7751cc69d585e1511b6d23fa5ad6794ddf12d957 Mon Sep 17 00:00:00 2001
From: Andrea Bulgarelli <bulgarelli@iasfbo.inaf.it>
Date: Sun, 9 Mar 2014 19:02:49 +0100
Subject: [PATCH] + size() instead of getDimension + sizeMax() + removed
 decodeTupe + Packet::verify() + Packet::set()

---
 ChangeLog                     |   9 +
 include/ByteStream.h          |   2 +-
 include/Field.h               |   2 +-
 include/InputPacketStream.h   |   2 +-
 include/Packet.h              | 123 ++++++------
 include/PacketDataField.h     |   4 +-
 include/PacketHeader.h        |   2 +-
 include/PacketStream.h        |   2 +-
 include/PartOfPacket.h        |   2 +-
 include/SDFBlock.h            |   4 +-
 include/SourceDataField.h     |   6 +-
 src/ByteStream.cpp            |  20 +-
 src/File.cpp                  |   2 +-
 src/InputFile.cpp             |   2 +-
 src/InputPacketStream.cpp     |  10 +-
 src/InputPacketStreamFile.cpp |  21 +-
 src/InputSerial.cpp           |   2 +-
 src/OutputSerial.cpp          |   2 +-
 src/Packet.cpp                | 365 ++++++++++++++++------------------
 src/PacketDataField.cpp       |  20 +-
 src/PacketStream.cpp          |  17 +-
 src/PartOfPacket.cpp          |  26 +--
 src/SDFBlock.cpp              |  34 ++--
 src/Socket.cpp                |   4 +-
 src/SourceDataField.cpp       |  14 +-
 25 files changed, 339 insertions(+), 358 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3357d96..56c7074 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2014-03-09 Andrea Bulgarelli <bulgarelli@iasfbo.inaf.it>
++ size() instead of getDimension
++ sizeMax()
++ removed decodeTupe
++ Packet::verify()
++ Packet::set()
+
+
+
 2014-03-09 Andrea Bulgarelli <bulgarelli@iasfbo.inaf.it>
 TAG v4.0.0
 + moved InputPacketStream::getPacket() to PacketStream
diff --git a/include/ByteStream.h b/include/ByteStream.h
index 64a7b7b..68745c9 100644
--- a/include/ByteStream.h
+++ b/include/ByteStream.h
@@ -100,7 +100,7 @@ public:
     long getValue(dword start, word dim);
 
     /// Gets the dimension of the stream
-    dword getDimension();
+    dword size();
 
     char* printStreamInHexadecimal();
 
diff --git a/include/Field.h b/include/Field.h
index b793ff0..f7394a6 100644
--- a/include/Field.h
+++ b/include/Field.h
@@ -59,7 +59,7 @@ public:
     word value;
 
     /// Dimension of field in bit.
-    inline dword getDimension()
+    inline dword size()
     {
         return type->dimension;
     };
diff --git a/include/InputPacketStream.h b/include/InputPacketStream.h
index bbdb711..334f688 100644
--- a/include/InputPacketStream.h
+++ b/include/InputPacketStream.h
@@ -44,7 +44,7 @@ public:
     /// \pre The setInput method must be invocated
     /// \param bDecode if true decode the method will decode the data fields.
     /// \return A pointer telemetry packet. Make attention: the object returned is one of the TM packet object of the array of this object. Don't delete it!
-    Packet* readPacket(int decodeType = 2) throw(PacketExceptionIO*);
+    Packet* readPacket() throw(PacketExceptionIO*);
 
 
 
diff --git a/include/Packet.h b/include/Packet.h
index 005128f..3b69d17 100644
--- a/include/Packet.h
+++ b/include/Packet.h
@@ -30,6 +30,15 @@
 #include "PacketExceptionIO.h"
 #include "PacketExceptionFileFormat.h"
 
+//Packet::size()
+//stream = prefix + packet
+//Packet::set(ByteStreamPtr stream)
+//Packet::set(ByteStreamPtr prefix, ByteStream packet)
+//Packet::set(ByteStreamPtr prefix, ByteStreamPtr header, ByteStreamPtr dataField)
+//check if the stream
+//bool Packet::verify()
+//char** Packet::printFields()
+//char* Packet::printStream();
 
 namespace PacketLib
 {
@@ -46,61 +55,29 @@ public:
     virtual ~Packet();
 
     virtual bool createPacketType(char* fileName, bool prefix, word dimprefix) throw (PacketException*);
-
-    /// This method verifies if the ByteStream on argument contains the correct value
-    /// in the identifiers. If this is true, the method return true and the stream
-    /// contains a packet of this type. This method overloads another method.
-	/// \post the bytestream is decoded
-    virtual bool setAndVerifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField);
-
-    /// This method verifies if the ByteStream on argument contains the correct value
-    /// in the identifiers. If this is true, the method returns true and the stream
-    /// contains a packet of this type. This method overloads another method.
-    /// \post the bytestream is decoded
-    virtual bool setAndVerifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packet);
-
-    /// Sets all the fields of the packet with correct value contained into the input ByteStream.
-    ///	\pre The structure of the stream must be loaded.
-    /// \param prefix This is the prefix of the packet
-    /// \param packetHeader This is the header of the packet
-    /// \param packetDataField This is the data field of the packet
-	/// \param decodeType (0) do not decode anything (1) decode only sections (prefix, header, data field header, source data field fixed part, source data field variable part) (2) decode blocks (all sections + all blocks of the ‘source data field variable part’)
-    /// \post the bytestream is decoded
-    virtual bool setPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField, int decodeType);
-
-    /// Sets all the fields of the packet with correct value contained into the input ByteStream.
-    ///	\pre The structure of the stream must be loaded.
-    /// \param prefix This is the prefix of the packet
-    /// \param packet This is the packet
-	/// \param decodeType (0) do not decode anything (1) decode only sections (prefix, header, data field header, source data field fixed part, source data field variable part) (2) decode blocks (all sections + all blocks of the ‘source data field variable part’)
-    /// \post the bytestream is decoded
-    virtual bool setPacketValue(ByteStreamPtr prefix, ByteStreamPtr packet, int decodeType);
-
-    /// Verifies if within the ByteStream passed with arguments it's present a correct packet.
-    ///	\pre The structure of the stream must be loaded.
-    /// \param prefix This is the prefix of the packet
-    /// \param packet This is the packet
-    /// \return True if the ByteStream contains a packet
-    virtual bool verifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packet);
-
-    /// Verifies if within the byte* stream passed with arguments it's present a correct packet. The stream* contains also the prefix (if present)
-    /// \param stream A pointer to the stream of byte, with prefix and packet
-    virtual bool verifyPacketValue(byte* stream);
-
-    /// Sets all the fields of the packet with correct value contained into the input ByteStream.
+	
+	/// Sets the ByteStream.
     /// \param stream A pointer to the stream of byte, with prefix and packet
-	/// \param decode only the sections
-	/// \param decodeType (0) do not decode anything (1) decode only sections (prefix, header, data field header, source data field fixed part, source data field variable part) (2) decode blocks (all sections + all blocks of the ‘source data field variable part’)
-    virtual bool setPacketValue(ByteStreamPtr stream, int decodeType);
-
-    /// Verifies if within the ByteStream passed with arguments it's present a correct packet.
-    ///	\pre The structure of the stream must be loaded.
-    /// \param prefix This is the prefix of the packet.
-    /// \param packetHeader This is the header of the packet.
-    /// \param packetDataField This is the data field of the packet.
-    /// \return True if the ByteStream contains a packet.
-    virtual bool verifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField);
+	/// \param checkPacketLenght if true check the packet lenght and set the packet stream, if false do not check the packet lenght
+    virtual bool set(ByteStreamPtr stream, bool checkPacketLenght = false);
+	
+	/// Sets the ByteStream.
+    /// \param prefix A pointer to the stream of byte, with the prefix
+	/// \param packet A pointer to the stream of byte, with the packet
+	/// \param checkPacketLenght if true check the packet lenght and set the packet stream, if false do not check the packet lenght
+    virtual bool set(ByteStreamPtr prefix, ByteStreamPtr packet, bool checkPacketLenght = false);
+	
+	/// Sets the ByteStream.
+    /// \param prefix A pointer to the stream of byte, with the prefix
+	/// \param packetHeader A pointer to the stream of byte, with the packet header
+	/// \param packetHeader A pointer to the stream of byte, with the packet data field
+	/// \param checkPacketLenght if true check the packet lenght and set the packet stream, if false do not check the packet lenght
+    virtual bool set(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField, bool checkPacketLenght = false);
 	
+	///return true is the packet contained into the stream is recognized using identifiers.
+	///\pre the ByteStream is set with one of set(ByteStream) methods
+	virtual bool verify();
+		
 	///Get the prefix as a ByteStream
 	ByteStreamPtr getBSPrefix();
 	
@@ -168,19 +145,19 @@ public:
     virtual  char* printPacketOutputStream();
 
     /// Gets the dimension in byte of the current packet (header + datafield (data field header + sdf + tail)
-    dword getDimension();
+    dword size();
 
 	/// Get dimension in bytes of the fixed part (without tail) = dim(header) + dim(data field header) + dim(source data field fixed)
-	inline dword getDimensionFixedPart() { return dimPacketStartingFixedPart; };
+	inline dword sizeFixedPart() { return dimPacketStartingFixedPart; };
     
 	/// Get dimension of the prefix
-	inline dword getDimensionPrefix() { return dimPrefix; };
+	inline dword sizePrefix() { return dimPrefix; };
 	
 	/// Get dimension of the tail
-    inline dword getDimensionTail() { return dimPacketTail; };
+    inline dword sizeTail() { return dimPacketTail; };
 	
     /// Gets the max dimension in byte of the packet.
-    dword getMaxDimension();
+    dword sizeMax();
 
     
     /// Gets the ByteStream received as input
@@ -228,6 +205,16 @@ public:
     ByteStreamPtr packet_output;
 	
 protected:
+	
+	/// Sets all the fields of the packet with correct value contained into the input ByteStream.
+    ///	\pre The structure of the stream must be loaded.
+    /// \param prefix This is the prefix of the packet
+    /// \param packetHeader This is the header of the packet
+    /// \param packetDataField This is the data field of the packet
+	/// \param decodeType (0) do not decode anything (1) decode only sections (prefix, header, data field header, source data field fixed part, source data field variable part) (2) decode blocks (all sections + all blocks of the ‘source data field variable part’)
+    /// \post the bytestream is decoded
+    virtual bool setPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField, int decodeType);
+
     
     /// This attribute represents the packet header.
     PacketHeader *header;
@@ -244,12 +231,12 @@ protected:
     /// The ByteStrem of the packet read
     ByteStreamPtr packet;
 	
+	/// The ByteStrem of the packet read
+    ByteStreamPtr stream;
 	
-	/// Set the internal prefix and packet.
-	virtual void setByteStreamPointers(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField);
 	
-	/// Set the internal prefix and packet.
-	virtual void setByteStreamPointers(ByteStreamPtr prefix, ByteStreamPtr packet);
+	void setByteStreamSections();
+
     
     /// Generates the stream for output.
     /// \pre the number of block and the number of element for each block
@@ -288,10 +275,6 @@ protected:
 
     bool setPacketValueTail(ByteStreamPtr packetDataField);
 
-    void memByteStream(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField);
-
-    void memByteStream(ByteStreamPtr prefix, ByteStreamPtr packet);
-
     bool bigendian;
 
     bool thereisprefix;
@@ -326,6 +309,14 @@ private:
 	
 	///dimPacketHeader + dimPacketDataFieldHeader + dimPacketSourceDataFieldFixed
 	dword dimPacketStartingFixedPart;
+	
+	bool decodedPacketHeader;
+	
+	bool decodedPacketDataFieldHeader;
+	
+	bool decodedPacketSourceDataField;
+	
+	bool decodedPacketTail;
 
 };
 
diff --git a/include/PacketDataField.h b/include/PacketDataField.h
index 02fdabd..e506706 100644
--- a/include/PacketDataField.h
+++ b/include/PacketDataField.h
@@ -38,10 +38,10 @@ public:
     ~PacketDataField();
 
     /// Total dimension in bytes of data field.
-    dword getDimension();
+    dword size();
 
     /// Total max dimension in bytes of data field.
-    dword getMaxDimension();
+    dword sizeMax();
 
     /// Creates the outputstream ByteStream for the generation of the output stream
     virtual bool setOutputStream(ByteStreamPtr os, word first);
diff --git a/include/PacketHeader.h b/include/PacketHeader.h
index 2e2177a..ba84c49 100644
--- a/include/PacketHeader.h
+++ b/include/PacketHeader.h
@@ -50,7 +50,7 @@ public:
 
     Field * getFieldWithPacketDimension();
 
-    inline word getDimensionOfPacketLength()
+    inline word sizeOfPacketLength()
     {
         return dimensionOfPacketLength;
     };
diff --git a/include/PacketStream.h b/include/PacketStream.h
index ede3294..c277540 100644
--- a/include/PacketStream.h
+++ b/include/PacketStream.h
@@ -41,7 +41,7 @@ public:
 	/// \pre the prefix has been removed
 	/// \param packet the stream that contains the source packet without the prefix
 	/// \param decodeType (0) do not decode anything (1) decode only sections (prefix, header, data field header, source data field fixed part, source data field variable part) (2) decode blocks (all sections + all blocks of the ‘source data field variable part’)
-    Packet* getPacket(ByteStreamPtr packet, int decodeType = 2) throw(PacketException*);
+    Packet* getPacket(ByteStreamPtr stream) throw(PacketException*);
 	
 	/// \return The index of packet type if it's recognized. 0 if packet isn't recognized.
     /// \param prefix A ByteStream that contains the prefix of packet (if present).
diff --git a/include/PartOfPacket.h b/include/PartOfPacket.h
index fcd7616..2d94a6b 100644
--- a/include/PartOfPacket.h
+++ b/include/PartOfPacket.h
@@ -65,7 +65,7 @@ public:
     virtual MemoryBuffer* loadFieldsInBuffer(InputText & fp);
 
     /// Returns the dimension (in byte) of this part of packet.
-    virtual  inline dword getDimension()
+    virtual  inline dword size()
     {
         return fieldsDimension / 8;
     };
diff --git a/include/SDFBlock.h b/include/SDFBlock.h
index cdffda8..a3af329 100644
--- a/include/SDFBlock.h
+++ b/include/SDFBlock.h
@@ -111,9 +111,9 @@ public:
     /// \param rBlockIndex the number of the rblock
     virtual SDFBlock* getBlock(word nblock, word rBlockIndex);
 
-    virtual dword getMaxDimension();
+    virtual dword sizeMax();
 
-    virtual dword getDimension();
+    virtual dword size();
 
     /// Set the number of blocks (the number of times that a block of a
     /// determinated type is repeated) for each type of rblock present.
diff --git a/include/SourceDataField.h b/include/SourceDataField.h
index 9e41cb1..c3ceaa8 100644
--- a/include/SourceDataField.h
+++ b/include/SourceDataField.h
@@ -68,11 +68,11 @@ public:
     /// Returns the number of fields.
     virtual word getNumberOfFields();
 
-    virtual dword getMaxDimension();
+    virtual dword sizeMax();
 
-    virtual dword getDimension();
+    virtual dword size();
 	
-	virtual dword getDimensionFixedPart();
+	virtual dword sizeFixedPart();
 
 	//onlySections = false
     virtual bool setByteStream(ByteStreamPtr s, int decodeType);
diff --git a/src/ByteStream.cpp b/src/ByteStream.cpp
index e624036..c8f656e 100644
--- a/src/ByteStream.cpp
+++ b/src/ByteStream.cpp
@@ -71,7 +71,7 @@ PacketLib::ByteStream::ByteStream(ByteStreamPtr b0, dword start, dword end, bool
 	mem_allocation_constructor = true;
 	
 	if(end == -1)
-		end = b0->getDimension();
+		end = b0->size();
 	
 	byteInTheStream = end-start;
     this->stream = b0->stream+start;
@@ -100,24 +100,24 @@ PacketLib::ByteStream::ByteStream(ByteStreamPtr b0, ByteStreamPtr b1, ByteStream
         mem_allocation_constructor = false;
         return;
     }
-    byteInTheStream = (b0!=0?b0->getDimension():0) + (b1!=0?b1->getDimension():0) + (b2!=0?b2->getDimension():0);
+    byteInTheStream = (b0!=0?b0->size():0) + (b1!=0?b1->size():0) + (b2!=0?b2->size():0);
     stream = (byte*) new byte[byteInTheStream];
     this->bigendian = (b0!=0?b0->isBigendian():(b1!=0?b1->isBigendian():(b2!=0?b2->isBigendian():false)));
 
 	if(b0 != 0)
 	{
-		memcpy(stream, b0->stream, b0->getDimension());
-		dim += b0->getDimension();
+		memcpy(stream, b0->stream, b0->size());
+		dim += b0->size();
 	}
 	if(b1 != 0)
 	{
-		memcpy(stream+dim, b1->stream, b1->getDimension());
-		dim += b1->getDimension();
+		memcpy(stream+dim, b1->stream, b1->size());
+		dim += b1->size();
 	}
 	if(b2 != 0)
 	{
-		memcpy(stream+dim, b2->stream, b2->getDimension());
-		dim += b2->getDimension();
+		memcpy(stream+dim, b2->stream, b2->size());
+		dim += b2->size();
 	}
     setMemoryAllocated(true);
     mem_allocation_constructor = false;
@@ -240,7 +240,7 @@ void PacketLib::ByteStream::endOutputStream()
 }
 
 
-dword PacketLib::ByteStream::getDimension()
+dword PacketLib::ByteStream::size()
 {
     return byteInTheStream;
 }
@@ -286,7 +286,7 @@ bool PacketLib::ByteStream::setStream(ByteStreamPtr b, dword first, dword last)
 {
     if(first > last)
         return false;
-    if(last > b->getDimension())
+    if(last > b->size())
         return false;
 
     deleteStreamMemory();
diff --git a/src/File.cpp b/src/File.cpp
index 3e896cd..ded8fcb 100644
--- a/src/File.cpp
+++ b/src/File.cpp
@@ -306,7 +306,7 @@ bool File::writeString(const char* str) throw(PacketExceptionIO*)
 bool File::writeByteStream(ByteStreamPtr b) throw(PacketExceptionIO*)
 {
     byte* stream = b->getOutputStream();
-    if(fwrite((void*)stream, b->getDimension(), 1, fp)<1)
+    if(fwrite((void*)stream, b->size(), 1, fp)<1)
         throw new PacketExceptionIO("Can't write stream in the file.");
     b->endOutputStream();
     return true;
diff --git a/src/InputFile.cpp b/src/InputFile.cpp
index ab49893..bb57767 100644
--- a/src/InputFile.cpp
+++ b/src/InputFile.cpp
@@ -58,7 +58,7 @@ ByteStreamPtr InputFile::readByteStream(dword n_byte) throw(PacketExceptionIO*)
         return 0;
     closed = file->isClosed();
     eof = file->isEOF();
-    if(bs->getDimension() == 0) return 0;
+    if(bs->size() == 0) return 0;
     return bs;
 }
 
diff --git a/src/InputPacketStream.cpp b/src/InputPacketStream.cpp
index f2dc519..c01c4e1 100644
--- a/src/InputPacketStream.cpp
+++ b/src/InputPacketStream.cpp
@@ -48,7 +48,7 @@ void InputPacketStream::setInput(Input* in)
 
 
 
-Packet* InputPacketStream::readPacket(int decodeType) throw(PacketExceptionIO*)
+Packet* InputPacketStream::readPacket() throw(PacketExceptionIO*)
 {
     unsigned dimHeader = getHeaderDimension();
     unsigned dimPrefix = getPrefixDimension();
@@ -74,9 +74,9 @@ Packet* InputPacketStream::readPacket(int decodeType) throw(PacketExceptionIO*)
             else
                 return 0;
         }
-        if(b1->getDimension() != dimHeader)
+        if(b1->size() != dimHeader)
         {
-            if(b1->getDimension() != 0)
+            if(b1->size() != 0)
                 pindex = 0;
             else
                 throw new PacketExceptionIO("it is impossible to read the full header.");
@@ -93,7 +93,7 @@ Packet* InputPacketStream::readPacket(int decodeType) throw(PacketExceptionIO*)
                 else
                     return 0;
             }
-            dim= b2->getDimension();
+            dim= b2->size();
             if(dim != pl)
             {
                 if(dim != 0)
@@ -108,7 +108,7 @@ Packet* InputPacketStream::readPacket(int decodeType) throw(PacketExceptionIO*)
 		Packet* p = packetType[pindex];
 
 
-		if(!p->setPacketValue(b0, b1, b2, decodeType)) //gli stream diventano del packet
+		if(!p->set(b0, b1, b2)) //gli stream diventano del packet
 			throw new PacketExceptionIO("it is impossible to resolve the packet.");
 
 		return p;
diff --git a/src/InputPacketStreamFile.cpp b/src/InputPacketStreamFile.cpp
index 996b754..54e4949 100644
--- a/src/InputPacketStreamFile.cpp
+++ b/src/InputPacketStreamFile.cpp
@@ -103,7 +103,7 @@ bool InputPacketStreamFile::freeRun() throw(PacketExceptionIO*)
     numberOfFileStreamPointer = 0;
     inputStream->setFirstPos();
     long count = 0;
-    unsigned dimHeader = headerReference->getDimension();
+    unsigned dimHeader = headerReference->size();
     while(!inputStream->isEOF())
     {
         int pindex = 0;
@@ -113,9 +113,9 @@ bool InputPacketStreamFile::freeRun() throw(PacketExceptionIO*)
             return true;
 
         b1 = inputStream->readHeader(dimHeader);
-        if(b1->getDimension() != dimHeader)
+        if(b1->size() != dimHeader)
         {
-            if(b1->getDimension() != 0)
+            if(b1->size() != 0)
                 pindex = 0;
             else
             {
@@ -128,7 +128,7 @@ bool InputPacketStreamFile::freeRun() throw(PacketExceptionIO*)
             headerReference->setByteStream(b1);
             pl = headerReference->getPacketLength();
             b2 = inputStream->readDataField(pl);
-            dim= b2->getDimension();
+            dim= b2->size();
             if(dim != pl)
             {
                 if(dim != 0)
@@ -190,7 +190,7 @@ Packet* InputPacketStreamFile::getPacketFromFileStreamPointer(int index, bool ne
     type = it->typeOfPacket;
     pos = it->pointerStart;
     inputStream->setpos(pos);
-    int dimHeader = headerReference->getDimension();
+    int dimHeader = headerReference->size();
     b0 = inputStream->readPrefix();
     if((b1 = inputStream->readHeader(dimHeader)) == NULL)
         return NULL;
@@ -211,7 +211,7 @@ Packet* InputPacketStreamFile::getPacketFromFileStreamPointer(int index, bool ne
         pnew->createPacketType((char*)sf.c_str(), prefix, dimPrefix);
         p = pnew;
     }
-    if(p->setPacketValue(b0, b1, b2, 2))
+    if(p->set(b0, b1, b2))
         return p;
     else
         return NULL;
@@ -267,7 +267,7 @@ Packet* InputPacketStreamFile::getPacketFromStream() throw (PacketExceptionIO *
 {
     ByteStreamPtr b0, b1, b2;
     word pl, dim;
-    unsigned dimHeader = headerReference->getDimension();
+    unsigned dimHeader = headerReference->size();
 
     if(inputStream->isEOF())
         return 0;
@@ -275,13 +275,13 @@ Packet* InputPacketStreamFile::getPacketFromStream() throw (PacketExceptionIO *
     if(inputStream->isEOF())
         return 0;
     b1 = inputStream->readHeader(dimHeader);
-    if(b1->getDimension() != dimHeader)
+    if(b1->size() != dimHeader)
         return 0;
 
     headerReference->setByteStream(b1);
     pl = headerReference->getPacketLength();
     b2 = inputStream->readDataField(pl);
-    dim = b2->getDimension();
+    dim = b2->size();
     if(dim != pl)
         return 0;
 
@@ -289,7 +289,8 @@ Packet* InputPacketStreamFile::getPacketFromStream() throw (PacketExceptionIO *
     for (int i = 1; i<numberOfPacketType; i++)
     {
         p = getPacketType(i);
-        if(p->setAndVerifyPacketValue(b0, b1, b2))
+		p->set(b0, b1, b2);
+        if(p->verify())
         {
             return p;
         }
diff --git a/src/InputSerial.cpp b/src/InputSerial.cpp
index 90f5d75..5650d72 100644
--- a/src/InputSerial.cpp
+++ b/src/InputSerial.cpp
@@ -84,7 +84,7 @@ ByteStreamPtr InputSerial::readByteStream(int n_byte) throw(PacketExceptionIO*)
     //for(int i=0; i<n_byte; i++)
     //printf("%d: %x\n", i, buff[i]);
 
-    if(bs->getDimension() == 0)
+    if(bs->size() == 0)
         return 0;
     return bs;
 }
diff --git a/src/OutputSerial.cpp b/src/OutputSerial.cpp
index 2403936..c594ff2 100644
--- a/src/OutputSerial.cpp
+++ b/src/OutputSerial.cpp
@@ -56,7 +56,7 @@ bool OutputSerial::open(char** parameters) throw(PacketExceptionIO*)
 bool OutputSerial::writeByteStream(ByteStreamPtr b) throw(PacketExceptionIO*)
 {
     byte* buff = b->getStream();
-    unsigned n_byte = b->getDimension();
+    unsigned n_byte = b->size();
 
     if(!isclosed)
         if( serial->write( buff, n_byte ) > 0 )
diff --git a/src/Packet.cpp b/src/Packet.cpp
index 01d7b52..5dc98bc 100644
--- a/src/Packet.cpp
+++ b/src/Packet.cpp
@@ -21,6 +21,7 @@
 
 using namespace PacketLib;
 
+#define DECODETYPE 2
 
 Packet::Packet(bool bigendian)
 {
@@ -87,7 +88,7 @@ bool Packet::createPacketType(char* fileName, bool isprefix, word dimprefix) thr
                 if(header->loadHeader(line))
                 {
                     /// delete[] line;
-					dimPacketHeader = header->getDimension();
+					dimPacketHeader = header->size();
                     /// find the DataFieldHeader section
                     line=file.getLine("[DataFieldHeader]");
                     if(strlen(line) != 0)
@@ -96,7 +97,7 @@ bool Packet::createPacketType(char* fileName, bool isprefix, word dimprefix) thr
                         /// section found
                         if(dataField->getPacketDataFieldHeader()->loadFields(file))
                         {
-							dimPacketDataFieldHeader = dataField->getPacketDataFieldHeader()->getDimension();
+							dimPacketDataFieldHeader = dataField->getPacketDataFieldHeader()->size();
                             //cout << (dataField->dataFieldHeader->printStructure())->c_str();
                             line=file.getLastLineRead();
                             char *typeOfPacket = 0;
@@ -116,7 +117,7 @@ bool Packet::createPacketType(char* fileName, bool isprefix, word dimprefix) thr
                                 if(dataField->getPacketSourceDataField()->loadFields(file))
                                 {
                                     //cout << (dataField->sourceDataField->printStructure())->c_str();
-									dimPacketSourceDataFieldFixed = dataField->getPacketSourceDataField()->getDimensionFixedPart();
+									dimPacketSourceDataFieldFixed = dataField->getPacketSourceDataField()->sizeFixedPart();
 									dimPacketStartingFixedPart = dimPacketHeader + dimPacketDataFieldHeader + dimPacketSourceDataFieldFixed;
 									
                                     line=file.getLastLineRead();
@@ -135,13 +136,21 @@ bool Packet::createPacketType(char* fileName, bool isprefix, word dimprefix) thr
                                                     throw new PacketExceptionFileFormat("Error in [Tail] section");
                                                 } else
 												{
-													dimPacketTail = dataField->getPacketTail()->getDimension();
+													dimPacketTail = dataField->getPacketTail()->size();
+													line = file.getLastLineRead();
+													if(strcmp(line, "[Algorithms]") == 0) {
+														//select CRC algorithm
+														char *crcAlg = file.getLine();
+														//select compression algorithm
+														char *compressionAlgo = file.getLine();
+														//TODO
+													}
 												}
                                             }
                                             //TODO: chiudere il file anche negli altri casi
                                             file.close();
                                             /// Memory allocation for the output stream
-                                            dword dimpo = getMaxDimension();
+                                            dword dimpo = sizeMax();
                                             dword dimpr = (isprefix?dimprefix:0);
                                             packet_output = ByteStreamPtr(new ByteStream(dimpo + dimpr, bigendian));
 
@@ -268,27 +277,16 @@ void Packet::printIdentifiers()
     }
 }
 
-void Packet::setByteStreamPointers(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField)
-{
-    memByteStream(prefix, packetHeader, packetDataField);
-    ByteStreamPtr packet = ByteStreamPtr(new ByteStream(packetHeader, packetDataField, 0));
-    memByteStream(prefix, packet);
-}
 
-void Packet::setByteStreamPointers(ByteStreamPtr prefix, ByteStreamPtr packet)
-{
-    memByteStream(prefix, packet);
-}
+
 
 bool Packet::setPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField, int decodeType)
 {
 
-	setByteStreamPointers(prefix, packetHeader, packetDataField);
-
 	if(decodeType == 0)
 		return true;
 	
-    //cout << "@ " << packetDataField->getDimension() << endl;
+    //cout << "@ " << packetDataField->size() << endl;
     /// 1)
     if(!setPacketValueVerify(prefix, packetHeader, packetDataField))
     {
@@ -331,43 +329,22 @@ bool Packet::setPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, By
 
 
 
-bool Packet::setPacketValue(ByteStreamPtr prefix, ByteStreamPtr packet, int decodeType)
-{
-    dword dimHeader = header->getDimension();
-    memByteStream(prefix, packet);
-    tempHeader->setStream(packet, 0, dimHeader-1);
-    tempDataField->setStream(packet, dimHeader, packet->getDimension());
-    return setPacketValue(prefix, tempHeader, tempDataField, decodeType);
-}
-
-
-
-bool Packet::verifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packet)
-{
-    dword dimHeader = header->getDimension();
-    memByteStream(prefix, packet);
-    tempHeader->setStream(packet, 0, dimHeader-1);
-    tempDataField->setStream(packet, dimHeader, packet->getDimension());
-    return verifyPacketValue(prefix, tempHeader, tempDataField);
-}
-
-
-
-bool Packet::verifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField)
+bool Packet::verify()
 {
     bool verified = true;
-    memByteStream(prefix, packetHeader, packetDataField);
+	
+	ByteStreamPtr packetHeader = header->getByteStream();
+	ByteStreamPtr packetDataField = dataField->getByteStream();
+    
     if(type_of_identifier[2] == true)
     {
-        if(!setPacketValue(prefix, packetHeader, packetDataField, 2))
+        if(!setPacketValue(prefix, packetHeader, packetDataField, DECODETYPE))
         {
             return false;
         }
     }
     else
     {
-        if(!setPacketValueVerify(prefix, packetHeader, packetDataField))
-            return false;
         if(type_of_identifier[1] == true)
         {
             if(!setPacketValueDataFieldHeader(packetDataField))
@@ -376,30 +353,30 @@ bool Packet::verifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader,
         if(type_of_identifier[0] == true)
             if(!setPacketValueHeader(packetHeader))
                 return false;
-
+		
         if(!setPacketValuePrefix(prefix))
             return false;
-
-
+		
+		
     }
     ///  Iterate through list and verify each element.
-
+	
     for(unsigned i = 0; i< number_of_identifier; i++)
     {
         PacketIdentifier* pi = identifiers[i];
         Field* f = NULL;
         switch(pi->type)
         {
-        case 0:
-            f = header->getFields(pi->fieldNumber);
-            break;
-        case 1:
-            f = dataField->getPacketDataFieldHeader()->getFields(pi->fieldNumber);
-            break;
-        case 2:
-
-            f = dataField->getPacketSourceDataField()->getFields(pi->fieldNumber);
-            break;
+			case 0:
+				f = header->getFields(pi->fieldNumber);
+				break;
+			case 1:
+				f = dataField->getPacketDataFieldHeader()->getFields(pi->fieldNumber);
+				break;
+			case 2:
+				
+				f = dataField->getPacketSourceDataField()->getFields(pi->fieldNumber);
+				break;
         }
         if(f == NULL || f->value != pi->value)
         {
@@ -407,72 +384,7 @@ bool Packet::verifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader,
             break;
         }
     }
-    if(verified==false)
-        return false;
-    else
-        return true;
-}
-
-
-bool Packet::setAndVerifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packet)
-{
-    dword dimHeader = header->getDimension();
-    memByteStream(prefix, packet);
-    tempHeader->setStream(packet, 0, dimHeader-1);
-    tempDataField->setStream(packet, dimHeader, packet->getDimension());
-    return setAndVerifyPacketValue(prefix, tempHeader, tempDataField);
-}
-
-
-bool Packet::setAndVerifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField)
-{
-    memByteStream(prefix, packetHeader, packetDataField);
-    ByteStreamPtr packet = ByteStreamPtr(new ByteStream(packetHeader, packetDataField, 0));
-    memByteStream(prefix, packet);
-    if(verifyPacketValue(prefix, packetHeader, packetDataField)==false)
-    {
-        PRINTERROR("Error in verify packet value");
-        return false;
-    }
-    // se arrivo qui, allora devo settare il resto
-    if(type_of_identifier[2] == false)
-    {
-
-        if(type_of_identifier[0] == false)
-        {
-            if(!setPacketValueHeader(packetHeader))
-            {
-                PRINTERROR("Error in set packet value header");
-                return false;
-            }
-        }
-
-
-
-        if(type_of_identifier[1] == false)
-        {
-            if(!setPacketValueDataFieldHeader(packetDataField))
-            {
-                PRINTERROR("Error in set packet value data field header");
-                return false;
-            }
-        }
-
-        if(!setPacketValueSourceDataField(packetDataField, 2))
-        {
-            PRINTERROR("Error in set packet value source data field");
-            return false;
-        }
-
-        if(!setPacketValueTail(packetDataField))
-        {
-            PRINTERROR("Error in set packet value tail");
-            return false;
-        }
-
-    }
-    return true;
-
+	return verified;
 }
 
 
@@ -491,7 +403,7 @@ void Packet::printPacketValue()
     pr = (char**) dataField->getPacketSourceDataField()->printValue();
     for(int i = 0; pr[i] != 0; i++)
         cout << pr[i] << endl;
-    if(dataField->getPacketTail()->getDimension() != 0)
+    if(dataField->getPacketTail()->size() != 0)
     {
         pr = (char**) dataField->getPacketTail()->printValue();
         for(int i = 0; pr[i] != 0; i++)
@@ -502,23 +414,27 @@ void Packet::printPacketValue()
 
 
 
-dword Packet::getDimension()
+dword Packet::size()
 {
-    return header->getDimension() + dataField->getDimension();
+	if(!decodedPacketHeader) {
+		setPacketValueHeader(getBSHeader());
+		decodedPacketHeader = true;
+	}
+	return dimPacketHeader + header->getPacketLength();
 }
 
 
-dword Packet::getMaxDimension()
+dword Packet::sizeMax()
 {
-    dword dimh = header->getDimension();
-    dword dimdf = dataField->getMaxDimension();
+    dword dimh = dimPacketHeader;
+    dword dimdf = dataField->sizeMax();
     return dimh + dimdf;
 }
 
 
 void Packet::generateStream()
 {
-    word dimHeader = header->getDimension();
+    word dimHeader = header->size();
 
     if(first_output_stream_setted == false)
     {
@@ -535,9 +451,9 @@ void Packet::generateStream()
     }
 
     /// PACKET DIMENSIONE MANAGEMENT
-    header->setPacketLength(dataField->getDimension());
+    header->setPacketLength(dataField->size());
     //Field* f = header->getFieldWithPacketDimension();
-    //f->value = dataField->getDimension() - 1;
+    //f->value = dataField->size() - 1;
 
     header->generateStream(bigendian);
     dataField->generateStream(bigendian);
@@ -552,7 +468,7 @@ bool Packet::setPacketValueVerify(ByteStreamPtr prefix, ByteStreamPtr packetHead
     if(packetHeader == NULL || packetDataField == NULL)
         return false;
     /// Second check: dimension control
-    if(header->getDimension() != packetHeader->getDimension())
+    if(header->size() != packetHeader->size())
         return false;
     return true;
 }
@@ -605,10 +521,10 @@ bool Packet::setPacketValueSourceDataField(ByteStreamPtr packetDataField, int de
     }*/
 
 
-    packetLength = dataField->getPacketDataFieldHeader()->getDimension();
+    packetLength = dataField->getPacketDataFieldHeader()->size();
     dword pl1 = header->getPacketLength();
-    dword pl3 = dataField->getPacketDataFieldHeader()->getDimension();
-    dword pl4 = dataField->getPacketTail()->getDimension();
+    dword pl3 = dataField->getPacketDataFieldHeader()->size();
+    dword pl4 = dataField->getPacketTail()->size();
     packetLength2 = pl1 - pl3 -pl4;
     b = tempPacketDataField->setStream(packetDataField, packetLength, packetLength+packetLength2-1);
     if(b)
@@ -628,18 +544,18 @@ bool Packet::setPacketValueTail(ByteStreamPtr packetDataField)
 {
     bool b;
     dword s, e;
-    if(dataField->getPacketTail()->getDimension() == 0)
+    if(dataField->getPacketTail()->size() == 0)
         return true;
     /* NON CANCELLLARE: questo codice sotto funziona bene. Si utilizza
     l'altro solo perche' si suppone che il tail sia sempre posizionato alla fine
     del packet
-    word s1 = dataField->dataFieldHeader->getDimension();
-    word s2 = dataField->sourceDataField->getDimension();
+    word s1 = dataField->dataFieldHeader->size();
+    word s2 = dataField->sourceDataField->size();
     s = s1 + s2;
-    e = s  + dataField->tail->getDimension() - 1;
+    e = s  + dataField->tail->size() - 1;
     */
-    s = packetDataField->getDimension() - dataField->getPacketTail()->getDimension();
-    e = packetDataField->getDimension() - 1;
+    s = packetDataField->size() - dataField->getPacketTail()->size();
+    e = packetDataField->size() - 1;
     b = tempTail->setStream(packetDataField, s, e);
     if(b)
         return dataField->getPacketTail()->setByteStream(tempTail);
@@ -660,35 +576,20 @@ bool Packet::setPacketValueHeader(ByteStreamPtr packetHeader)
         return true;
 }
 
-void Packet::memByteStream(ByteStreamPtr prefix, ByteStreamPtr packet)
-{
-    this->prefix = prefix;
-    this->packet = packet;
-}
 
 
 
-void Packet::memByteStream(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField)
-{
-    this->prefix = prefix;
-    //this->packet = 0;
-    this->header->memByteStream(packetHeader);
-    this->dataField->memByteStream(packetDataField);
-}
-
-
 
 ByteStreamPtr Packet::getOutputStream()
 {
+	//TODO: check
     generateStream();
-    ByteStreamPtr b = ByteStreamPtr(new ByteStream(packet_output->stream, getDimension() + (thereisprefix?dimPrefix:0), bigendian));
+    ByteStreamPtr b = ByteStreamPtr(new ByteStream(packet_output->stream, size() + (thereisprefix?dimPrefix:0), bigendian));
     return b;
 }
 
 ByteStreamPtr Packet::getInputStream()
 {
-    if(packet == 0)
-        packet = ByteStreamPtr(new ByteStream(header->getByteStream(), dataField->getByteStream(), 0));
     return packet;
 }
 
@@ -751,7 +652,7 @@ char* Packet::printSourceDataFieldStream()
 
 char** Packet::printTailValue()
 {
-    if(dataField->getPacketTail()->getDimension() != 0)
+    if(dataField->getPacketTail()->size() != 0)
         return (char**)dataField->getPacketTail()->printValue();
     else
         return 0;
@@ -759,7 +660,7 @@ char** Packet::printTailValue()
 
 char* Packet::printTailStream()
 {
-    if(dataField->getPacketTail()->getDimension() != 0)
+    if(dataField->getPacketTail()->size() != 0)
         return dataField->getPacketTail()->getByteStream()->printStreamInHexadecimal();
 
     else
@@ -768,7 +669,7 @@ char* Packet::printTailStream()
 
 char* Packet::printPacketOutputStream()
 {
-    dword dim = getDimension();
+    dword dim = size();
     if(thereisprefix)
         dim += dimPrefix;
     ByteStream b(packet_output->stream, dim, bigendian); //FIXME
@@ -776,48 +677,108 @@ char* Packet::printPacketOutputStream()
     return c;
 }
 
-bool Packet::verifyPacketValue(byte* stream) {
 
 
-	dword dimPre = 0;
-	if(thereisprefix)
-	        dimPre += dimPrefix;
-	ByteStreamPtr prefix = ByteStreamPtr(new ByteStream(stream, dimPre, bigendian));
+bool Packet::set(ByteStreamPtr stream, bool checkPacketLength) {
 
-	dword dim = 0;
-	dword dimHeader = header->getDimension();
-	dim += dimHeader;
-	tempHeader->setStream(stream+dimPre, dimHeader, bigendian);
-	header->setByteStream(tempHeader);
-	dim += header->getDimensionOfPacketLength() + 1;
-	ByteStreamPtr packet = ByteStreamPtr(new ByteStream(stream+dimPre, dim, bigendian));
+	//save a pointer to the current stream to avoid shareptr deallocation
+	this->stream = stream;
+	decodedPacketHeader = false;
+	decodedPacketDataFieldHeader = false;
+	decodedPacketSourceDataField = false;
+	decodedPacketTail = false;
+	
+	if(!checkPacketLength)
+	{
+		
+		if(thereisprefix) {
+			prefix = ByteStreamPtr(new ByteStream(stream->stream, dimPrefix, bigendian));
+			packet = ByteStreamPtr(new ByteStream(stream->stream + dimPrefix, stream->size() - dimPrefix, bigendian));
+			//return true;
+		}
+		else
+		{
+			prefix = 0;
+			packet = stream;
+			//return true;
+		}
+	}
+	else
+	{
+		if(thereisprefix)
+			prefix = ByteStreamPtr(new ByteStream(stream->stream, dimPrefix, bigendian));
+		else
+			prefix = 0;
+		
+		tempHeader->setStream(stream->stream + dimPrefix, dimPacketHeader, bigendian);
+		header->setByteStream(tempHeader);
+		dword dim = dimPacketHeader + header->getPacketLength();
+		if(dimPrefix + dim > stream->size()) {
+			this->packet = 0;
+			throw new PacketException("Packet::set - the ByteStream is too small for the packet lenght of this packet");
+		}
+		
+		packet = ByteStreamPtr(new ByteStream(stream->stream + dimPrefix, dim, bigendian));
+	}
+	//TODO OPTIMIZATION: set the followin method only when is needed
+	setByteStreamSections(); //10 per cent of time loss but safer
+	return true;
 
-	return verifyPacketValue(prefix, packet);
 }
 
-bool Packet::setPacketValue(ByteStreamPtr stream, int decodeType) {
+bool Packet::set(ByteStreamPtr prefix, ByteStreamPtr packet, bool checkPacketLength) {
 	
-	if(decodeType == 0 && !thereisprefix) {
-		setByteStreamPointers(0, stream);
-		return true;
-	}
+	this->stream = 0;
+	decodedPacketHeader = false;
+	decodedPacketDataFieldHeader = false;
+	decodedPacketSourceDataField = false;
+	decodedPacketTail = false;
 	
-	if(thereisprefix)
-		prefix = ByteStreamPtr(new ByteStream(stream->stream, dimPrefix, bigendian));
+	if(!checkPacketLength)
+	{
+		this->prefix = prefix;
+		this->packet = packet;
+	}
 	else
-		prefix = 0;
+	{
+		this->prefix = prefix;
+		tempHeader->setStream(packet->stream + dimPrefix, dimPacketHeader, bigendian);
+		header->setByteStream(tempHeader);
+		dword dim = dimPacketHeader + header->getPacketLength();
+		if(dimPrefix + dim > packet->size()) {
+			this->packet = 0;
+			throw new PacketException("Packet::set - the ByteStream is too small for the packet lenght of this packet");
+		}
+		this->packet = packet;
+	}
+	//TODO OPTIMIZATION: set the following method only when is needed
+	setByteStreamSections(); //10 per cent of time loss but safer
+	return true;
 	
-	tempHeader->setStream(stream->stream + dimPrefix, dimPacketHeader, bigendian);
-	header->setByteStream(tempHeader);
-	dword dim = dimPacketHeader + header->getPacketLength() + 1;
-	packet = ByteStreamPtr(new ByteStream(stream->stream + dimPrefix, dim, bigendian));
+}
+
+
 
-	//return true;
+bool Packet::set(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField, bool checkPacketLenght) {
+	//merge packetHeader and packetDataField
+	ByteStreamPtr tmpPacket = ByteStreamPtr(new ByteStream(packetHeader, packetDataField, 0));
+	return set(prefix, tmpPacket, checkPacketLenght);
 	
-	return setPacketValue(prefix, packet, decodeType);
+}
+
+
+void Packet::setByteStreamSections()
+{
 
+	//ByteStreamPtr tempHeader = ByteStreamPtr(new ByteStream(packet, 0, dimPacketHeader-1));
+	//ByteStreamPtr tempDataField = ByteStreamPtr(new ByteStream(packet, dimPacketHeader, packet->size()));
+	tempHeader->setStream(packet, 0, dimPacketHeader-1);
+    tempDataField->setStream(packet, dimPacketHeader, packet->size());
+    this->header->memByteStream(tempHeader);
+    this->dataField->memByteStream(tempDataField);
 }
 
+
 ByteStreamPtr Packet::getBSPrefix() {
 	return prefix;
 }
@@ -842,35 +803,51 @@ ByteStreamPtr Packet::getBSSourceDataFieldsFixedPart() {
 }
 
 ByteStreamPtr Packet::getBSSourceDataFieldsVariablePart() {
-	dword dimvariablepart = packet->getDimension() - dimPrefix - dimPacketStartingFixedPart - dimPacketTail;
+	dword dimvariablepart = packet->size() - dimPrefix - dimPacketStartingFixedPart - dimPacketTail;
 	ByteStreamPtr sdff = ByteStreamPtr(new ByteStream(packet->stream + dimPrefix + dimPacketStartingFixedPart, dimvariablepart, bigendian));
 	return sdff;
 }
 
 ByteStreamPtr Packet::getBSTail() {
-	dword dimvariablepart = packet->getDimension() - dimPrefix - dimPacketStartingFixedPart - dimPacketTail;
-	ByteStreamPtr tail = ByteStreamPtr(new ByteStream(packet->stream + packet->getDimension() - dimPacketTail, dimPacketTail, bigendian));
+	//dword dimvariablepart = packet->size() - dimPrefix - dimPacketStartingFixedPart - dimPacketTail;
+	ByteStreamPtr tail = ByteStreamPtr(new ByteStream(packet->stream + packet->size() - dimPacketTail, dimPacketTail, bigendian));
 	return tail;
 }
 
 
 PacketHeader* Packet::getPacketHeader() {
+	if(!decodedPacketHeader) {
+		setPacketValueHeader(getBSHeader());
+		decodedPacketHeader = true;
+	}
 	return header;
 }
 
 
 DataFieldHeader* Packet::getPacketDataFieldHeader() {
+	if(!decodedPacketDataFieldHeader) {
+		setPacketValueDataFieldHeader(dataField->getByteStream());
+		decodedPacketDataFieldHeader = true;
+	}
 	return dataField->getPacketDataFieldHeader();
 }
 
 
 
 SourceDataField* Packet::getPacketSourceDataField() {
+	if(!decodedPacketSourceDataField) {
+		setPacketValueSourceDataField(dataField->getByteStream(), DECODETYPE);
+		decodedPacketSourceDataField = true;
+	}
 	return dataField->getPacketSourceDataField();
 }
 
 
 PartOfPacket* Packet::getPacketTail() {
+	if(!decodedPacketTail) {
+		setPacketValueTail(getBSTail());
+		decodedPacketTail = true;
+	}
 	return dataField->getPacketTail();
 }
 
diff --git a/src/PacketDataField.cpp b/src/PacketDataField.cpp
index 5301224..e70e84d 100644
--- a/src/PacketDataField.cpp
+++ b/src/PacketDataField.cpp
@@ -37,22 +37,22 @@ PacketDataField::~PacketDataField()
 
 
 
-dword PacketDataField::getDimension()
+dword PacketDataField::size()
 {
     if(sourceDataField != 0)
-        return dataFieldHeader->getDimension() + sourceDataField->getDimension() + tail->getDimension();
+        return dataFieldHeader->size() + sourceDataField->size() + tail->size();
     else
-        return dataFieldHeader->getDimension() + tail->getDimension();
+        return dataFieldHeader->size() + tail->size();
 }
 
 
 
-dword PacketDataField::getMaxDimension()
+dword PacketDataField::sizeMax()
 {
     if(sourceDataField != 0)
-        return dataFieldHeader->getDimension() + sourceDataField->getMaxDimension() + tail->getDimension();
+        return dataFieldHeader->size() + sourceDataField->sizeMax() + tail->size();
     else
-        return dataFieldHeader->getDimension() + tail->getDimension();
+        return dataFieldHeader->size() + tail->size();
 }
 
 
@@ -63,14 +63,14 @@ dword PacketDataField::getMaxDimension()
 
 bool PacketDataField::setOutputStream(ByteStreamPtr os, word first)
 {
-    outputstream = ByteStreamPtr(new ByteStream((os->stream + first), getDimension(), os->isBigendian()));
+    outputstream = ByteStreamPtr(new ByteStream((os->stream + first), size(), os->isBigendian()));
     dataFieldHeader->setOutputStream(os, first);
-    word sdfstart = first + dataFieldHeader->getDimension();
+    word sdfstart = first + dataFieldHeader->size();
     sourceDataField->setOutputStream(os, sdfstart);
     word tailstart = sdfstart;
     if(sourceDataField != 0)
-        tailstart += sourceDataField->getDimension();
-    if(tail->getDimension() != 0)
+        tailstart += sourceDataField->size();
+    if(tail->size() != 0)
         tail->setOutputStream(os, tailstart);
     return true;
 }
diff --git a/src/PacketStream.cpp b/src/PacketStream.cpp
index 800698b..a07a8d5 100644
--- a/src/PacketStream.cpp
+++ b/src/PacketStream.cpp
@@ -74,7 +74,7 @@ dword PacketStream::getPacketDimension(ByteStreamPtr stream) {
 	//ByteStreamPtr prefix = new ByteStream(stream, dimPre, bigendian);
 	
 	dword dim = 0;
-	dword dimHeader = headerReference->getDimension();
+	dword dimHeader = headerReference->size();
 	dim += dimHeader;
 	ByteStreamPtr tempHeader = ByteStreamPtr(new ByteStream());
 	tempHeader->setStream(stream->stream+dimPre, dimHeader, bigendian);
@@ -91,7 +91,8 @@ int PacketStream::detPacketType(ByteStreamPtr prefix, ByteStreamPtr packetHeader
     for (int i = 1; i<numberOfPacketType; i++)
     {
         Packet* p = getPacketType(i);
-        if(p->verifyPacketValue(prefix, packetHeader, packetDataField))
+		p->set(prefix, packetHeader, packetDataField);
+        if(p->verify())
             return i;
     }
     return 0;
@@ -104,7 +105,8 @@ int PacketStream::detPacketType(ByteStreamPtr prefix, ByteStreamPtr packet)
     for (dword i = 1; i<numberOfPacketType; i++)
     {
         Packet* p = getPacketType(i);
-        if(p->verifyPacketValue(prefix, packet))
+		p->set(prefix, packet);
+        if(p->verify())
             return i;
     }
     return 0;
@@ -118,7 +120,8 @@ int PacketStream::detPacketType(ByteStreamPtr packet)
     for (dword i = 1; i<numberOfPacketType; i++)
     {
         Packet* p = getPacketType(i);
-        if(p->verifyPacketValue(packet->stream))
+		p->set(packet);
+        if(p->verify())
             return i;
     }
     return 0;
@@ -126,13 +129,13 @@ int PacketStream::detPacketType(ByteStreamPtr packet)
 
 
 
-Packet* PacketStream::getPacket(ByteStreamPtr stream, int decodeType) throw(PacketException*){
+Packet* PacketStream::getPacket(ByteStreamPtr stream) throw(PacketException*){
 	
 	int index = detPacketType(stream);
 	if(index > 0) {
 		Packet* p = getPacketType(index);
 		
-		if(!p->setPacketValue(stream, decodeType)) //gli stream diventano del packet
+		if(!p->set(stream)) //gli stream diventano del packet
 			throw new PacketExceptionIO("it is impossible to resolve the packet.");
 		
 		return p;
@@ -217,7 +220,7 @@ bool PacketStream::createStreamStructure() throw(PacketException*)
                     throw new PacketExceptionFileFormat("No parameters in file header format");
                     return false;
                 }
-				dimHeader = headerReference->getDimension();
+				dimHeader = headerReference->size();
                 /// It creates the PACKET NOT RECOGNIZED
                 PacketNotRecognized* p = new PacketNotRecognized(bigendian);
                 if(!p->createPacketType(line, prefix, dimPrefix))
diff --git a/src/PartOfPacket.cpp b/src/PartOfPacket.cpp
index 1949fb4..2677ca6 100644
--- a/src/PartOfPacket.cpp
+++ b/src/PartOfPacket.cpp
@@ -115,7 +115,7 @@ bool PartOfPacket::loadFields(InputText& fp) throw(PacketException*)
         dimension = fp.getLine();
         value = fp.getLine();
         Field* f = new Field(name, dimension, value, numberOfFields);
-        fieldsDimension += f->getDimension();
+        fieldsDimension += f->size();
         fields[numberOfFields] = f;
         numberOfFields++;
         name = fp.getLine();
@@ -154,7 +154,7 @@ bool PartOfPacket::loadFields(MemoryBuffer* buffer) throw(PacketException*)
         dimension = buffer->getbuffer();
         value = buffer->getbuffer();
         Field* f = new Field(name, dimension, value, numberOfFields);
-        fieldsDimension += f->getDimension();
+        fieldsDimension += f->size();
         fields[numberOfFields] = f;
         numberOfFields++;
         name = buffer->getbuffer();
@@ -209,12 +209,12 @@ bool PartOfPacket::setByteStream(ByteStreamPtr s)
     /// If NULL is passed it exits
     if(s == NULL) return true;
 
-    if(getDimension() > s->getDimension())
+    if(size() > s->size())
         return false;
 
 
     if(!s->getMemAllocation())
-        stream->setStream(s->stream, s->getDimension(), s->isBigendian());
+        stream->setStream(s->stream, s->size(), s->isBigendian());
 
     /// The stream is assigned
     this->stream = s;
@@ -227,7 +227,7 @@ bool PartOfPacket::decode() {
 	if(decoded)
 		return true;
 	Field* ftemp;
-    //this->stream->setStream(s, 0, s->getDimension() - 1);
+    //this->stream->setStream(s, 0, s->size() - 1);
     /// The pointer is converted from byte to void. The reading from file allows the correct data interpretation
     /// for big or little endian machines
     byte* stream = (byte*) this->stream->stream;
@@ -248,7 +248,7 @@ bool PartOfPacket::decode() {
     for(word i=0; i<nof; i++)
     {
         ftemp =  fields[i];
-        dimbit = ftemp->getDimension();
+        dimbit = ftemp->size();
         /// Temporary word to be modified for the elaboration
         byte bh = *(stream + posword);
         byte bl = *(stream + posword + 1);
@@ -334,7 +334,7 @@ char** PartOfPacket::printValue(const char* addString)
         s1 = "";
         s2 = f->getName();
         s2 += " (";
-        s2 += Utility::integerToString(f->getDimension());
+        s2 += Utility::integerToString(f->size());
         s2 +=  ") - ";
         s2 += "Value: ";
         s2 += s;
@@ -374,7 +374,7 @@ void PartOfPacket::printValueStdout()
         s1 = "";
         s2 = f->getName();
         s2 += " (";
-        s2 += Utility::integerToString(f->getDimension());
+        s2 += Utility::integerToString(f->size());
         s2 +=  ") - ";
         s2 += "Value: ";
         s2 += s;
@@ -408,14 +408,14 @@ ByteStreamPtr PartOfPacket::generateStream(bool bigendian)
     /// Dimension of the current field
     byte dimbit = 0;
     if(outputstream == 0)
-        outputstream = ByteStreamPtr(new ByteStream(getDimension(), bigendian));
+        outputstream = ByteStreamPtr(new ByteStream(size(), bigendian));
     for(unsigned i = 0; i<numberOfFields; i++)
     {
         if(!fields[i]->thereIsPredefinedValue())
             wtemp = fields[i]->value;
         else
             wtemp = fields[i]->value =  fields[i]->getPredefinedValue();
-        dimbit = fields[i]->getDimension();
+        dimbit = fields[i]->size();
         shift = 16 - dimbit - posbit;
         if(shift < 0)
         {
@@ -437,7 +437,7 @@ ByteStreamPtr PartOfPacket::generateStream(bool bigendian)
             wtemp = (wtemp << shift);
             w = w | wtemp;
             //cout << (Utility::wordToBinary(w, 16))->c_str() << endl;
-            posbit += fields[i]->getDimension();
+            posbit += fields[i]->size();
         }
         if(posbit == 16)
         {
@@ -463,14 +463,14 @@ ByteStreamPtr PartOfPacket::generateStream(bool bigendian)
 
 bool PartOfPacket::setOutputStream(ByteStreamPtr os, dword first)
 {
-    outputstream = ByteStreamPtr(new ByteStream((os->stream + first), getDimension(), os->isBigendian()));
+    outputstream = ByteStreamPtr(new ByteStream((os->stream + first), size(), os->isBigendian()));
     return true;
 }
 
 void PartOfPacket::setFieldValue(word index, word value)
 {
     if(index < numberOfFields)
-        fields[index]->value = (value & pattern[fields[index]->getDimension()]);
+        fields[index]->value = (value & pattern[fields[index]->size()]);
 }
 
 float PartOfPacket::getFieldValue_5_1(word index)
diff --git a/src/SDFBlock.cpp b/src/SDFBlock.cpp
index 7d8df5c..1b4be7c 100644
--- a/src/SDFBlock.cpp
+++ b/src/SDFBlock.cpp
@@ -339,23 +339,23 @@ bool SDFBlock::loadFields(InputText& fp) throw (PacketException*)
 }
 
 //OK
-dword SDFBlock::getMaxDimension()
+dword SDFBlock::sizeMax()
 {
 	/// for fixed part
-    dword dim = fixed.getDimension(); 
+    dword dim = fixed.size(); 
     ///variable part
 
     for(dword i=0; i < type->nblockmax; i++)
     {
-        dim += block[i].getMaxDimension();
+        dim += block[i].sizeMax();
     }
     return dim;
 }
 
-dword SDFBlock::getDimension()
+dword SDFBlock::size()
 {
 	/// for fixed part
-    dword dim = fixed.getDimension(); 
+    dword dim = fixed.size(); 
     word bi = 0;
     word rbi = 0;
     for(int i=0; i < type->nblockmax; i++)
@@ -364,7 +364,7 @@ dword SDFBlock::getDimension()
         rbi = block[i].getRBlockType();
         word nrdb = getNumberOfRealDataBlock(rbi);
         if(bi < nrdb)
-            dim += block[i].getDimension();
+            dim += block[i].size();
         else
             i += type->maxNumberOfBlock[rbi] - getNumberOfRealDataBlock(rbi) - 1;
     }
@@ -462,8 +462,8 @@ bool SDFBlock::setOutputStream(ByteStreamPtr os, dword first)
     if(type->fixedPresent)
     {
         fixed.setOutputStream(os, start);
-        outputstream = ByteStreamPtr(new ByteStream((os->stream + start), getDimension(), os->isBigendian()));
-        start += fixed.getDimension();
+        outputstream = ByteStreamPtr(new ByteStream((os->stream + start), size(), os->isBigendian()));
+        start += fixed.size();
     }
     if(type->variablePresent)
     {
@@ -477,7 +477,7 @@ bool SDFBlock::setOutputStream(ByteStreamPtr os, dword first)
             {
                 /// Only for valid blocks
                 block[i].setOutputStream(os, start);
-                start += block[i].getDimension();
+                start += block[i].size();
             }
             else
                 i += type->maxNumberOfBlock[rbi] - getNumberOfRealDataBlock(rbi) - 1;
@@ -517,17 +517,17 @@ bool SDFBlock::setByteStream(ByteStreamPtr s, int decodeType)
 	//cout << "bool SDFBlock::setByteStream(ByteStreamPtr s)" << " " << s << endl; //AB
     dword bytestart=0;
     dword bytestop=0;
-    this->stream->setStream(s, 0, s->getDimension() - 1);
+    this->stream->setStream(s, 0, s->size() - 1);
 	
 	if(decodeType == 0)
 		return true;
 
-    //ByteStreamPtr  tmpstream = new ByteStream(s->stream, s->getDimension(), s->isBigendian());
-    //ByteStreamPtr s = new ByteStream(k->stream, k->getDimension(), k->isBigendian());
+    //ByteStreamPtr  tmpstream = new ByteStream(s->stream, s->size(), s->isBigendian());
+    //ByteStreamPtr s = new ByteStream(k->stream, k->size(), k->isBigendian());
     // It sets the output stream for the fixed part (if present)
     if(type->fixedPresent)
     {
-        bytestop += fixed.getDimension() - 1;
+        bytestop += fixed.size() - 1;
         if(tempBlock1->setStream(s, bytestart, bytestop))
             if(!fixed.setByteStream(tempBlock1))
                 return false;
@@ -548,14 +548,14 @@ bool SDFBlock::setByteStream(ByteStreamPtr s, int decodeType)
             {
                 /// Only for valid blocks
             	/// 1) first of all the fixed part of block[i] must be set 
-            	/// before calling  block[i].getDimension(), otherwise only random values are present
-                tempBlock1->setStream(s, bytestart, s->getDimension() - 1);
+            	/// before calling  block[i].size(), otherwise only random values are present
+                tempBlock1->setStream(s, bytestart, s->size() - 1);
                 block[i].setByteStream(tempBlock1, decodeType);
                 /// 2) Now the correct computation of the dimension can be started
                 if(bytestop != 0)
-                    bytestop += block[i].getDimension();
+                    bytestop += block[i].size();
                 else
-                    bytestop += block[i].getDimension() - 1;
+                    bytestop += block[i].size() - 1;
                 if(tempBlock1->setStream(s, bytestart, bytestop))
                     if(!block[i].setByteStream(tempBlock1, decodeType))
                         return false;
diff --git a/src/Socket.cpp b/src/Socket.cpp
index 760a841..6012c68 100644
--- a/src/Socket.cpp
+++ b/src/Socket.cpp
@@ -79,7 +79,7 @@ bool Socket::send ( ByteStreamPtr b ) const throw(PacketExceptionIO*)
 {
     byte* stream = b->getOutputStream();
     //MSG_NOSIGNAL
-    int status = ::send ( m_sock, stream, b->getDimension(),  MSG_DONTROUTE);
+    int status = ::send ( m_sock, stream, b->size(),  MSG_DONTROUTE);
     b->endOutputStream();
     if ( status == -1 )
     {
@@ -109,7 +109,7 @@ ByteStreamPtr Socket::recv (word dim, int & status ) throw(PacketExceptionIO*)
 
     /*if(!bigendian)
     {
-        word dim =  b->getDimension();
+        word dim =  b->size();
         for(word i = 0; i< dim; i+=2) {
             if((dim - i) != 1) { //per dimensioni dispari
                 byte btemp = b->stream[i];
diff --git a/src/SourceDataField.cpp b/src/SourceDataField.cpp
index b0d811c..8702361 100644
--- a/src/SourceDataField.cpp
+++ b/src/SourceDataField.cpp
@@ -84,7 +84,7 @@ bool SourceDataField::loadFields(InputText& fp) throw(PacketException*)
 
 char* SourceDataField::printInHexadecimal()
 {
-    dword dim = getDimension();
+    dword dim = size();
     ByteStream b(stream->stream, dim, true);
     char* c = b.printStreamInHexadecimal();
     return c;
@@ -96,19 +96,19 @@ SDFBlock* SourceDataField::getBlock(word nblock,word rBlockIndex)
 }
 
 
-dword SourceDataField::getMaxDimension()
+dword SourceDataField::sizeMax()
 {
-    return block[0].getMaxDimension();
+    return block[0].sizeMax();
 }
 
-dword SourceDataField::getDimension()
+dword SourceDataField::size()
 {
-    return block[0].getDimension();
+    return block[0].size();
 }
 
-dword SourceDataField::getDimensionFixedPart()
+dword SourceDataField::sizeFixedPart()
 {
-    return block[0].fixed.getDimension();
+    return block[0].fixed.size();
 }
 
 void SourceDataField::setNumberOfRealDataBlock(word number, word rblockIndex)  throw (PacketException*)
-- 
GitLab