]> Creatis software - gdcm.git/commitdiff
* src/gdcmDocument.[h|cxx] : remove all copy of DocEntry when parsing a file
authorregrain <regrain>
Thu, 6 Jan 2005 17:16:15 +0000 (17:16 +0000)
committerregrain <regrain>
Thu, 6 Jan 2005 17:16:15 +0000 (17:16 +0000)
   -- BeNours

ChangeLog
Testing/TestVR.cxx
src/gdcmDocument.cxx
src/gdcmDocument.h
src/gdcmVR.cxx
src/gdcmVR.h

index 3bf56a4dad7c572ec6773bdeaf567f7bb1611b9f..59fa02830ac125e9f9c80619891120dc2c6e43bf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2005-01-06 Benoit Regrain <Benoit.Regrain@creatis.insa-lyon.fr>
+   * src/gdcmDocument.[h|cxx] : remove all copy of DocEntry when parsing a file
+
 2005-01-06 Benoit Regrain <Benoit.Regrain@creatis.insa-lyon.fr>
    * src/gdcmDocEntrySet.[h|cxx], gdcmDocument.[h|cxx] : amelioration of
      ValEntry, BinEntry, SeqEntry creation or replace
index 8fa9348d4696ec3c3b6940f78052bbfd60897cc1..1087e1bb6815bbffd2ebe43736f781e8c13d99c9 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: TestVR.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/11/16 04:28:20 $
-  Version:   $Revision: 1.2 $
+  Date:      $Date: 2005/01/06 17:16:15 $
+  Version:   $Revision: 1.3 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -22,8 +22,9 @@ int TestVR(int , char *[])
    gdcm::VR vr;
    // There should be 16 entries
    vr.Print( std::cout );
-   vr.IsVROfGdcmStringRepresentable( "" );
-   vr.IsVROfGdcmBinaryRepresentable( "" );
+   vr.IsVROfStringRepresentable( "" );
+   vr.IsVROfBinaryRepresentable( "" );
+   vr.IsVROfSequence( "" );
 
    return 0;
 }
index 0098a5720af7654286537d6192db3731e2ffe43a..4935b4caa4bd261507abdf8af49be813518e3861 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocument.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/06 16:33:54 $
-  Version:   $Revision: 1.159 $
+  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
@@ -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;
@@ -1256,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)
    {
@@ -1263,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 ) )
@@ -1301,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 ) )
@@ -1357,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
       {
@@ -1391,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"
@@ -1425,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;
    }
 }
 
@@ -1996,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);
 }
 
 /**
@@ -2578,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 )
index 6b3a7bbc23f2d468027785e71429948a9d0a7a56..09ba91d848f73c55423c88b239c89dfc7290d706 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocument.h,v $
   Language:  C++
-  Date:      $Date: 2005/01/06 15:36:48 $
-  Version:   $Revision: 1.73 $
+  Date:      $Date: 2005/01/06 17:16:16 $
+  Version:   $Revision: 1.74 $
  
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -219,7 +219,7 @@ private:
    std::string GetDocEntryUnvalue(DocEntry *);
 
    void SkipDocEntry          (DocEntry *);
-   void SkipToNextDocEntry    (DocEntry *);
+   void SkipToNextDocEntry    (long offset,long readLgth);
 
    void FixDocEntryFoundLength(DocEntry *, uint32_t);
    bool IsDocEntryAnInteger   (DocEntry *);
index 66006a86f1971b9749ee32dfbca6a8e7b4f31169..9e032195edf3e710df590b6657e40b5c61156ae7 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmVR.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/06 13:35:38 $
-  Version:   $Revision: 1.25 $
+  Date:      $Date: 2005/01/06 17:16:16 $
+  Version:   $Revision: 1.26 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -112,7 +112,7 @@ int VR::Count(VRKey const & key)
  *          \ref VR::IsVROfGdcmStringRepresentable .
  * @param   tested value representation to check for.
  */
-bool VR::IsVROfGdcmBinaryRepresentable(VRKey const & tested)
+bool VR::IsVROfBinaryRepresentable(VRKey const & tested)
 {
    //std::cout << "VR::IsVROfGdcmBinaryRepresentable===================="
    //   << tested << std::endl;
@@ -120,59 +120,51 @@ bool VR::IsVROfGdcmBinaryRepresentable(VRKey const & tested)
    if ( tested == GDCM_UNKNOWN)
       return true;
 
-   if ( ! IsValidVR(tested) )
-   {
-      dbg.Verbose(0, "VR::IsVROfGdcmBinaryRepresentable: tested not a VR!");
+   if ( IsVROfStringRepresentable(tested) )
       return false;
-   }
 
-   if ( IsVROfGdcmStringRepresentable(tested) )
-   {
-      dbg.Verbose(0, "VR::IsVROfGdcmBinaryRepresentable: binary VR !");
+   if ( IsVROfSequence(tested) )
       return false;
-   }
 
    return true;
 }
 
-//-----------------------------------------------------------------------------
 /**
  * \brief   Simple predicate that checks wether the given argument
  *          corresponds to the Value Representation of a \ref ValEntry
  *          but NOT a \ref BinEntry.
  * @param   tested value representation to check for.
  */
-bool VR::IsVROfGdcmStringRepresentable(VRKey const & tested)
+bool VR::IsVROfStringRepresentable(VRKey const & tested)
 {
+   return tested == "AE" ||
+          tested == "AS" ||
+          tested == "CS" ||
+          tested == "DA" ||
+          tested == "DS" ||
+          tested == "IS" || 
+          tested == "LO" ||
+          tested == "LT" ||
+          tested == "PN" ||
+          tested == "SH" ||
+          tested == "SL" ||
+          tested == "SS" ||
+          tested == "ST" ||
+          tested == "TM" ||
+          tested == "UI" ||
+          tested == "UL" ||
+          tested == "UN" ||
+          tested == "US";
+}
 
-   if ( ! IsValidVR(tested) )
-   {
-      dbg.Verbose(0, "VR::IsVROfGdcmStringRepresentable: tested not a VR!");
-      return false;
-   }
-
-   if ( tested == "AE" ||
-        tested == "AS" ||
-        tested == "CS" ||
-        tested == "DA" ||
-        tested == "DS" ||
-        tested == "IS" || 
-        tested == "LO" ||
-        tested == "LT" ||
-        tested == "PN" ||
-        tested == "SH" ||
-        tested == "SL" ||
-        tested == "SS" ||
-        tested == "ST" ||
-        tested == "TM" ||
-        tested == "UI" ||
-        tested == "UL" ||
-        tested == "UN" ||
-        tested == "US" )
-   {
-      return true;
-   }
-   return false;
+/**
+ * \brief   Simple predicate that checks wether the given argument
+ *          corresponds to the Value Representation of a \ref SeqEntry
+ * @param   tested value representation to check for.
+ */
+bool VR::IsVROfSequence(VRKey const & tested)
+{
+   return tested == "SQ";
 }
 
 bool VR::IsValidVR(VRKey const & key)
index bef9882b2d307df3e6bfc764d7a6d87e06127152..0c658b643e60a247d64ed8f5da1c87f80bdb888e 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmVR.h,v $
   Language:  C++
-  Date:      $Date: 2005/01/06 13:35:38 $
-  Version:   $Revision: 1.15 $
+  Date:      $Date: 2005/01/06 17:16:16 $
+  Version:   $Revision: 1.16 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -46,8 +46,9 @@ public:
 
    void Print(std::ostream &os = std::cout);
    int Count(VRKey const & key);
-   bool IsVROfGdcmBinaryRepresentable(VRKey const & tested);
-   bool IsVROfGdcmStringRepresentable(VRKey const & tested);
+   bool IsVROfBinaryRepresentable(VRKey const & tested);
+   bool IsVROfStringRepresentable(VRKey const & tested);
+   bool IsVROfSequence(VRKey const & tested);
 
    bool IsValidVR(VRKey const & key);