+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
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.
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
* @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.
* @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();
}
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
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
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
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
* \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;
}
* \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)
{
{
tmpArea = 0;
}
- if (!SetEntryByNumber(tmpArea, lgth, group, elem))
+ if (!SetEntry(tmpArea,lgth,binEntry))
{
if (tmpArea)
{
return binEntry;
}
-
/*
* \brief Modifies the value of a given Header Entry (Dicom Element)
* when it exists. Create it when unexistant.
*/
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;
}
/**
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);
}
/**
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
{
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
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
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);
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,
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
entry->SetDictEntry( newEntry );
}
-
}
/**