X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocEntrySet.cxx;h=5f31e20205cf00f95bce10d6e11d52bda420bb17;hb=1f9855840e616065eb9ef1b99f69680541b68aad;hp=0b4ff26d8456da0553535c17bd24f7cd6a48ce11;hpb=1d9ac5cec02b9daa18b16835882b531731b125ad;p=gdcm.git diff --git a/src/gdcmDocEntrySet.cxx b/src/gdcmDocEntrySet.cxx index 0b4ff26d..5f31e202 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 12:58:28 $ - Version: $Revision: 1.61 $ + Date: $Date: 2005/11/21 09:41:46 $ + Version: $Revision: 1.68 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -75,47 +75,11 @@ void *DocEntrySet::GetEntryBinArea(uint16_t group, uint16_t elem) } /** - * \brief Return the value of the DataEntry if it's "std::string representable" - * @param group Group number of the searched tag. - * @param elem Element number of the searched tag. - * @return Corresponding element value when it's "std::string representable" - * and the string GDCM_NOTASCII otherwise. - */ -std::string DocEntrySet::GetEntryForcedAsciiValue(uint16_t group, uint16_t elem) -{ - DocEntry *d = GetDocEntry(group,elem); - if ( !d ) - return GDCM_UNFOUND; - - DataEntry *de = dynamic_cast(d); - if ( de ) - { - if( de->IsNotLoaded() ) - return GDCM_NOTLOADED; - if( de->IsUnfound() ) - return GDCM_UNFOUND; - if( de->IsUnread() ) - return GDCM_UNREAD; - } - - if( Global::GetVR()->IsVROfStringRepresentable( de->GetVR() ) ) - return de->GetString(); - else - { - uint8_t *a = de->GetBinArea(); - if( Util::IsCleanArea(a, de->GetLength()) ) - return Util::CreateCleanString(a, de->GetLength()); - } - return GDCM_NOTASCII; -} - -/** - * \brief Searches within Header Entries (Dicom Elements) parsed with - * the public and private dictionaries + * \brief Searches within the DocEntrySet * for the value length of a given tag.. * @param group Group number of the searched tag. * @param elem Element number of the searched tag. - * @return Corresponding element length; -2 if not found + * @return Corresponding element length; -1 if not found */ int DocEntrySet::GetEntryLength(uint16_t group, uint16_t elem) { @@ -126,9 +90,8 @@ int DocEntrySet::GetEntryLength(uint16_t group, uint16_t elem) } /** - * \brief Same as \ref Document::GetDocEntry except it only - * returns a result when the corresponding entry is of type - * DataEntry. + * \brief Same as \ref Document::GetDocEntry except it returns a result + * only when the corresponding entry is of type DataEntry. * @param group Group number of the searched Dicom Element * @param elem Element number of the searched Dicom Element * @return When present, the corresponding DataEntry. @@ -143,9 +106,8 @@ DataEntry *DocEntrySet::GetDataEntry(uint16_t group, uint16_t elem) } /** - * \brief Same as \ref Document::GetDocEntry except it only - * returns a result when the corresponding entry is of type - * SeqEntry. + * \brief Same as \ref Document::GetDocEntry except it returns a result + * only when the corresponding entry is of type SeqEntry. * @param group Group number of the searched Dicom Element * @param elem Element number of the searched Dicom Element * @return When present, the corresponding SeqEntry. @@ -154,12 +116,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); } @@ -286,10 +244,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 +303,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 @@ -369,16 +327,15 @@ DataEntry *DocEntrySet::InsertEntryBinArea(uint8_t *binArea, int lgth, delete[] tmpArea; } } - return dataEntry; } /** - * \brief Modifies the value of a given Doc Entry (Dicom Element) - * when it exists. Creates it when unexistant. + * \brief Creates a new gdcm::SeqEntry and adds it to the current DocEntrySet. + * (remove any existing entry with same group,elem) * @param group Group number of the Entry * @param elem Element number of the Entry - * \return pointer to the modified/created SeqEntry (NULL when creation + * \return pointer to the created SeqEntry (NULL when creation * failed). */ SeqEntry *DocEntrySet::InsertSeqEntry(uint16_t group, uint16_t elem) @@ -400,8 +357,8 @@ SeqEntry *DocEntrySet::InsertSeqEntry(uint16_t group, uint16_t elem) { if (!RemoveEntry(currentEntry)) { - gdcmWarningMacro( "Removal of previous DocEntry failed."); - + gdcmWarningMacro( "Removal of previous DocEntry failed for (" + <Delete(); return NULL; } + seqEntry->Delete(); } - - // TODO : Find a trick to insert a SequenceDelimitationItem - // in the SeqEntry, at the end. + // Remark : + // SequenceDelimitationItem will be added at the end of the SeqEntry, + // at write time return seqEntry; } /** - * \brief Checks if a given Dicom Element exists within the H table + * \brief Checks if a given Dicom Element exists within the DocEntrySet * @param group Group number of the searched Dicom Element * @param elem Element number of the searched Dicom Element * @return true is found @@ -437,65 +395,53 @@ bool DocEntrySet::CheckIfEntryExist(uint16_t group, uint16_t elem ) } /** - * \brief Build a new Val Entry from all the low level arguments. + * \brief Build a new DataEntry 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 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"); + gdcmWarningMacro( "Failed to allocate DataEntry for (" + <Unregister(); // GetDictEntry register it if (!newEntry) { - gdcmWarningMacro( "Failed to allocate SeqEntry"); + gdcmWarningMacro( "Failed to allocate SeqEntry for (" + <NewVirtualDictEntry(group,elem,vr,vm,name); -} - //----------------------------------------------------------------------------- // Protected /** @@ -506,6 +452,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 +464,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 +479,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) @@ -537,31 +487,47 @@ DictEntry *DocEntrySet::GetDictEntry(uint16_t group, uint16_t elem, DictEntry *dictEntry = GetDictEntry(group,elem); DictEntry *goodEntry = dictEntry; VRKey goodVR = vr; - - if (elem == 0x0000) goodVR="UL"; + TagName vm; + if (elem == 0x0000) + goodVR="UL"; if ( goodEntry ) { if ( goodVR != goodEntry->GetVR() && goodVR != GDCM_VRUNKNOWN ) - { + { + gdcmWarningMacro("For (" << std::hex << group << "|" + << elem << "), found VR : [" << vr << "]" + << " expected: [" << goodEntry->GetVR() << "]" ) ; + // avoid confusing further validator with "FIXME" VM + // when possible + vm = dictEntry->GetVM(); goodEntry = NULL; } + dictEntry->Unregister(); + } + else + { + vm = "FIXME"; } - // Create a new virtual DictEntry if necessary if (!goodEntry) { if (dictEntry) { - goodEntry = NewVirtualDictEntry(group, elem, goodVR, "FIXME", - dictEntry->GetName() ); + + goodEntry = DictEntry::New(group, elem, goodVR, vm,//"FIXME", + dictEntry->GetName() ); } else { - goodEntry = NewVirtualDictEntry(group, elem, goodVR); + goodEntry = DictEntry::New(group, elem, goodVR); } } + else + { + goodEntry->Register(); + } return goodEntry; }