]> Creatis software - gdcm.git/blobdiff - src/gdcmDocument.cxx
Removal of useless and dangerous methods :
[gdcm.git] / src / gdcmDocument.cxx
index 0d865c24849e1da9478cd33a567c1427f8675d28..d10b222857a8bf2b6c160b1a999d403117d2e990 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocument.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/06 15:36:48 $
-  Version:   $Revision: 1.157 $
+  Date:      $Date: 2005/01/07 08:46:18 $
+  Version:   $Revision: 1.162 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -47,7 +47,7 @@ namespace gdcm
 static const char *TransferSyntaxStrings[] =  {
   // Implicit VR Little Endian
   "1.2.840.10008.1.2",
-  // Implicit VR Little Endian DLX G.E?
+  // Implicit VR Big Endian DLX G.E?
   "1.2.840.113619.5.2",
   // Explicit VR Little Endian
   "1.2.840.10008.1.2.1",
@@ -78,7 +78,7 @@ static const char *TransferSyntaxStrings[] =  {
   // Unknown
   "Unknown Transfer Syntax"
 };
-                                                                                
+
 //-----------------------------------------------------------------------------
 // Refer to Document::CheckSwap()
 //const unsigned int Document::HEADER_LENGTH_TO_READ = 256;
@@ -94,7 +94,7 @@ const unsigned int Document::MAX_SIZE_PRINT_ELEMENT_VALUE = 0x7fffffff;
  * \brief   constructor  
  * @param   filename file to be opened for parsing
  */
-Document::Document( std::string const & filename ) : ElementSet(-1)
+Document::Document( std::string const &filename ) : ElementSet(-1)
 {
    SetMaxSizeLoadEntry(MAX_SIZE_LOAD_ELEMENT_VALUE); 
    Filename = filename;
@@ -217,7 +217,7 @@ Document::~Document ()
   * \brief   Prints The Dict Entries of THE public Dicom Dictionary
   * @return
   */  
-void Document::PrintPubDict(std::ostream & os)
+void Document::PrintPubDict(std::ostream &os)
 {
    RefPubDict->SetPrintLevel(PrintLevel);
    RefPubDict->Print(os);
@@ -227,7 +227,7 @@ void Document::PrintPubDict(std::ostream & os)
   * \brief   Prints The Dict Entries of THE shadow Dicom Dictionary
   * @return
   */
-void Document::PrintShaDict(std::ostream & os)
+void Document::PrintShaDict(std::ostream &os)
 {
    RefShaDict->SetPrintLevel(PrintLevel);
    RefShaDict->Print(os);
@@ -238,7 +238,7 @@ void Document::PrintShaDict(std::ostream & os)
 /**
  * \brief   Get the public dictionary used
  */
-DictDocument::GetPubDict()
+Dict *Document::GetPubDict()
 {
    return RefPubDict;
 }
@@ -246,14 +246,14 @@ Dict* Document::GetPubDict()
 /**
  * \brief   Get the shadow dictionary used
  */
-DictDocument::GetShaDict()
+Dict *Document::GetShaDict()
 {
    return RefShaDict;
 }
 
 /**
  * \brief   Set the shadow dictionary used
- * \param   dict dictionary to use in shadow
+ * @param   dict dictionary to use in shadow
  */
 bool Document::SetShaDict(Dict *dict)
 {
@@ -263,9 +263,9 @@ bool Document::SetShaDict(Dict *dict)
 
 /**
  * \brief   Set the shadow dictionary used
- * \param   dictName name of the dictionary to use in shadow
+ * @param   dictName name of the dictionary to use in shadow
  */
-bool Document::SetShaDict(DictKey const & dictName)
+bool Document::SetShaDict(DictKey const &dictName)
 {
    RefShaDict = Global::GetDicts()->GetDict(dictName);
    return !RefShaDict;
@@ -314,7 +314,7 @@ TransferSyntaxType Document::GetTransferSyntax()
    // The entry might be present but not loaded (parsing and loading
    // happen at different stages): try loading and proceed with check...
    LoadDocEntrySafe(entry);
-   if (ValEntryvalEntry = dynamic_cast< ValEntry* >(entry) )
+   if (ValEntry *valEntry = dynamic_cast< ValEntry* >(entry) )
    {
       std::string transfer = valEntry->GetValue();
       // The actual transfer (as read from disk) might be padded. We
@@ -415,7 +415,7 @@ FileType Document::GetFileType()
  *         checks the preamble when existing.
  * @return The FILE pointer on success. 
  */
-std::ifstreamDocument::OpenFile()
+std::ifstream *Document::OpenFile()
 {
    if (Filename.length() == 0) 
    {
@@ -503,7 +503,7 @@ bool Document::CloseFile()
  *          (ACR-NEMA, ExplicitVR, ImplicitVR)
  * \return Always true.
  */
-void Document::WriteContent(std::ofstreamfp, FileType filetype)
+void Document::WriteContent(std::ofstream *fp, FileType filetype)
 {
    /// \todo move the following lines (and a lot of others, to be written)
    /// to a future function CheckAndCorrectHeader  
@@ -544,13 +544,13 @@ void Document::WriteContent(std::ofstream* fp, FileType filetype)
  * \return  pointer to the modified/created Header Entry (NULL when creation
  *          failed).
  */ 
-ValEntry* Document::ReplaceOrCreateByNumber(std::string const & value, 
+ValEntry *Document::ReplaceOrCreateByNumber(std::string const &value, 
                                             uint16_t group, 
                                             uint16_t elem,
-                                            TagName const & vr )
+                                            TagName const &vr )
 {
-   ValEntryvalEntry = 0;
-   DocEntrycurrentEntry = GetDocEntryByNumber( group, elem);
+   ValEntry *valEntry = 0;
+   DocEntry *currentEntry = GetDocEntryByNumber( group, elem);
    
    if (currentEntry)
    {
@@ -605,14 +605,14 @@ ValEntry* Document::ReplaceOrCreateByNumber(std::string const & value,
  * \return  pointer to the modified/created Header Entry (NULL when creation
  *          failed).
  */
-BinEntry* Document::ReplaceOrCreateByNumber(uint8_t* binArea,
+BinEntry *Document::ReplaceOrCreateByNumber(uint8_t *binArea,
                                             int lgth, 
                                             uint16_t group, 
                                             uint16_t elem,
-                                            TagName const & vr )
+                                            TagName const &vr )
 {
-   BinEntrybinEntry = 0;
-   DocEntrycurrentEntry = GetDocEntryByNumber( group, elem);
+   BinEntry *binEntry = 0;
+   DocEntry *currentEntry = GetDocEntryByNumber( group, elem);
 
    // Verify the currentEntry
    if (currentEntry)
@@ -682,10 +682,10 @@ BinEntry* Document::ReplaceOrCreateByNumber(uint8_t* binArea,
  * \return  pointer to the modified/created SeqEntry (NULL when creation
  *          failed).
  */
-SeqEntryDocument::ReplaceOrCreateByNumber( uint16_t group, uint16_t elem)
+SeqEntry *Document::ReplaceOrCreateByNumber( uint16_t group, uint16_t elem)
 {
-   SeqEntryseqEntry = 0;
-   DocEntrycurrentEntry = GetDocEntryByNumber( group, elem);
+   SeqEntry *seqEntry = 0;
+   DocEntry *currentEntry = GetDocEntryByNumber( group, elem);
 
    // Verify the currentEntry
    if (currentEntry)
@@ -736,7 +736,7 @@ SeqEntry* Document::ReplaceOrCreateByNumber( uint16_t group, uint16_t elem)
  * @param elem element number of the Entry
  * \return  boolean 
  */
-bool Document::ReplaceIfExistByNumber(std::string const & value, 
+bool Document::ReplaceIfExistByNumber(std::string const &value, 
                                       uint16_t group, uint16_t elem ) 
 {
    SetEntryByNumber(value, group, elem);
@@ -764,51 +764,6 @@ bool Document::CheckIfEntryExistByNumber(uint16_t group, uint16_t element )
    return TagHT.count(key) != 0;
 }
 
-/**
- * \brief   Searches within Header Entries (Dicom Elements) parsed with 
- *          the public and private dictionaries 
- *          for the element value of a given tag.
- * \warning Don't use any longer : use GetPubEntryByName
- * @param   tagName name of the searched element.
- * @return  Corresponding element value when it exists,
- *          and the string GDCM_UNFOUND ("gdcm::Unfound") otherwise.
- */
-std::string Document::GetEntryByName(TagName const & tagName)
-{
-   DictEntry* dictEntry = RefPubDict->GetDictEntryByName(tagName); 
-   if( !dictEntry )
-   {
-      return GDCM_UNFOUND;
-   }
-
-   return GetEntryByNumber(dictEntry->GetGroup(),dictEntry->GetElement());
-}
-
-/**
- * \brief   Searches within Header Entries (Dicom Elements) parsed with 
- *          the public and private dictionaries 
- *          for the element value representation of a given tag.
- *
- *          Obtaining the VR (Value Representation) might be needed by caller
- *          to convert the string typed content to caller's native type 
- *          (think of C++ vs Python). The VR is actually of a higher level
- *          of semantics than just the native C++ type.
- * @param   tagName name of the searched element.
- * @return  Corresponding element value representation when it exists,
- *          and the string GDCM_UNFOUND ("gdcm::Unfound") otherwise.
- */
-std::string Document::GetEntryVRByName(TagName const& tagName)
-{
-   DictEntry *dictEntry = RefPubDict->GetDictEntryByName(tagName); 
-   if( dictEntry == NULL)
-   {
-      return GDCM_UNFOUND;
-   }
-
-   DocEntry* elem = GetDocEntryByNumber(dictEntry->GetGroup(),
-                                        dictEntry->GetElement());
-   return elem->GetVR();
-}
 
 /**
  * \brief   Searches within Header Entries (Dicom Elements) parsed with 
@@ -846,7 +801,7 @@ std::string Document::GetEntryByNumber(uint16_t group, uint16_t element)
  */
 std::string Document::GetEntryVRByNumber(uint16_t group, uint16_t element)
 {
-   DocEntryelem = GetDocEntryByNumber(group, element);
+   DocEntry *elem = GetDocEntryByNumber(group, element);
    if ( !elem )
    {
       return GDCM_UNFOUND;
@@ -864,31 +819,13 @@ std::string Document::GetEntryVRByNumber(uint16_t group, uint16_t element)
  */
 int Document::GetEntryLengthByNumber(uint16_t group, uint16_t element)
 {
-   DocEntryelem =  GetDocEntryByNumber(group, element);
+   DocEntry *elem =  GetDocEntryByNumber(group, element);
    if ( !elem )
    {
       return -2;  //magic number
    }
    return elem->GetLength();
 }
-/**
- * \brief   Sets the value (string) of the Header Entry (Dicom Element)
- * @param   content string value of the Dicom Element
- * @param   tagName name of the searched Dicom Element.
- * @return  true when found
- */
-bool Document::SetEntryByName( std::string const & content,
-                               TagName const & tagName)
-{
-   DictEntry *dictEntry = RefPubDict->GetDictEntryByName(tagName); 
-   if( !dictEntry )
-   {
-      return false;
-   }
-
-   return SetEntryByNumber(content,dictEntry->GetGroup(),
-                                   dictEntry->GetElement());
-}
 
 /**
  * \brief   Accesses an existing DocEntry (i.e. a Dicom Element)
@@ -901,7 +838,7 @@ bool Document::SetEntryByName( std::string const & content,
 bool Document::SetEntryByNumber(std::string const& content, 
                                 uint16_t group, uint16_t element) 
 {
-   ValEntryentry = GetValEntryByNumber(group, element);
+   ValEntry *entry = GetValEntryByNumber(group, element);
    if (!entry )
    {
       dbg.Verbose(0, "Document::SetEntryByNumber: no corresponding",
@@ -923,7 +860,7 @@ bool Document::SetEntryByNumber(std::string const& content,
 bool Document::SetEntryByNumber(uint8_t*content, int lgth, 
                                 uint16_t group, uint16_t element) 
 {
-   BinEntryentry = GetBinEntryByNumber(group, element);
+   BinEntry *entry = GetBinEntryByNumber(group, element);
    if (!entry )
    {
       dbg.Verbose(0, "Document::SetEntryByNumber: no corresponding",
@@ -937,9 +874,10 @@ bool Document::SetEntryByNumber(uint8_t*content, int lgth,
 /**
  * \brief   Accesses an existing DocEntry (i.e. a Dicom Element)
  *          and modifies it's content with the given value.
- * @param   content new value (string) to substitute with
+ * @param  content new value (string) to substitute with
+ * @param  entry Entry to be modified
  */
-bool Document::SetEntry(std::string const & content,ValEntry* entry)
+bool Document::SetEntry(std::string const &content,ValEntry *entry)
 {
    if(entry)
    {
@@ -953,9 +891,10 @@ bool Document::SetEntry(std::string const & content,ValEntry* entry)
  * \brief   Accesses an existing BinEntry (i.e. a Dicom Element)
  *          and modifies it's content with the given value.
  * @param   content new value (void*  -> uint8_t*) to substitute with
+ * @param  entry Entry to be modified 
  * @param   lgth new value length
  */
-bool Document::SetEntry(uint8_t* content, int lgth,BinEntry* entry)
+bool Document::SetEntry(uint8_t *content, int lgth, BinEntry *entry)
 {
    if(entry)
    {
@@ -981,15 +920,15 @@ bool Document::SetEntry(uint8_t* content, int lgth,BinEntry* entry)
  * @param elem  element number of the Entry
  * @return Pointer to the 'non string' area
  */
-void*  Document::GetEntryBinAreaByNumber(uint16_t group, uint16_t elem) 
+void *Document::GetEntryBinAreaByNumber(uint16_t group, uint16_t elem) 
 {
-   DocEntryentry = GetDocEntryByNumber(group, elem);
+   DocEntry *entry = GetDocEntryByNumber(group, elem);
    if (!entry) 
    {
       dbg.Verbose(1, "Document::GetDocEntryByNumber: no entry");
       return 0;
    }
-   if ( BinEntrybinEntry = dynamic_cast<BinEntry*>(entry) )
+   if ( BinEntry *binEntry = dynamic_cast<BinEntry*>(entry) )
    {
       return binEntry->GetBinArea();
    }
@@ -1022,7 +961,7 @@ void Document::LoadEntryBinArea(uint16_t group, uint16_t elem)
  *                when a string is not suitable
  * @param element  Entry whose binArea is going to be loaded
  */
-void Document::LoadEntryBinArea(BinEntryelement) 
+void Document::LoadEntryBinArea(BinEntry *element) 
 {
    if(element->GetBinArea())
       return;
@@ -1035,7 +974,7 @@ void Document::LoadEntryBinArea(BinEntry* element)
    Fp->seekg(o, std::ios::beg);
 
    size_t l = element->GetLength();
-   uint8_ta = new uint8_t[l];
+   uint8_t *a = new uint8_t[l];
    if( !a )
    {
       dbg.Verbose(0, "Document::LoadEntryBinArea cannot allocate a");
@@ -1063,16 +1002,16 @@ void Document::LoadEntryBinArea(BinEntry* element)
  * @param   element Element number of the searched Dicom Element 
  * @return  
  */
-/*bool Document::SetEntryBinAreaByNumber(uint8_tarea,
+/*bool Document::SetEntryBinAreaByNumber(uint8_t *area,
                                        uint16_t group, uint16_t element) 
 {
-   DocEntrycurrentEntry = GetDocEntryByNumber(group, element);
+   DocEntry *currentEntry = GetDocEntryByNumber(group, element);
    if ( !currentEntry )
    {
       return false;
    }
 
-   if ( BinEntrybinEntry = dynamic_cast<BinEntry*>(currentEntry) )
+   if ( BinEntry *binEntry = dynamic_cast<BinEntry*>(currentEntry) )
    {
       binEntry->SetBinArea( area );
       return true;
@@ -1081,24 +1020,6 @@ void Document::LoadEntryBinArea(BinEntry* element)
    return false;
 }*/
 
-/**
- * \brief   Searches within the Header Entries for a Dicom Element of
- *          a given tag.
- * @param   tagName name of the searched Dicom Element.
- * @return  Corresponding Dicom Element when it exists, and NULL
- *          otherwise.
- */
-DocEntry* Document::GetDocEntryByName(TagName const & tagName)
-{
-   DictEntry *dictEntry = RefPubDict->GetDictEntryByName(tagName); 
-   if( !dictEntry )
-   {
-      return NULL;
-   }
-
-  return GetDocEntryByNumber(dictEntry->GetGroup(),dictEntry->GetElement());
-}
-
 /**
  * \brief  retrieves a Dicom Element (the first one) using (group, element)
  * \warning (group, element) IS NOT an identifier inside the Dicom Header
@@ -1109,7 +1030,7 @@ DocEntry* Document::GetDocEntryByName(TagName const & tagName)
  * @param   element Element number of the searched Dicom Element 
  * @return  
  */
-DocEntryDocument::GetDocEntryByNumber(uint16_t group, uint16_t element) 
+DocEntry *Document::GetDocEntryByNumber(uint16_t group, uint16_t element) 
 {
    TagKey key = DictEntry::TranslateToKey(group, element);
    if ( !TagHT.count(key))
@@ -1125,14 +1046,14 @@ DocEntry* Document::GetDocEntryByNumber(uint16_t group, uint16_t element)
  *         ValEntry.
  * @return When present, the corresponding ValEntry. 
  */
-ValEntryDocument::GetValEntryByNumber(uint16_t group, uint16_t element)
+ValEntry *Document::GetValEntryByNumber(uint16_t group, uint16_t element)
 {
-   DocEntrycurrentEntry = GetDocEntryByNumber(group, element);
+   DocEntry *currentEntry = GetDocEntryByNumber(group, element);
    if ( !currentEntry )
    {
       return 0;
    }
-   if ( ValEntryentry = dynamic_cast<ValEntry*>(currentEntry) )
+   if ( ValEntry *entry = dynamic_cast<ValEntry*>(currentEntry) )
    {
       return entry;
    }
@@ -1147,14 +1068,14 @@ ValEntry* Document::GetValEntryByNumber(uint16_t group, uint16_t element)
  *         BinEntry.
  * @return When present, the corresponding BinEntry. 
  */
-BinEntryDocument::GetBinEntryByNumber(uint16_t group, uint16_t element)
+BinEntry *Document::GetBinEntryByNumber(uint16_t group, uint16_t element)
 {
-   DocEntrycurrentEntry = GetDocEntryByNumber(group, element);
+   DocEntry *currentEntry = GetDocEntryByNumber(group, element);
    if ( !currentEntry )
    {
       return 0;
    }
-   if ( BinEntryentry = dynamic_cast<BinEntry*>(currentEntry) )
+   if ( BinEntry *entry = dynamic_cast<BinEntry*>(currentEntry) )
    {
       return entry;
    }
@@ -1165,12 +1086,12 @@ BinEntry* Document::GetBinEntryByNumber(uint16_t group, uint16_t element)
 
 /**
  * \brief         Loads the element while preserving the current
- *                underlying file position indicator as opposed to
+ *               underlying file position indicator as opposed to
  *                to LoadDocEntry that modifies it.
  * @param entry   Header Entry whose value shall be loaded. 
  * @return  
  */
-void Document::LoadDocEntrySafe(DocEntry * entry)
+void Document::LoadDocEntrySafe(DocEntry *entry)
 {
    if(Fp)
    {
@@ -1254,6 +1175,12 @@ void Document::ParseDES(DocEntrySet *set, long offset,
                         long l_max, bool delim_mode)
 {
    DocEntry *newDocEntry = 0;
+   ValEntry *newValEntry;
+   BinEntry *newBinEntry;
+   SeqEntry *newSeqEntry;
+   VRKey vr;
+   bool used=false;
+   long offsetEntry,readEntry;
 
    while (true)
    {
@@ -1261,26 +1188,64 @@ void Document::ParseDES(DocEntrySet *set, long offset,
       {
          break;
       }
+
+      used=true;
       newDocEntry = ReadNextDocEntry( );
       if ( !newDocEntry )
       {
          break;
       }
 
-      VRKey vr = newDocEntry->GetVR();
-      if ( vr != "SQ" )
+      vr = newDocEntry->GetVR();
+      newValEntry = dynamic_cast<ValEntry*>(newDocEntry);
+      newBinEntry = dynamic_cast<BinEntry*>(newDocEntry);
+      newSeqEntry = dynamic_cast<SeqEntry*>(newDocEntry);
+
+      if ( newValEntry || newBinEntry )
       {
+         offsetEntry=newDocEntry->GetOffset();
+         readEntry=newDocEntry->GetReadLength();
                
-         if ( Global::GetVR()->IsVROfGdcmStringRepresentable(vr) )
+         if ( newBinEntry )
+         {
+            if ( ! Global::GetVR()->IsVROfBinaryRepresentable(vr) )
+            { 
+                ////// Neither ValEntry NOR BinEntry: should mean UNKOWN VR
+                dbg.Verbose(0, "Document::ParseDES: neither Valentry, "
+                               "nor BinEntry. Probably unknown VR.");
+            }
+
+         //////////////////// BinEntry or UNKOWN VR:
+            // When "this" is a Document the Key is simply of the
+            // form ( group, elem )...
+            if (Document *dummy = dynamic_cast< Document* > ( set ) )
+            {
+               (void)dummy;
+               newBinEntry->SetKey( newBinEntry->GetKey() );
+            }
+            // but when "this" is a SQItem, we are inserting this new
+            // valEntry in a sequence item, and the kay has the
+            // generalized form (refer to \ref BaseTagKey):
+            if (SQItem *parentSQItem = dynamic_cast< SQItem* > ( set ) )
+            {
+               newBinEntry->SetKey(  parentSQItem->GetBaseTagKey()
+                                   + newBinEntry->GetKey() );
+            }
+
+            LoadDocEntry( newBinEntry );
+            if( !set->AddEntry( newBinEntry ) )
+            {
+              //Expect big troubles if here
+              //delete newBinEntry;
+              used=false;
+            }
+         }
+         else
          {
          /////////////////////// ValEntry
-            ValEntry* newValEntry =
-               new ValEntry( newDocEntry->GetDictEntry() ); //LEAK
-            newValEntry->Copy( newDocEntry );
-             
             // When "set" is a Document, then we are at the top of the
             // hierarchy and the Key is simply of the form ( group, elem )...
-            if (Documentdummy = dynamic_cast< Document* > ( set ) )
+            if (Document *dummy = dynamic_cast< Document* > ( set ) )
             {
                (void)dummy;
                newValEntry->SetKey( newValEntry->GetKey() );
@@ -1288,7 +1253,7 @@ void Document::ParseDES(DocEntrySet *set, long offset,
             // ...but when "set" is a SQItem, we are inserting this new
             // valEntry in a sequence item. Hence the key has the
             // generalized form (refer to \ref BaseTagKey):
-            if (SQItemparentSQItem = dynamic_cast< SQItem* > ( set ) )
+            if (SQItem *parentSQItem = dynamic_cast< SQItem* > ( set ) )
             {
                newValEntry->SetKey(  parentSQItem->GetBaseTagKey()
                                    + newValEntry->GetKey() );
@@ -1299,55 +1264,23 @@ void Document::ParseDES(DocEntrySet *set, long offset,
             if( !set->AddEntry( newValEntry ) )
             {
               // If here expect big troubles
-              delete newValEntry; //otherwise mem leak
+              //delete newValEntry; //otherwise mem leak
+              used=false;
             }
 
             if (delimitor)
             {
-               delete newDocEntry;
+               if(!used)
+                  delete newDocEntry;
                break;
             }
             if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max)
             {
-               delete newDocEntry;
+               if(!used)
+                  delete newDocEntry;
                break;
             }
          }
-         else
-         {
-            if ( ! Global::GetVR()->IsVROfGdcmBinaryRepresentable(vr) )
-            { 
-                ////// Neither ValEntry NOR BinEntry: should mean UNKOWN VR
-                dbg.Verbose(0, "Document::ParseDES: neither Valentry, "
-                               "nor BinEntry. Probably unknown VR.");
-            }
-
-         //////////////////// BinEntry or UNKOWN VR:
-            BinEntry* newBinEntry = new BinEntry( newDocEntry );  //LEAK
-
-            // When "this" is a Document the Key is simply of the
-            // form ( group, elem )...
-            if (Document* dummy = dynamic_cast< Document* > ( set ) )
-            {
-               (void)dummy;
-               newBinEntry->SetKey( newBinEntry->GetKey() );
-            }
-            // but when "this" is a SQItem, we are inserting this new
-            // valEntry in a sequence item, and the kay has the
-            // generalized form (refer to \ref BaseTagKey):
-            if (SQItem* parentSQItem = dynamic_cast< SQItem* > ( set ) )
-            {
-               newBinEntry->SetKey(  parentSQItem->GetBaseTagKey()
-                                   + newBinEntry->GetKey() );
-            }
-
-            LoadDocEntry( newBinEntry );
-            if( !set->AddEntry( newBinEntry ) )
-            {
-              //Expect big troubles if here
-              delete newBinEntry;
-            }
-         }
 
          if (    ( newDocEntry->GetGroup()   == 0x7fe0 )
               && ( newDocEntry->GetElement() == 0x0010 ) )
@@ -1355,23 +1288,22 @@ void Document::ParseDES(DocEntrySet *set, long offset,
              TransferSyntaxType ts = GetTransferSyntax();
              if ( ts == RLELossless ) 
              {
-                long PositionOnEntry = Fp->tellg();
+                long positionOnEntry = Fp->tellg();
                 Fp->seekg( newDocEntry->GetOffset(), std::ios::beg );
                 ComputeRLEInfo();
-                Fp->seekg( PositionOnEntry, std::ios::beg );
+                Fp->seekg( positionOnEntry, std::ios::beg );
              }
              else if ( IsJPEG() )
              {
-                long PositionOnEntry = Fp->tellg();
+                long positionOnEntry = Fp->tellg();
                 Fp->seekg( newDocEntry->GetOffset(), std::ios::beg );
                 ComputeJPEGFragmentInfo();
-                Fp->seekg( PositionOnEntry, std::ios::beg );
+                Fp->seekg( positionOnEntry, std::ios::beg );
              }
          }
     
          // Just to make sure we are at the beginning of next entry.
-         SkipToNextDocEntry(newDocEntry);
-         //delete newDocEntry;
+         SkipToNextDocEntry(offsetEntry,readEntry);
       }
       else
       {
@@ -1389,16 +1321,13 @@ void Document::ParseDES(DocEntrySet *set, long offset,
             }
          }
          // no other way to create it ...
-         SeqEntry* newSeqEntry =
-            new SeqEntry( newDocEntry->GetDictEntry() );
-         newSeqEntry->Copy( newDocEntry );
          newSeqEntry->SetDelimitorMode( delim_mode );
 
          // At the top of the hierarchy, stands a Document. When "set"
          // is a Document, then we are building the first depth level.
          // Hence the SeqEntry we are building simply has a depth
          // level of one:
-         if (Documentdummy = dynamic_cast< Document* > ( set ) )
+         if (Document *dummy = dynamic_cast< Document* > ( set ) )
          {
             (void)dummy;
             newSeqEntry->SetDepthLevel( 1 );
@@ -1407,7 +1336,7 @@ void Document::ParseDES(DocEntrySet *set, long offset,
          // But when "set" is allready a SQItem, we are building a nested
          // sequence, and hence the depth level of the new SeqEntry
          // we are building, is one level deeper:
-         if (SQItemparentSQItem = dynamic_cast< SQItem* > ( set ) )
+         if (SQItem *parentSQItem = dynamic_cast< SQItem* > ( set ) )
          {
             newSeqEntry->SetDepthLevel( parentSQItem->GetDepthLevel() + 1 );
             newSeqEntry->SetKey(  parentSQItem->GetBaseTagKey()
@@ -1423,11 +1352,12 @@ void Document::ParseDES(DocEntrySet *set, long offset,
          set->AddEntry( newSeqEntry );
          if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max)
          {
-            delete newDocEntry;
             break;
          }
       }
-      delete newDocEntry;
+
+      if(!used)
+         delete newDocEntry;
    }
 }
 
@@ -1435,7 +1365,7 @@ void Document::ParseDES(DocEntrySet *set, long offset,
  * \brief   Parses a Sequence ( SeqEntry after SeqEntry)
  * @return  parsed length for this level
  */ 
-void Document::ParseSQ( SeqEntryseqEntry,
+void Document::ParseSQ( SeqEntry *seqEntry,
                         long offset, long l_max, bool delim_mode)
 {
    int SQItemNumber = 0;
@@ -1443,7 +1373,7 @@ void Document::ParseSQ( SeqEntry* seqEntry,
 
    while (true)
    {
-      DocEntrynewDocEntry = ReadNextDocEntry();   
+      DocEntry *newDocEntry = ReadNextDocEntry();   
       if ( !newDocEntry )
       {
          // FIXME Should warn user
@@ -1498,7 +1428,7 @@ void Document::ParseSQ( SeqEntry* seqEntry,
  *                the value specified with Document::SetMaxSizeLoadEntry()
  * @param         entry Header Entry (Dicom Element) to be dealt with
  */
-void Document::LoadDocEntry(DocEntryentry)
+void Document::LoadDocEntry(DocEntry *entry)
 {
    uint16_t group  = entry->GetGroup();
    std::string  vr = entry->GetVR();
@@ -1530,7 +1460,7 @@ void Document::LoadDocEntry(DocEntry* entry)
    std::ostringstream s;
    if (length > MaxSizeLoadEntry)
    {
-      if (BinEntrybinEntryPtr = dynamic_cast< BinEntry* >(entry) )
+      if (BinEntry *binEntryPtr = dynamic_cast< BinEntry* >(entry) )
       {  
          //s << "gdcm::NotLoaded (BinEntry)";
          s << GDCM_NOTLOADED;
@@ -1540,7 +1470,7 @@ void Document::LoadDocEntry(DocEntry* entry)
          binEntryPtr->SetValue(s.str());
       }
       // Be carefull : a BinEntry IS_A ValEntry ... 
-      else if (ValEntryvalEntryPtr = dynamic_cast< ValEntry* >(entry) )
+      else if (ValEntry *valEntryPtr = dynamic_cast< ValEntry* >(entry) )
       {
         // s << "gdcm::NotLoaded. (ValEntry)";
          s << GDCM_NOTLOADED;  
@@ -1563,7 +1493,7 @@ void Document::LoadDocEntry(DocEntry* entry)
    }
 
    // When we find a BinEntry not very much can be done :
-   if (BinEntrybinEntryPtr = dynamic_cast< BinEntry* >(entry) )
+   if (BinEntry *binEntryPtr = dynamic_cast< BinEntry* >(entry) )
    {
       s << GDCM_BINLOADED;
       binEntryPtr->SetValue(s.str());
@@ -1640,7 +1570,7 @@ void Document::LoadDocEntry(DocEntry* entry)
    }
    delete[] str;
 
-   if ( ValEntryvalEntry = dynamic_cast<ValEntry* >(entry) )
+   if ( ValEntry *valEntry = dynamic_cast<ValEntry* >(entry) )
    {
       if ( Fp->fail() || Fp->eof())//Fp->gcount() == 1
       {
@@ -1764,7 +1694,7 @@ void Document::FindDocEntryLength( DocEntry *entry )
          // and the dictionary entry depending on them.
          uint16_t correctGroup = SwapShort( entry->GetGroup() );
          uint16_t correctElem  = SwapShort( entry->GetElement() );
-         DictEntrynewTag = GetDictEntryByNumber( correctGroup,
+         DictEntry *newTag = GetDictEntryByNumber( correctGroup,
                                                        correctElem );
          if ( !newTag )
          {
@@ -1801,7 +1731,7 @@ void Document::FindDocEntryLength( DocEntry *entry )
 
 /**
  * \brief     Find the Value Representation of the current Dicom Element.
- * @param     entry
+ * @return    Value Representation of the current Entry
  */
 std::string Document::FindDocEntryVR()
 {
@@ -1833,7 +1763,6 @@ std::string Document::FindDocEntryVR()
  * \brief     Check the correspondance between the VR of the header entry
  *            and the taken VR. If they are different, the header entry is 
  *            updated with the new VR.
- * @param     entry Header Entry to check
  * @param     vr    Dicom Value Representation
  * @return    false if the VR is incorrect of if the VR isn't referenced
  *            otherwise, it returns true
@@ -1932,7 +1861,7 @@ std::string Document::GetDocEntryValue(DocEntry *entry)
  * @param   entry Entry to reverse transform
  * @return  Reverse transformed entry value
  */
-std::string Document::GetDocEntryUnvalue(DocEntryentry)
+std::string Document::GetDocEntryUnvalue(DocEntry *entry)
 {
    if ( IsDocEntryAnInteger(entry) && entry->IsImplicitVR() )
    {
@@ -1993,12 +1922,14 @@ void Document::SkipDocEntry(DocEntry *entry)
 /**
  * \brief   Skips to the begining of the next Header Entry 
  * \warning NOT end user intended method !
- * @param   entry entry to skip
+ * @param   offset start of skipping
+ * @param   readLgth length to skip
+
  */
-void Document::SkipToNextDocEntry(DocEntry *entry
+void Document::SkipToNextDocEntry(long offset,long readLgth
 {
-   Fp->seekg((long)(entry->GetOffset()),     std::ios::beg);
-   Fp->seekg( (long)(entry->GetReadLength()), std::ios::cur);
+   Fp->seekg((long)(offset),    std::ios::beg);
+   Fp->seekg( (long)(readLgth), std::ios::cur);
 }
 
 /**
@@ -2091,7 +2022,7 @@ bool Document::IsDocEntryAnInteger(DocEntry *entry)
 {
    uint16_t element = entry->GetElement();
    uint16_t group   = entry->GetGroup();
-   const std::string & vr  = entry->GetVR();
+   const std::string &vr  = entry->GetVR();
    uint32_t length  = entry->GetLength();
 
    // When we have some semantics on the element we just read, and if we
@@ -2558,7 +2489,7 @@ void Document::HandleBrokenEndian(uint16_t group, uint16_t elem)
  *          gets the VR, gets the length, gets the offset value)
  * @return  On succes the newly created DocEntry, NULL on failure.      
  */
-DocEntryDocument::ReadNextDocEntry()
+DocEntry *Document::ReadNextDocEntry()
 {
    uint16_t group;
    uint16_t elem;
@@ -2577,9 +2508,24 @@ DocEntry* Document::ReadNextDocEntry()
    }
 
    HandleBrokenEndian(group, elem);
-   std::string vr=FindDocEntryVR();
+   std::string vr = FindDocEntryVR();
+   std::string realVR = vr;
+
+   if( vr == GDCM_UNKNOWN)
+   {
+      DictEntry *dictEntry = GetDictEntryByNumber(group,elem);
+      if( dictEntry )
+         realVR = dictEntry->GetVR();
+   }
+
+   DocEntry *newEntry;
+   if( Global::GetVR()->IsVROfSequence(realVR) )
+      newEntry = NewSeqEntryByNumber(group, elem);
+   else if( Global::GetVR()->IsVROfStringRepresentable(realVR) )
+      newEntry = NewValEntryByNumber(group, elem,vr);
+   else
+      newEntry = NewBinEntryByNumber(group, elem,vr);
 
-   DocEntry *newEntry = NewDocEntryByNumber(group, elem, vr);
    if( vr == GDCM_UNKNOWN )
    {
       if( Filetype == ExplicitVR )
@@ -2735,7 +2681,7 @@ void Document::ReadAndSkipEncapsulatedBasicOffsetTable()
    //          lengths, but we won't bother with such fuses for the time being.
    if ( itemLength != 0 )
    {
-      charbasicOffsetTableItemValue = new char[itemLength + 1];
+      char *basicOffsetTableItemValue = new char[itemLength + 1];
       Fp->read(basicOffsetTableItemValue, itemLength);
 
 #ifdef GDCM_DEBUG
@@ -2834,7 +2780,7 @@ void Document::ComputeRLEInfo()
        SkipBytes(rleSegmentLength[nbRleSegments]);
 
        // Store the collected info
-       RLEFramenewFrameInfo = new RLEFrame;
+       RLEFrame *newFrameInfo = new RLEFrame;
        newFrameInfo->NumberFragments = nbRleSegments;
        for( unsigned int uk = 1; uk <= nbRleSegments; uk++ )
        {
@@ -2877,7 +2823,7 @@ void Document::ComputeJPEGFragmentInfo()
       long fragmentOffset = Fp->tellg();
 
        // Store the collected info
-       JPEGFragmentnewFragment = new JPEGFragment;
+       JPEGFragment *newFragment = new JPEGFragment;
        newFragment->Offset = fragmentOffset;
        newFragment->Length = fragmentLength;
        JPEGInfo->Fragments.push_back( newFragment );
@@ -2903,18 +2849,18 @@ void Document::ComputeJPEGFragmentInfo()
  *        when recursively walking the given set.
  * @param set The structure to be traversed (recursively).
  */
-void Document::BuildFlatHashTableRecurse( TagDocEntryHTbuiltHT,
-                                          DocEntrySetset )
+void Document::BuildFlatHashTableRecurse( TagDocEntryHT &builtHT,
+                                          DocEntrySet *set )
 { 
-   if (ElementSetelementSet = dynamic_cast< ElementSet* > ( set ) )
+   if (ElementSet *elementSet = dynamic_cast< ElementSet* > ( set ) )
    {
-      TagDocEntryHT const & currentHT = elementSet->GetTagHT();
+      TagDocEntryHT const &currentHT = elementSet->GetTagHT();
       for( TagDocEntryHT::const_iterator i  = currentHT.begin();
                                          i != currentHT.end();
                                        ++i)
       {
-         DocEntryentry = i->second;
-         if ( SeqEntryseqEntry = dynamic_cast<SeqEntry*>(entry) )
+         DocEntry *entry = i->second;
+         if ( SeqEntry *seqEntry = dynamic_cast<SeqEntry*>(entry) )
          {
             const ListSQItem& items = seqEntry->GetSQItems();
             for( ListSQItem::const_iterator item  = items.begin();
@@ -2930,15 +2876,15 @@ void Document::BuildFlatHashTableRecurse( TagDocEntryHT& builtHT,
       return;
     }
 
-   if (SQItemSQItemSet = dynamic_cast< SQItem* > ( set ) )
+   if (SQItem *SQItemSet = dynamic_cast< SQItem* > ( set ) )
    {
       const ListDocEntry& currentList = SQItemSet->GetDocEntries();
       for (ListDocEntry::const_iterator i  = currentList.begin();
                                         i != currentList.end();
                                       ++i)
       {
-         DocEntryentry = *i;
-         if ( SeqEntryseqEntry = dynamic_cast<SeqEntry*>(entry) )
+         DocEntry *entry = *i;
+         if ( SeqEntry *seqEntry = dynamic_cast<SeqEntry*>(entry) )
          {
             const ListSQItem& items = seqEntry->GetSQItems();
             for( ListSQItem::const_iterator item  = items.begin();
@@ -2978,9 +2924,9 @@ void Document::BuildFlatHashTableRecurse( TagDocEntryHT& builtHT,
  *        \ref BuildFlatHashTable again...
  * @return The flat std::map<> we juste build.
  */
-TagDocEntryHTDocument::BuildFlatHashTable()
+TagDocEntryHT *Document::BuildFlatHashTable()
 {
-   TagDocEntryHTFlatHT = new TagDocEntryHT;
+   TagDocEntryHT *FlatHT = new TagDocEntryHT;
    BuildFlatHashTableRecurse( *FlatHT, this );
    return FlatHT;
 }