X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocEntrySet.cxx;h=27f028324a4d452120b8b4407b9585cd522b649f;hb=c7388633253fb42f36bba23cd01018f4cde27ff7;hp=8aa7966340a6fc8fb59629814f617f7379f56656;hpb=bc69950a406d06c50f0fb75a96572784965cb534;p=gdcm.git diff --git a/src/gdcmDocEntrySet.cxx b/src/gdcmDocEntrySet.cxx index 8aa79663..27f02832 100644 --- a/src/gdcmDocEntrySet.cxx +++ b/src/gdcmDocEntrySet.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocEntrySet.cxx,v $ Language: C++ - Date: $Date: 2005/10/18 08:35:49 $ - Version: $Revision: 1.60 $ + 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 @@ -125,27 +125,6 @@ int DocEntrySet::GetEntryLength(uint16_t group, uint16_t elem) return -1; } -/** - * \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 group Group number of the searched tag. - * @param elem Element number of the searched tag. - * @return Corresponding element value representation when it exists, - * and the string GDCM_UNFOUND ("gdcm::Unfound") otherwise. - */ -std::string DocEntrySet::GetEntryVR(uint16_t group, uint16_t elem) -{ - DocEntry *entry = GetDocEntry(group, elem); - if ( entry ) - return entry->GetVR(); - return GDCM_UNFOUND; -} - /** * \brief Same as \ref Document::GetDocEntry except it only * returns a result when the corresponding entry is of type @@ -175,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(currentEntry); } @@ -274,7 +249,7 @@ bool DocEntrySet::SetEntryBinArea(uint8_t *content, int lgth, DataEntry *entry) */ DataEntry *DocEntrySet::InsertEntryString(std::string const &value, uint16_t group, uint16_t elem, - TagName const &vr ) + VRKey const &vr ) { DataEntry *dataEntry = 0; DocEntry *currentEntry = GetDocEntry( group, elem ); @@ -307,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 @@ -332,7 +307,7 @@ DataEntry *DocEntrySet::InsertEntryString(std::string const &value, */ DataEntry *DocEntrySet::InsertEntryBinArea(uint8_t *binArea, int lgth, uint16_t group, uint16_t elem, - TagName const &vr ) + VRKey const &vr ) { DataEntry *dataEntry = 0; DocEntry *currentEntry = GetDocEntry( group, elem ); @@ -366,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 @@ -435,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 @@ -464,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, - TagName const &vr) + 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"); @@ -486,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"); @@ -501,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, - TagName const &vr, - TagName const &vm, - TagName const &name ) -{ - return Global::GetDicts()->NewVirtualDictEntry(group,elem,vr,vm,name); -} - //----------------------------------------------------------------------------- // Protected /** @@ -527,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) { @@ -538,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; } @@ -551,23 +515,26 @@ 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, - TagName const &vr) + VRKey const &vr) { DictEntry *dictEntry = GetDictEntry(group,elem); DictEntry *goodEntry = dictEntry; - std::string goodVR = vr; + VRKey goodVR = vr; - if (elem == 0x0000) goodVR="UL"; + if (elem == 0x0000) + goodVR="UL"; if ( goodEntry ) { if ( goodVR != goodEntry->GetVR() - && goodVR != GDCM_UNKNOWN ) + && goodVR != GDCM_VRUNKNOWN ) { goodEntry = NULL; } + dictEntry->Unregister(); } // Create a new virtual DictEntry if necessary @@ -575,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; }