]> Creatis software - gdcm.git/blobdiff - src/gdcmDocEntrySet.cxx
Try to track the "FIXME" problem for VM
[gdcm.git] / src / gdcmDocEntrySet.cxx
index 0b4ff26d8456da0553535c17bd24f7cd6a48ce11..27f028324a4d452120b8b4407b9585cd522b649f 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocEntrySet.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/10/18 12:58:28 $
-  Version:   $Revision: 1.61 $
+  Date:      $Date: 2005/10/27 09:13:18 $
+  Version:   $Revision: 1.67 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -154,12 +154,8 @@ SeqEntry *DocEntrySet::GetSeqEntry(uint16_t group, uint16_t elem)
 {
    DocEntry *currentEntry = GetDocEntry(group, elem);
    if ( !currentEntry )
-   {
-      gdcmWarningMacro( "No corresponding SeqEntry " << std::hex << group <<
-                        "," << elem);
       return NULL;
-   }
-
+      
    return dynamic_cast<SeqEntry*>(currentEntry);
 }
 
@@ -286,10 +282,10 @@ DataEntry *DocEntrySet::InsertEntryString(std::string const &value,
       if ( !AddEntry(dataEntry) )
       {
          gdcmWarningMacro("AddEntry failed although this is a creation.");
-
-         delete dataEntry;
+         dataEntry->Delete();
          return NULL;
       }
+      dataEntry->Delete();
    }
 
    // Set the dataEntry value
@@ -345,10 +341,10 @@ DataEntry *DocEntrySet::InsertEntryBinArea(uint8_t *binArea, int lgth,
       if ( !AddEntry(dataEntry) )
       {
          gdcmWarningMacro( "AddEntry failed although this is a creation.");
-
-         delete dataEntry;
+         dataEntry->Delete();
          return NULL;
       }
+      dataEntry->Delete();
    }
 
    // Set the dataEntry value
@@ -414,10 +410,10 @@ SeqEntry *DocEntrySet::InsertSeqEntry(uint16_t group, uint16_t elem)
       if ( !AddEntry(seqEntry) )
       {
          gdcmWarningMacro( "AddEntry failed although this is a creation.");
-
-         delete seqEntry;
+         seqEntry->Delete();
          return NULL;
       }
+      seqEntry->Delete();
    }
 
    // TODO : Find a trick to insert a SequenceDelimitationItem 
@@ -443,14 +439,15 @@ bool DocEntrySet::CheckIfEntryExist(uint16_t group, uint16_t elem )
  * @param   group Group number   of the new Entry
  * @param   elem  Element number of the new Entry
  * @param   vr    V(alue) R(epresentation) of the new Entry 
+ * \remarks The user of this method must destroy the DataEntry when unused
  */
 DataEntry *DocEntrySet::NewDataEntry(uint16_t group,uint16_t elem,
                                      VRKey const &vr) 
 {
    DictEntry *dictEntry = GetDictEntry(group, elem, vr);
-   gdcmAssertMacro(dictEntry);
 
-   DataEntry *newEntry = new DataEntry(dictEntry);
+   DataEntry *newEntry = DataEntry::New(dictEntry);
+   dictEntry->Unregister(); // GetDictEntry register it
    if (!newEntry) 
    {
       gdcmWarningMacro( "Failed to allocate DataEntry");
@@ -465,13 +462,14 @@ DataEntry *DocEntrySet::NewDataEntry(uint16_t group,uint16_t elem,
  *          a default one when absent.
  * @param   group Group   number of the new Entry
  * @param   elem  Element number of the new Entry
+ * \remarks The user of this method must destroy the SeqEntry when unused
  */
 SeqEntry* DocEntrySet::NewSeqEntry(uint16_t group, uint16_t elem) 
 {
    DictEntry *dictEntry = GetDictEntry(group, elem, "SQ");
-   gdcmAssertMacro(dictEntry);
 
-   SeqEntry *newEntry = new SeqEntry( dictEntry );
+   SeqEntry *newEntry = SeqEntry::New( dictEntry );
+   dictEntry->Unregister(); // GetDictEntry register it
    if (!newEntry)
    {
       gdcmWarningMacro( "Failed to allocate SeqEntry");
@@ -480,22 +478,6 @@ SeqEntry* DocEntrySet::NewSeqEntry(uint16_t group, uint16_t elem)
    return newEntry;
 }
 
-/**
- * \brief   Request a new virtual dict entry to the dict set
- * @param   group Group   number of the underlying DictEntry
- * @param   elem  Element number of the underlying DictEntry
- * @param   vr    V(alue) R(epresentation) of the underlying DictEntry
- * @param   vm    V(alue) M(ultiplicity)   of the underlying DictEntry
- * @param   name   english name
- */
-DictEntry* DocEntrySet::NewVirtualDictEntry( uint16_t group, uint16_t elem,
-                                             VRKey const &vr,
-                                             TagName const &vm,
-                                             TagName const &name )
-{
-   return Global::GetDicts()->NewVirtualDictEntry(group,elem,vr,vm,name);
-}
-
 //-----------------------------------------------------------------------------
 // Protected
 /**
@@ -506,6 +488,7 @@ DictEntry* DocEntrySet::NewVirtualDictEntry( uint16_t group, uint16_t elem,
  * @param   group  Group number of the searched DictEntry
  * @param   elem Element number of the searched DictEntry
  * @return  Corresponding DictEntry when it exists, NULL otherwise.
+ * \remarks The returned DictEntry is registered when existing
  */
 DictEntry *DocEntrySet::GetDictEntry(uint16_t group,uint16_t elem) 
 {
@@ -517,7 +500,9 @@ DictEntry *DocEntrySet::GetDictEntry(uint16_t group,uint16_t elem)
    }
    else
    {
-      found = pubDict->GetEntry(group, elem);  
+      found = pubDict->GetEntry(group, elem);
+      if( found )
+         found->Register();
    }
    return found;
 }
@@ -530,6 +515,7 @@ DictEntry *DocEntrySet::GetDictEntry(uint16_t group,uint16_t elem)
  * @param   elem element number of the searched DictEntry
  * @param   vr V(alue) R(epresentation) to use, if necessary 
  * @return  Corresponding DictEntry when it exists, NULL otherwise.
+ * \remarks The returned DictEntry is registered
  */
 DictEntry *DocEntrySet::GetDictEntry(uint16_t group, uint16_t elem,
                                      VRKey const &vr)
@@ -538,7 +524,8 @@ DictEntry *DocEntrySet::GetDictEntry(uint16_t group, uint16_t elem,
    DictEntry *goodEntry = dictEntry;
    VRKey goodVR = vr;
 
-   if (elem == 0x0000) goodVR="UL";
+   if (elem == 0x0000) 
+      goodVR="UL";
 
    if ( goodEntry )
    {
@@ -547,6 +534,7 @@ DictEntry *DocEntrySet::GetDictEntry(uint16_t group, uint16_t elem,
       {
          goodEntry = NULL;
       }
+      dictEntry->Unregister();
    }
 
    // Create a new virtual DictEntry if necessary
@@ -554,14 +542,18 @@ DictEntry *DocEntrySet::GetDictEntry(uint16_t group, uint16_t elem,
    {
       if (dictEntry)
       {
-         goodEntry = NewVirtualDictEntry(group, elem, goodVR, "FIXME", 
-                                         dictEntry->GetName() );
+         goodEntry = DictEntry::New(group, elem, goodVR, "FIXME", 
+                                    dictEntry->GetName() );
       }
       else
       {
-         goodEntry = NewVirtualDictEntry(group, elem, goodVR);
+         goodEntry = DictEntry::New(group, elem, goodVR);
       }
    }
+   else
+   {
+      goodEntry->Register();
+   }
    return goodEntry;
 }