-// gdcmObject.cxx
-//-----------------------------------------------------------------------------
+/*=========================================================================
+
+ Program: gdcm
+ Module: $RCSfile: gdcmObject.cxx,v $
+ Language: C++
+ Date: $Date: 2004/08/01 00:59:21 $
+ Version: $Revision: 1.24 $
+
+ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
+ l'Image). All rights reserved. See Doc/License.txt or
+ http://www.creatis.insa-lyon.fr/Public/Gdcm/License.htm for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notices for more information.
+
+=========================================================================*/
+
#include "gdcmObject.h"
-#include "gdcmUtil.h"
+#include "gdcmGlobal.h"
+#include "gdcmDebug.h"
+#include "gdcmValEntry.h"
//-----------------------------------------------------------------------------
-// Constructor / Destructor
-gdcmObject::gdcmObject(ListTag::iterator begin,ListTag::iterator end)
+/**
+ * \ingroup gdcmObject
+ * \brief Constructor
+ *
+ * @param ptagHT pointer to the HTable (gdcmObject needs it
+ * to build the gdcmDocEntries)
+ * @param depth Sequence depth level
+ */
+
+gdcmObject::gdcmObject(TagDocEntryHT *ptagHT, int depth)
+ : gdcmSQItem (depth)
{
- beginObj=begin;
- endObj=end;
-
- if(beginObj==endObj)
- dbg.Verbose(0, "gdcmObject::gdcmObject empty list");
+ PtagHT = ptagHT;
}
-gdcmObject::~gdcmObject(void)
-{
-}
-//-----------------------------------------------------------------------------
-// Print
-void gdcmObject::Print(std::ostream &os)
+/**
+ * \ingroup gdcmObject
+ * \brief Canonical destructor.
+ */
+gdcmObject::~gdcmObject()
{
- for(ListTag::iterator i=beginObj;i!=endObj;++i)
- {
- (*i)->SetPrintLevel(printLevel);
- (*i)->Print(os);
- }
}
+
+
//-----------------------------------------------------------------------------
// Public
-std::string gdcmObject::GetEntryByNumber(guint16 group, guint16 element)
-{
- for(ListTag::iterator i=beginObj;i!=endObj;++i)
- {
- if ( (*i)->GetGroup()==group && (*i)->GetElement()==element)
- return (*i)->GetValue();
- }
-
- return GDCM_UNFOUND;
-}
-std::string gdcmObject::GetEntryByName(TagName name)
+/**
+ * \ingroup gdcmObject
+ * \brief Builds a hash table (multimap) containing
+ * pointers to all Header Entries (i.e Dicom Element)
+ * related to this 'object'
+ * @return
+ */
+TagDocEntryHT gdcmObject::GetEntry()
{
- gdcmDict *PubDict=gdcmGlobal::GetDicts()->GetDefaultPubDict();
- gdcmDictEntry *dictEntry = (*PubDict).GetDictEntryByName(name);
-
- if( dictEntry == NULL)
- return GDCM_UNFOUND;
- return GetEntryByNumber(dictEntry->GetGroup(),dictEntry->GetElement());
+ TagDocEntryHT HT;
+ docEntries=GetDocEntries();
+ for(ListDocEntry::iterator i = docEntries.begin();
+ i != docEntries.end(); ++i)
+ {
+ HT[(*i)->GetKey()]=*i;
+ }
+ return HT;
}
//-----------------------------------------------------------------------------
// Protected
+/**
+ * \brief add the 'Object' related Dicom Elements to the listEntries
+ * of a partially created DICOMDIR
+ */
+void gdcmObject::FillObject(std::list<gdcmElement> elemList)
+{
+ // FillObject rempli le SQItem qui sera accroche au bon endroit
-//-----------------------------------------------------------------------------
-// Private
+ std::list<gdcmElement>::iterator it;
+ uint16_t tmpGr,tmpEl;
+ gdcmDictEntry *dictEntry;
+ gdcmValEntry *entry;
+
+ // for all the Elements found in they own part of the DicomDir dict.
+ for(it = elemList.begin(); it != elemList.end(); ++it)
+ {
+ tmpGr = it->group;
+ tmpEl = it->elem;
+ dictEntry = gdcmGlobal::GetDicts()->GetDefaultPubDict()->GetDictEntryByNumber(tmpGr,tmpEl);
+ entry = new gdcmValEntry(dictEntry);
+ entry->SetOffset(0); // just to avoid further missprinting
+ entry->SetValue(it->value);
-//-----------------------------------------------------------------------------
+ // dealing with value length ...
+
+ if(dictEntry->GetGroup()==0xfffe)
+ {
+ entry->SetLength(entry->GetValue().length());
+ }
+ else if( dictEntry->GetVR() == "UL" || dictEntry->GetVR() == "SL" )
+ {
+ entry->SetLength(4);
+ }
+ else if( dictEntry->GetVR() == "US" || dictEntry->GetVR() == "SS" )
+ {
+ entry->SetLength(2);
+ }
+ else if( dictEntry->GetVR() == "SQ" )
+ {
+ entry->SetLength(0xffffffff);
+ }
+ else
+ {
+ entry->SetLength(entry->GetValue().length());
+ }
+ AddDocEntry(entry);
+ }
+}