From: regrain Date: Thu, 6 Jan 2005 15:36:48 +0000 (+0000) Subject: * src/gdcmDocEntrySet.[h|cxx], gdcmDocument.[h|cxx] : amelioration of X-Git-Tag: Version1.0.bp~471 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=4beda181275414e5cba990113f8d16424b2c09e6;p=gdcm.git * src/gdcmDocEntrySet.[h|cxx], gdcmDocument.[h|cxx] : amelioration of ValEntry, BinEntry, SeqEntry creation or replace -- BeNours --- diff --git a/ChangeLog b/ChangeLog index 363d3a26..3bf56a4d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2005-01-06 Benoit Regrain + * src/gdcmDocEntrySet.[h|cxx], gdcmDocument.[h|cxx] : amelioration of + ValEntry, BinEntry, SeqEntry creation or replace + 2005-01-06 Benoit Regrain * src/gdcmDictEntry.h : now, the IsVRUnknown is correct * src/gdcmDocument.[h|cxx] : simplify the search of VR value when parsing diff --git a/src/gdcmDocEntrySet.cxx b/src/gdcmDocEntrySet.cxx index b73bb8f1..a2bffcc8 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/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 @@ -27,97 +27,13 @@ #include "gdcmValEntry.h" #include "gdcmBinEntry.h" +#include + 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 diff --git a/src/gdcmDocEntrySet.h b/src/gdcmDocEntrySet.h index 0cf434ff..caa23e4b 100644 --- a/src/gdcmDocEntrySet.h +++ b/src/gdcmDocEntrySet.h @@ -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 diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 2cc0770d..0d865c24 100644 --- a/src/gdcmDocument.cxx +++ b/src/gdcmDocument.cxx @@ -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(currentEntry) ) + if ( ValEntry* entry = dynamic_cast(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(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 diff --git a/src/gdcmDocument.h b/src/gdcmDocument.h index 4bbc2668..6b3a7bbc 100644 --- a/src/gdcmDocument.h +++ b/src/gdcmDocument.h @@ -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, diff --git a/src/gdcmHeader.cxx b/src/gdcmHeader.cxx index 2aedf3cd..bc28cd19 100644 --- a/src/gdcmHeader.cxx +++ b/src/gdcmHeader.cxx @@ -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 ); } - } /**