]> Creatis software - gdcm.git/commitdiff
* src/gdcmDocEntrySet.[h|cxx], gdcmDocument.[h|cxx] : amelioration of
authorregrain <regrain>
Thu, 6 Jan 2005 15:36:48 +0000 (15:36 +0000)
committerregrain <regrain>
Thu, 6 Jan 2005 15:36:48 +0000 (15:36 +0000)
     ValEntry, BinEntry, SeqEntry creation or replace
   -- BeNours

ChangeLog
src/gdcmDocEntrySet.cxx
src/gdcmDocEntrySet.h
src/gdcmDocument.cxx
src/gdcmDocument.h
src/gdcmHeader.cxx

index 363d3a26eaf254d80ff4f15b16169002052e3f8e..3bf56a4dad7c572ec6773bdeaf567f7bb1611b9f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+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
+
 2005-01-06 Benoit Regrain <Benoit.Regrain@creatis.insa-lyon.fr>
    * src/gdcmDictEntry.h : now, the IsVRUnknown is correct
    * src/gdcmDocument.[h|cxx] : simplify the search of VR value when parsing
index b73bb8f1933dbd78aabec36fae992b0fa8540853..a2bffcc83c906a489dd55001314a8341c401279a 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocEntrySet.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/06 13:35:38 $
-  Version:   $Revision: 1.29 $
+  Date:      $Date: 2005/01/06 15:36:48 $
+  Version:   $Revision: 1.30 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
 #include "gdcmValEntry.h"
 #include "gdcmBinEntry.h"
 
+#include <assert.h>
+
 namespace gdcm 
 {
 
 //-----------------------------------------------------------------------------
 // Public
-
-/**
- * \brief   Build a new Val Entry from all the low level arguments. 
- *          Check for existence of dictionary entry, and build
- *          a default one when absent.
- * @param   group group   number of the underlying DictEntry
- * @param   elem  element number of the underlying DictEntry
- */
-ValEntry *DocEntrySet::NewValEntryByNumber(uint16_t group,
-                                           uint16_t elem) 
-{
-   // Find out if the tag we encountered is in the dictionaries:
-   DictEntry *dictEntry = GetDictEntryByNumber(group, elem);
-   if (!dictEntry)
-   {
-      dictEntry = NewVirtualDictEntry(group, elem);
-   }
-
-   ValEntry *newEntry = new ValEntry(dictEntry);
-   if (!newEntry) 
-   {
-      dbg.Verbose(1, "Document::NewValEntryByNumber",
-                  "failed to allocate ValEntry");
-      return 0;
-   }
-   return newEntry;
-}
-
-
-/**
- * \brief   Build a new Bin Entry from all the low level arguments. 
- *          Check for existence of dictionary entry, and build
- *          a default one when absent.
- * @param   group group   number of the underlying DictEntry
- * @param   elem  element number of the underlying DictEntry
- */
-BinEntry *DocEntrySet::NewBinEntryByNumber(uint16_t group,
-                                           uint16_t elem) 
-{
-   // Find out if the tag we encountered is in the dictionaries:
-   DictEntry *dictEntry = GetDictEntryByNumber(group, elem);
-   if (!dictEntry)
-   {
-      dictEntry = NewVirtualDictEntry(group, elem);
-   }
-
-   BinEntry *newEntry = new BinEntry(dictEntry);
-   if (!newEntry) 
-   {
-      dbg.Verbose(1, "Document::NewBinEntryByNumber",
-                  "failed to allocate BinEntry");
-      return 0;
-   }
-   return newEntry;
-}
-
-/**
- * \brief   Build a new Seq Entry from all the low level arguments. 
- *          Check for existence of dictionary entry, and build
- *          a default one when absent.
- * @param   Group group   number of the underlying DictEntry
- * @param   Elem  element number of the underlying DictEntry
- */
-SeqEntry* DocEntrySet::NewSeqEntryByNumber(uint16_t Group,
-                                                   uint16_t Elem) 
-{
-   // Find out if the tag we encountered is in the dictionaries:
-   DictEntry* DictEntry = GetDictEntryByNumber( Group, Elem );
-   if ( ! DictEntry )
-   {
-      DictEntry = NewVirtualDictEntry(Group, Elem);
-   }
-
-   SeqEntry *NewEntry = new SeqEntry( DictEntry );
-   if ( !NewEntry ) 
-   {
-      dbg.Verbose(1, "Document::NewSeqEntryByNumber",
-                  "failed to allocate SeqEntry");
-      return 0;
-   }
-   return NewEntry;
-}
-
-//-----------------------------------------------------------------------------
-// Protected
-
 /**
  * \brief  Gets a Dicom Element inside a SQ Item Entry, by name
  * @param  name of the element to be found.
@@ -155,7 +71,6 @@ std::string DocEntrySet::GetEntryByName(TagName const & name)
    return GetEntryByNumber(dictEntry->GetGroup(), dictEntry->GetElement()); 
 }
 
-
 /**
  * \brief   Request a new virtual dict entry to the dict set
  * @param   group     group  number of the underlying DictEntry
@@ -164,111 +79,108 @@ std::string DocEntrySet::GetEntryByName(TagName const & name)
  * @param   fourth owner group
  * @param   name   english name
  */
-DictEntry* DocEntrySet::NewVirtualDictEntry( uint16_t group,
-                                             uint16_t element,
+DictEntry* DocEntrySet::NewVirtualDictEntry( uint16_t group,uint16_t elem,
                                              TagName const & vr,
                                              TagName const & fourth,
                                              TagName const & name )
 {
-   return Global::GetDicts()->NewVirtualDictEntry(group,element,vr,fourth,name);
+   return Global::GetDicts()->NewVirtualDictEntry(group,elem,vr,fourth,name);
 }
 
-/** \brief 
- * Creates a new DocEntry (without any 'value' ...)
- * @param   group     group  number of the underlying DictEntry
- * @param   elem  elem number of the underlying DictEntry 
+//-----------------------------------------------------------------------------
+// Protected
+/**
+ * \brief   Build a new Val Entry from all the low level arguments. 
+ *          Check for existence of dictionary entry, and build
+ *          a default one when absent.
+ * @param   group group   number of the underlying DictEntry
+ * @param   elem  element number of the underlying DictEntry
  */
-DocEntry* DocEntrySet::NewDocEntryByNumber(uint16_t group,
-                                           uint16_t elem)
+ValEntry *DocEntrySet::NewValEntryByNumber(uint16_t group,uint16_t elem,
+                                           TagName const & vr) 
 {
-   // Find out if the tag we encountered is in the dictionaries:
-   Dict *pubDict = Global::GetDicts()->GetDefaultPubDict();
-   DictEntry *dictEntry = pubDict->GetDictEntryByNumber(group, elem);
-   if (!dictEntry)
-   {
-      dictEntry = NewVirtualDictEntry(group, elem);
-   }
+   DictEntry *dictEntry = GetDictEntryByNumber(group, elem, vr);
+   assert(dictEntry);
 
-   DocEntry *newEntry = new DocEntry(dictEntry);
+   ValEntry *newEntry = new ValEntry(dictEntry);
    if (!newEntry) 
    {
-      dbg.Verbose(1, "SQItem::NewDocEntryByNumber",
-                  "failed to allocate DocEntry");
+      dbg.Verbose(1, "Document::NewValEntryByNumber",
+                  "failed to allocate ValEntry");
       return 0;
    }
    return newEntry;
 }
 
 
-/** \brief 
- * Creates a new DocEntry (without any 'value' ...)
- * @param   group     group  number of the underlying DictEntry
- * @param   elem  elem number of the underlying DictEntry 
- * @param   vr    V(alue) R(epresentation) of the Entry -if private Entry- 
+/**
+ * \brief   Build a new Bin Entry from all the low level arguments. 
+ *          Check for existence of dictionary entry, and build
+ *          a default one when absent.
+ * @param   group group   number of the underlying DictEntry
+ * @param   elem  element number of the underlying DictEntry
  */
-DocEntry* DocEntrySet::NewDocEntryByNumber(uint16_t group, uint16_t elem,
-                                           TagName const & vr)
+BinEntry *DocEntrySet::NewBinEntryByNumber(uint16_t group,uint16_t elem,
+                                           TagName const & vr) 
 {
-   // Find out if the tag we encountered is in the dictionaries:
-   Dict *pubDict = Global::GetDicts()->GetDefaultPubDict();
-   DictEntry *dictEntry = pubDict->GetDictEntryByNumber(group, elem);
-   std::string goodVR = vr;
-   DictEntry *goodDict = dictEntry;
-
-   // Check if the would VR is good
-   if (elem==0x0000)
-      goodVR="UL";
-
-   // Check if the DictEntry VR corresponds with the would VR
-   if (goodDict)
-      if (goodDict->GetVR() != goodVR && goodVR!=GDCM_UNKNOWN)
-         goodDict=NULL;
-
-   // Create a new virtual DictEntry if necessary
-   if (!goodDict)
-   {
-      if (dictEntry)
-         goodDict = NewVirtualDictEntry(group, elem, goodVR,"FIXME",dictEntry->GetName());
-      else
-         goodDict = NewVirtualDictEntry(group, elem, goodVR);
-   }
+   DictEntry *dictEntry = GetDictEntryByNumber(group, elem, vr);
+   assert(dictEntry);
 
-   // Create the DocEntry
-   DocEntry *newEntry = new DocEntry(goodDict);
+   BinEntry *newEntry = new BinEntry(dictEntry);
    if (!newEntry) 
    {
-      dbg.Verbose(1, "SQItem::NewDocEntryByNumber",
-                  "failed to allocate DocEntry");
+      dbg.Verbose(1, "Document::NewBinEntryByNumber",
+                  "failed to allocate BinEntry");
       return 0;
    }
    return newEntry;
 }
 
-/* \brief
- * Probabely move, as is, to DocEntrySet, as a non virtual method
- * and remove Document::NewDocEntryByName
+/**
+ * \brief   Build a new Seq Entry from all the low level arguments. 
+ *          Check for existence of dictionary entry, and build
+ *          a default one when absent.
+ * @param   Group group   number of the underlying DictEntry
+ * @param   Elem  element number of the underlying DictEntry
  */
-DocEntry *DocEntrySet::NewDocEntryByName(TagName const & name)
+SeqEntry* DocEntrySet::NewSeqEntryByNumber(uint16_t group,uint16_t elem) 
 {
-  Dict *pubDict = Global::GetDicts()->GetDefaultPubDict();
-  DictEntry *newTag = pubDict->GetDictEntryByName(name);
-   if (!newTag)
+   DictEntry *dictEntry = GetDictEntryByNumber(group, elem, "SQ");
+   assert(dictEntry);
+
+   SeqEntry *newEntry = new SeqEntry( dictEntry );
+   if (!newEntry)
    {
-      newTag = NewVirtualDictEntry(0xffff, 0xffff, "LO", GDCM_UNKNOWN, name);
+      dbg.Verbose(1, "Document::NewSeqEntryByNumber",
+                  "failed to allocate SeqEntry");
+      return 0;
    }
+   return newEntry;
+}
 
-   DocEntry* newEntry = new DocEntry(newTag);
+/** \brief 
+ * Creates a new DocEntry (without any 'value' ...)
+ * @param   group     group  number of the underlying DictEntry
+ * @param   elem  elem number of the underlying DictEntry 
+ * @param   vr    V(alue) R(epresentation) of the Entry -if private Entry- 
+ */
+DocEntry* DocEntrySet::NewDocEntryByNumber(uint16_t group, uint16_t elem,
+                                           TagName const & vr)
+{
+   DictEntry *dictEntry = GetDictEntryByNumber(group, elem, vr);
+   assert(dictEntry);
+
+   // Create the DocEntry
+   DocEntry *newEntry = new DocEntry(dictEntry);
    if (!newEntry) 
    {
-      dbg.Verbose(1, "SQItem::ObtainDocEntryByName",
+      dbg.Verbose(1, "SQItem::NewDocEntryByNumber",
                   "failed to allocate DocEntry");
       return 0;
    }
-
    return newEntry;
 }
 
-
 /**
  * \brief   Searches both the public and the shadow dictionary (when they
  *          exist) for the presence of the DictEntry with given name.
@@ -301,8 +213,7 @@ DictEntry *DocEntrySet::GetDictEntryByName(TagName const & name)
  * @param   element element number of the searched DictEntry
  * @return  Corresponding DictEntry when it exists, NULL otherwise.
  */
-DictEntry *DocEntrySet::GetDictEntryByNumber(uint16_t group, 
-                                             uint16_t element) 
+DictEntry *DocEntrySet::GetDictEntryByNumber(uint16_t group,uint16_t elem) 
 {
    DictEntry *found = 0;
    Dict *pubDict = Global::GetDicts()->GetDefaultPubDict();
@@ -313,11 +224,36 @@ DictEntry *DocEntrySet::GetDictEntryByNumber(uint16_t group,
    }
    else
    {
-      found = pubDict->GetDictEntryByNumber(group, element);  
+      found = pubDict->GetDictEntryByNumber(group, elem);  
    }
    return found;
 }
 
+DictEntry *DocEntrySet::GetDictEntryByNumber(uint16_t group, uint16_t elem,
+                                             TagName const & vr)
+{
+   DictEntry *dictEntry = GetDictEntryByNumber(group,elem);
+   DictEntry *goodEntry = dictEntry;
+   std::string goodVR=vr;
+
+   if (elem==0x0000)
+      goodVR="UL";
+
+   if (goodEntry)
+      if (goodEntry->GetVR() != goodVR && goodVR!=GDCM_UNKNOWN)
+         goodEntry=NULL;
+
+   // Create a new virtual DictEntry if necessary
+   if (!goodEntry)
+   {
+      if (dictEntry)
+         goodEntry = NewVirtualDictEntry(group, elem, goodVR,"FIXME",dictEntry->GetName());
+      else
+         goodEntry = NewVirtualDictEntry(group, elem, goodVR);
+   }
+
+   return goodEntry;
+}
 
 //-----------------------------------------------------------------------------
 // Private
index 0cf434ff677ff61ec6d974da1c662266c34091b8..caa23e4b84ca670aa2e77d968f528f2030db2837 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocEntrySet.h,v $
   Language:  C++
-  Date:      $Date: 2005/01/05 15:38:28 $
-  Version:   $Revision: 1.30 $
+  Date:      $Date: 2005/01/06 15:36:48 $
+  Version:   $Revision: 1.31 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -71,34 +71,32 @@ public:
    virtual void WriteContent (std::ofstream *fp, FileType filetype) = 0;// pure virtual
 
    virtual DocEntry* GetDocEntryByNumber(uint16_t group,
-                                         uint16_t element) = 0;
+                                         uint16_t elem) = 0;
    DocEntry* GetDocEntryByName(TagName const & name);
-   virtual std::string GetEntryByNumber(uint16_t group, uint16_t element) = 0;
+   virtual std::string GetEntryByNumber(uint16_t group, uint16_t elem) = 0;
    std::string GetEntryByName(TagName const & name);
-   DictEntry* NewVirtualDictEntry( uint16_t group, 
-                                   uint16_t element,
-                                   TagName const & vr     = GDCM_UNKNOWN,
-                                   TagName const & fourth = GDCM_UNKNOWN,
-                                   TagName const & name   = GDCM_UNKNOWN );
+
+   DictEntry* NewVirtualDictEntry(uint16_t group, 
+                                  uint16_t element,
+                                  TagName const & vr     = GDCM_UNKNOWN,
+                                  TagName const & fourth = GDCM_UNKNOWN,
+                                  TagName const & name   = GDCM_UNKNOWN );
   
 protected:
 // DocEntry  related utilities 
-   ValEntry* NewValEntryByNumber(uint16_t group, 
-                                 uint16_t element);
-   BinEntry* NewBinEntryByNumber(uint16_t group, 
-                                 uint16_t element);
-   DocEntry* NewDocEntryByNumber(uint16_t group, 
-                                 uint16_t element); 
-   DocEntry* NewDocEntryByNumber(uint16_t group, 
-                                 uint16_t element,
-                                 TagName const & vr); 
-   DocEntry* NewDocEntryByName  (TagName const & name);
-   SeqEntry* NewSeqEntryByNumber(uint16_t group, 
-                                 uint16_t element);
+   ValEntry* NewValEntryByNumber(uint16_t group,uint16_t elem,
+                                 TagName const & vr = GDCM_UNKNOWN);
+   BinEntry* NewBinEntryByNumber(uint16_t group,uint16_t elem,
+                                 TagName const & vr = GDCM_UNKNOWN);
+   SeqEntry* NewSeqEntryByNumber(uint16_t group,uint16_t elem);
+   DocEntry* NewDocEntryByNumber(uint16_t group,uint16_t elem,
+                                 TagName const & vr = GDCM_UNKNOWN); 
 
 // DictEntry  related utilities
    DictEntry *GetDictEntryByName  (TagName const & name);
-   DictEntry *GetDictEntryByNumber(uint16_t, uint16_t);
+   DictEntry *GetDictEntryByNumber(uint16_t group, uint16_t elem);
+   DictEntry *GetDictEntryByNumber(uint16_t group, uint16_t elem,
+                                   TagName const & vr);
 };
 
 } // end namespace gdcm
index 2cc0770d6e963f9346f3203a73f7655345b64b24..0d865c24849e1da9478cd33a567c1427f8675d28 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocument.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/06 14:49:16 $
-  Version:   $Revision: 1.156 $
+  Date:      $Date: 2005/01/06 15:36:48 $
+  Version:   $Revision: 1.157 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -544,79 +544,53 @@ 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, 
-                                         uint16_t group, 
-                                         uint16_t elem,
-                                         TagName const & vr )
+ValEntry* Document::ReplaceOrCreateByNumber(std::string const & value, 
+                                            uint16_t group, 
+                                            uint16_t elem,
+                                            TagName const & vr )
 {
    ValEntry* valEntry = 0;
    DocEntry* currentEntry = GetDocEntryByNumber( group, elem);
    
-   if (!currentEntry)
+   if (currentEntry)
    {
-      // check if (group,element) DictEntry exists
-      // if it doesn't, create an entry in DictSet::VirtualEntry
-      // and use it
+      valEntry = dynamic_cast< ValEntry* >(currentEntry);
 
-   // Find out if the tag we received is in the dictionaries:
-      Dict *pubDict = Global::GetDicts()->GetDefaultPubDict();
-      DictEntry* dictEntry = pubDict->GetDictEntryByNumber(group, elem);
-      if (!dictEntry)
-      {
-         currentEntry = NewDocEntryByNumber(group, elem, vr);
-      }
-      else
-      {
-         currentEntry = NewDocEntryByNumber(group, elem);
-      }
+      // Verify the VR
+      if( valEntry )
+         if( valEntry->GetVR()!=vr )
+            valEntry=NULL;
 
-      if (!currentEntry)
+      // if currentEntry doesn't correspond to the requested valEntry
+      if( !valEntry)
       {
-         dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: call to"
-                        " NewDocEntryByNumber failed.");
-         return NULL;
+         if (!RemoveEntry(currentEntry))
+         {
+            dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: removal"
+                           " of previous DocEntry failed.");
+
+            return NULL;
+         }
       }
+   }
 
-      valEntry = new ValEntry(currentEntry);
-      delete currentEntry;
+   // Create a new valEntry if necessary
+   if (!valEntry)
+   {
+      valEntry = NewValEntryByNumber(group, elem, vr);
 
       if ( !AddEntry(valEntry))
       {
-         delete valEntry;
          dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: AddEntry"
                         " failed allthough this is a creation.");
+
+         delete valEntry;
          return NULL;
       }
    }
-   else
-   {
-      valEntry = dynamic_cast< ValEntry* >(currentEntry);
-      if ( !valEntry ) // Euuuuh? It wasn't a ValEntry
-                       // then we change it to a ValEntry ?
-                       // Shouldn't it be considered as an error ?
-      {
-         // We need to promote the DocEntry to a ValEntry:
-         valEntry = new ValEntry(currentEntry);
-         if (!RemoveEntry(currentEntry))
-         {
-            delete valEntry;
-            dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: removal"
-                           " of previous DocEntry failed.");
-            return NULL;
-         }
-         if ( !AddEntry(valEntry))
-         {
-            delete valEntry;
-            dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: adding"
-                           " promoted ValEntry failed.");
-            return NULL;
-         }
-      }
-   }
-
-   SetEntryByNumber(value, group, elem);
 
+   // Set the binEntry value
+   SetEntry(value, valEntry);
    return valEntry;
 }   
 
@@ -631,72 +605,54 @@ ValEntry* Document::ReplaceOrCreateByNumber(
  * \return  pointer to the modified/created Header Entry (NULL when creation
  *          failed).
  */
-BinEntry* Document::ReplaceOrCreateByNumber(
-                                         uint8_t* binArea,
-                                         int lgth, 
-                                         uint16_t group, 
-                                         uint16_t elem,
-                                         TagName const & vr )
+BinEntry* Document::ReplaceOrCreateByNumber(uint8_t* binArea,
+                                            int lgth, 
+                                            uint16_t group, 
+                                            uint16_t elem,
+                                            TagName const & vr )
 {
    BinEntry* binEntry = 0;
    DocEntry* currentEntry = GetDocEntryByNumber( group, elem);
-   if (!currentEntry)
-   {
-
-      // check if (group,element) DictEntry exists
-      // if it doesn't, create an entry in DictSet::VirtualEntry
-      // and use it
-
-   // Find out if the tag we received is in the dictionaries:
-      Dict *pubDict = Global::GetDicts()->GetDefaultPubDict();
-      DictEntry *dictEntry = pubDict->GetDictEntryByNumber(group, elem);
 
-      if (!dictEntry)
-      {
-         currentEntry = NewDocEntryByNumber(group, elem, vr);
-      }
-      else
-      {
-         currentEntry = NewDocEntryByNumber(group, elem);
-      }
-      if (!currentEntry)
-      {
-         dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: call to"
-                        " NewDocEntryByNumber failed.");
-         return NULL;
-      }
-      binEntry = new BinEntry(currentEntry);
-      if ( !AddEntry(binEntry))
-      {
-         dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: AddEntry"
-                        " failed allthough this is a creation.");
-      }
-      delete currentEntry;
-   }
-   else
+   // Verify the currentEntry
+   if (currentEntry)
    {
       binEntry = dynamic_cast< BinEntry* >(currentEntry);
-      if ( !binEntry ) // Euuuuh? It wasn't a BinEntry
-                       // then we change it to a BinEntry ?
-                       // Shouldn't it be considered as an error ?
+
+      // Verify the VR
+      if( binEntry )
+         if( binEntry->GetVR()!=vr )
+            binEntry=NULL;
+
+      // if currentEntry doesn't correspond to the requested valEntry
+      if( !binEntry)
       {
-         // We need to promote the DocEntry to a BinEntry:
-         binEntry = new BinEntry(currentEntry);
          if (!RemoveEntry(currentEntry))
          {
             dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: removal"
                            " of previous DocEntry failed.");
+
             return NULL;
          }
-         if ( !AddEntry(binEntry))
-         {
-            dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: adding"
-                           " promoted BinEntry failed.");
-            return NULL;
-         }
       }
    }
 
+   // Create a new binEntry if necessary
+   if (!binEntry)
+   {
+      binEntry = NewBinEntryByNumber(group, elem, vr);
+
+      if ( !AddEntry(binEntry))
+      {
+         dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: AddEntry"
+                        " failed allthough this is a creation.");
+
+         delete binEntry;
+         return NULL;
+      }
+   }
+
+   // Set the binEntry value
    uint8_t *tmpArea;
    if (lgth>0 && binArea)
    {
@@ -707,7 +663,7 @@ BinEntry* Document::ReplaceOrCreateByNumber(
    {
       tmpArea = 0;
    }
-   if (!SetEntryByNumber(tmpArea, lgth, group, elem))
+   if (!SetEntry(tmpArea,lgth,binEntry))
    {
       if (tmpArea)
       {
@@ -718,7 +674,6 @@ BinEntry* Document::ReplaceOrCreateByNumber(
    return binEntry;
 }  
 
-
 /*
  * \brief   Modifies the value of a given Header Entry (Dicom Element)
  *          when it exists. Create it when unexistant.
@@ -729,20 +684,48 @@ BinEntry* Document::ReplaceOrCreateByNumber(
  */
 SeqEntry* Document::ReplaceOrCreateByNumber( uint16_t group, uint16_t elem)
 {
-   SeqEntry* b = 0;
-   DocEntry* a = GetDocEntryByNumber( group, elem);
-   if (!a)
+   SeqEntry* seqEntry = 0;
+   DocEntry* currentEntry = GetDocEntryByNumber( group, elem);
+
+   // Verify the currentEntry
+   if (currentEntry)
    {
-      a = NewSeqEntryByNumber(group, elem);
-      if (!a)
+      seqEntry = dynamic_cast< SeqEntry* >(currentEntry);
+
+      // Verify the VR
+      if( seqEntry )
+         if( seqEntry->GetVR()!="SQ" )
+            seqEntry=NULL;
+
+      // if currentEntry doesn't correspond to the requested valEntry
+      if( !seqEntry)
       {
-         return 0;
+         if (!RemoveEntry(currentEntry))
+         {
+            dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: removal"
+                           " of previous DocEntry failed.");
+
+            return NULL;
+         }
       }
+   }
 
-      b = new SeqEntry(a, 1); // FIXME : 1 (Depth)
-      AddEntry(b);
-   }   
-   return b;
+   // Create a new seqEntry if necessary
+   if (!seqEntry)
+   {
+      seqEntry = NewSeqEntryByNumber(group, elem);
+
+      if ( !AddEntry(seqEntry))
+      {
+         dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: AddEntry"
+                        " failed allthough this is a creation.");
+
+         delete seqEntry;
+         return NULL;
+      }
+   }
+
+   return seqEntry;
 } 
  
 /**
@@ -918,16 +901,14 @@ bool Document::SetEntryByName( std::string const & content,
 bool Document::SetEntryByNumber(std::string const& content, 
                                 uint16_t group, uint16_t element) 
 {
-   ValEntry* valEntry = GetValEntryByNumber(group, element);
-   if (!valEntry )
+   ValEntry* entry = GetValEntryByNumber(group, element);
+   if (!entry )
    {
       dbg.Verbose(0, "Document::SetEntryByNumber: no corresponding",
                      " ValEntry (try promotion first).");
       return false;
    }
-   // Non even content must be padded with a space (020H)...
-   valEntry->SetValue(content);
-   return true;
+   return SetEntry(content,entry);
 } 
 
 /**
@@ -942,27 +923,56 @@ bool Document::SetEntryByNumber(std::string const& content,
 bool Document::SetEntryByNumber(uint8_t*content, int lgth, 
                                 uint16_t group, uint16_t element) 
 {
-   (void)lgth;  //not used
-   TagKey key = DictEntry::TranslateToKey(group, element);
-   if ( !TagHT.count(key))
+   BinEntry* entry = GetBinEntryByNumber(group, element);
+   if (!entry )
    {
+      dbg.Verbose(0, "Document::SetEntryByNumber: no corresponding",
+                     " ValEntry (try promotion first).");
       return false;
    }
 
-/* Hope Binary field length is *never* wrong    
-   if(lgth%2) // Non even length are padded with a space (020H).
-   {  
-      lgth++;
-      //content = content + '\0'; // fing a trick to enlarge a binary field?
+   return SetEntry(content,lgth,entry);
+} 
+
+/**
+ * \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
+ */
+bool Document::SetEntry(std::string const & content,ValEntry* entry)
+{
+   if(entry)
+   {
+      entry->SetValue(content);
+      return true;
    }
-*/      
-   BinEntry* entry = (BinEntry *)TagHT[key];           
-   entry->SetBinArea(content);  
-   entry->SetLength(lgth);
-   entry->SetValue(GDCM_BINLOADED);
+   return false;
+}
 
-   return true;
-} 
+/**
+ * \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   lgth new value length
+ */
+bool Document::SetEntry(uint8_t* content, int lgth,BinEntry* entry)
+{
+   if(entry)
+   {
+      // Hope Binary field length is *never* wrong    
+      /*if(lgth%2) // Non even length are padded with a space (020H).
+      {  
+         lgth++;
+         //content = content + '\0'; // fing a trick to enlarge a binary field?
+      }*/
+      
+      entry->SetBinArea(content);  
+      entry->SetLength(lgth);
+      entry->SetValue(GDCM_BINLOADED);
+      return true;
+   }
+   return false;
+}
 
 /**
  * \brief   Gets (from Header) a 'non string' element value 
@@ -1122,15 +1132,37 @@ ValEntry* Document::GetValEntryByNumber(uint16_t group, uint16_t element)
    {
       return 0;
    }
-   if ( ValEntry* valEntry = dynamic_cast<ValEntry*>(currentEntry) )
+   if ( ValEntry* entry = dynamic_cast<ValEntry*>(currentEntry) )
    {
-      return valEntry;
+      return entry;
    }
    dbg.Verbose(0, "Document::GetValEntryByNumber: unfound ValEntry.");
 
    return 0;
 }
 
+/**
+ * \brief  Same as \ref Document::GetDocEntryByNumber except it only
+ *         returns a result when the corresponding entry is of type
+ *         BinEntry.
+ * @return When present, the corresponding BinEntry. 
+ */
+BinEntry* Document::GetBinEntryByNumber(uint16_t group, uint16_t element)
+{
+   DocEntry* currentEntry = GetDocEntryByNumber(group, element);
+   if ( !currentEntry )
+   {
+      return 0;
+   }
+   if ( BinEntry* entry = dynamic_cast<BinEntry*>(currentEntry) )
+   {
+      return entry;
+   }
+   dbg.Verbose(0, "Document::GetBinEntryByNumber: unfound BinEntry.");
+
+   return 0;
+}
+
 /**
  * \brief         Loads the element while preserving the current
  *                underlying file position indicator as opposed to
index 4bbc26688b62e0118de196cb59462258b819893c..6b3a7bbc23f2d468027785e71429948a9d0a7a56 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocument.h,v $
   Language:  C++
-  Date:      $Date: 2005/01/06 13:35:38 $
-  Version:   $Revision: 1.72 $
+  Date:      $Date: 2005/01/06 15:36:48 $
+  Version:   $Revision: 1.73 $
  
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -116,6 +116,9 @@ public:
                                  uint16_t group, uint16_t element);
    virtual bool SetEntryByNumber(uint8_t* content, int lgth,
                                  uint16_t group, uint16_t element);
+   virtual bool SetEntry(std::string const & content,ValEntry* entry);
+   virtual bool SetEntry(uint8_t* content, int lgth,BinEntry* entry);
+
    virtual void* GetEntryBinAreaByNumber(uint16_t group, uint16_t elem);   
 
    virtual std::string GetEntryByName    (TagName const & tagName);
@@ -127,7 +130,7 @@ public:
    DocEntry* GetDocEntryByNumber(uint16_t group, uint16_t element); 
    DocEntry* GetDocEntryByName  (TagName const & tagName);
    ValEntry* GetValEntryByNumber(uint16_t group, uint16_t element); 
-   //BinEntry* GetBinEntryByNumber(uint16_t group, uint16_t element); 
+   BinEntry* GetBinEntryByNumber(uint16_t group, uint16_t element); 
 
    ValEntry* ReplaceOrCreateByNumber(std::string const & value,
                                      uint16_t group, uint16_t elem,
index 2aedf3cda06c7f36dd799bdbc5080e20fb9b40b3..bc28cd19ea484773535b420a477dc7439d6fb4a9 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmHeader.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/05 16:30:50 $
-  Version:   $Revision: 1.219 $
+  Date:      $Date: 2005/01/06 15:36:48 $
+  Version:   $Revision: 1.220 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -99,7 +99,6 @@ Header::Header( std::string const & filename ):
  
       entry->SetDictEntry( newEntry );
    } 
-
 }
 
 /**