]> Creatis software - gdcm.git/blobdiff - src/gdcmDocument.cxx
COMP: on win32 sintrgs.h does not exist
[gdcm.git] / src / gdcmDocument.cxx
index 0d865c24849e1da9478cd33a567c1427f8675d28..4935b4caa4bd261507abdf8af49be813518e3861 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/06 17:16:15 $
+  Version:   $Revision: 1.160 $
                                                                                 
   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;
@@ -937,7 +937,8 @@ 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)
 {
@@ -953,9 +954,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)
    {
@@ -1254,6 +1256,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,23 +1269,61 @@ 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 (Document* dummy = dynamic_cast< Document* > ( set ) )
@@ -1299,55 +1345,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 +1369,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,9 +1402,6 @@ 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"
@@ -1423,11 +1433,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;
    }
 }
 
@@ -1801,7 +1812,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 +1844,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
@@ -1995,10 +2005,10 @@ void Document::SkipDocEntry(DocEntry *entry)
  * \warning NOT end user intended method !
  * @param   entry entry 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);
 }
 
 /**
@@ -2577,9 +2587,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 )