]> Creatis software - gdcm.git/blobdiff - src/gdcmObject.cxx
* Test/PrintAllDocument.cxx: looping on files is now effective. It used to
[gdcm.git] / src / gdcmObject.cxx
index d4527bc1449dc9e5f58601fb2adc29a91e4cf5b7..73172ae2238d9cb8880422cb309345e3696fe576 100644 (file)
@@ -1,32 +1,42 @@
-// gdcmObject.cxx
-//-----------------------------------------------------------------------------
+/*=========================================================================
+                                                                                
+  Program:   gdcm
+  Module:    $RCSfile: gdcmObject.cxx,v $
+  Language:  C++
+  Date:      $Date: 2004/06/20 18:08:48 $
+  Version:   $Revision: 1.20 $
+                                                                                
+  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 "gdcmGlobal.h"
 #include "gdcmDebug.h"
+#include "gdcmValEntry.h"
 
 //-----------------------------------------------------------------------------
 /**
  * \ingroup gdcmObject
  * \brief  Constructor 
- * @param  begin  iterator on the first Header Entry (i.e Dicom Element)
- *                related to this 'Object'
- * @param  end  iterator on the last Header Entry 
- *              (i.e Dicom Element) related to this 'Object'             
+ *          
  * @param ptagHT pointer to the HTable (gdcmObject needs it 
- *               to build the gdcmHeaderEntries)
- * @param plistEntries pointer to the chained List (gdcmObject needs it 
- *               to build the gdcmHeaderEntries)
+ *               to build the gdcmDocEntries)
+ * @param depth Seaquence depth level
  */
-gdcmObject::gdcmObject(ListTag::iterator begin, ListTag::iterator end,
-              TagHeaderEntryHT *ptagHT, ListTag *plistEntries) {
-   beginObj = begin;
-   endObj   = end;
+  
+gdcmObject::gdcmObject(TagDocEntryHT *ptagHT, int depth) 
+          : gdcmSQItem (depth) {
    this->ptagHT = ptagHT;
-   this->plistEntries = plistEntries;
-   if(begin==end)
-      dbg.Verbose(0, "gdcmObject::gdcmObject empty list");
 }
 
+
 /**
  * \ingroup gdcmObject
  * \brief   Canonical destructor.
@@ -34,143 +44,12 @@ gdcmObject::gdcmObject(ListTag::iterator begin, ListTag::iterator end,
 gdcmObject::~gdcmObject(void) {
 }
 
-//-----------------------------------------------------------------------------
-// Print
-/**
- * \ingroup gdcmObject
- * \brief   Prints the Object
- * @return
- */ 
-void gdcmObject::Print(std::ostream &os) {
-   if(printLevel>=0) {
-      ListTag::iterator i;
-      for(i=beginObj;;++i) {
-         (*i)->SetPrintLevel(printLevel);
-         (*i)->Print(os);
-         if (i == endObj) break;
-      }
-   }
-}
+
 
 //-----------------------------------------------------------------------------
 // Public
-/**
- * \ingroup gdcmObject
- * \brief   Get the value of an Header Entries (i.e Dicom Element) by number
- * @return
- */ 
-std::string gdcmObject::GetEntryByNumber(guint16 group, guint16 element) {
-   for(ListTag::iterator i=beginObj;;++i) {
-      if ( (*i)->GetGroup()==group && (*i)->GetElement()==element)
-         return (*i)->GetValue();
-      if (i == endObj) break;  
-   }   
-   return GDCM_UNFOUND;
-}
-
-/**
- * \ingroup gdcmObject
- * \brief   Get the value of an Header Entries (i.e Dicom Element) by name
- * @param   name : name of the searched element.
- * @return
- */ 
-std::string gdcmObject::GetEntryByName(TagName name)  {
-   gdcmDict *PubDict=gdcmGlobal::GetDicts()->GetDefaultPubDict();
-   gdcmDictEntry *dictEntry = (*PubDict).GetDictEntryByName(name); 
-
-   if( dictEntry == NULL)
-      return GDCM_UNFOUND;
-   return GetEntryByNumber(dictEntry->GetGroup(),dictEntry->GetElement()); 
-}
 
-/**
- * \ingroup gdcmObject
- * \brief   Set the 'boundaries' gdcmObject (gdcmDicomDirPatient,
- *          gdcmDicomDirStudy, gdcmDicomDirSerie, gdcmDicomDirImage)
- *          comming for the parsing of a DICOMDIR file
- * \warning NOT en user intended function
- * @param  flag = 0 when META to be dealt with
- */ 
-void gdcmObject::ResetBoundaries(int flag) {
-   
-   if (flag) { // it's NOT a META
-     // upwards to fffe,e000   
-      for( i=j=debut();
-          ((*i)->GetGroup() != 0xfffe)  && ((*i)->GetElement() != 0xe000);
-         --i,j--) {   
-      }
-      beginObj=j;
-   }
-         
-  // upwards again to fffe,e000   
-   if (fin()== (--(plistEntries->end())) )  // Don't try anything more when end 
-       return;                              // of Chained List is reached   
-                                           
-   for( i=j=fin();
-        ((*i)->GetGroup() != 0xfffe)  && ((*i)->GetElement() != 0xe000);
-       --i,j--) {          
-   }
-   j--;
-   endObj=j;    
-}
 
-/**
- * \ingroup gdcmParser
- * \brief   Sets Entry (Dicom Element) value of an element,
- *          specified by it's tag (Group, Number) 
- *          and the length, too ...
- *          If the Element is not found, it's just created !
- * \warning we suppose, right now, the element belongs to a Public Group
- *          (NOT a shadow one)       
- * @param   val string value to set
- * @param   group Group of the searched tag.
- * @param   element Element of the searched tag.
- * @return  true if element was found or created successfully
- */
- bool gdcmObject::SetEntryByNumber(std::string val,guint16 group, 
-                                                  guint16 element) {
-
-   for(ListTag::iterator i=beginObj;;++i) { 
-      if ( (*i)->GetGroup() == 0xfffe && (*i)->GetElement() == 0xe000 ) 
-         continue;
-      if ( group   < (*i)->GetGroup() || 
-           (group == (*i)->GetGroup() && element < (*i)->GetElement()) ){
-        // instead of ReplaceOrCreateByNumber 
-        // that is a method of gdcmParser :-( 
-         gdcmHeaderEntry *Entry;
-         TagKey key = gdcmDictEntry::TranslateToKey(group, element);
-         if ( ! ptagHT->count(key)) {
-          // we assume a Public Dictionnary *is* loaded
-           gdcmDict *PubDict         = gdcmGlobal::GetDicts()->GetDefaultPubDict();
-           // if the invoked (group,elem) doesn't exist inside the Dictionary
-          // we create a VirtualDictEntry
-           gdcmDictEntry *DictEntry  = PubDict->GetDictEntryByNumber(group, element);
-          if (DictEntry == NULL) {
-             DictEntry=gdcmGlobal::GetDicts()->NewVirtualDictEntry(group,element,"UN","??","??");
-          } 
-           // we assume the constructor didn't fail
-           Entry = new gdcmHeaderEntry(DictEntry);
-          // ----
-          // TODO
-          // ----
-          // better we don't assume too much !
-          // in the next release, gdcmObject will be used 
-          // to describe any Header Entry ...
-         } else {
-            Entry = ptagHT->find(key)->second;
-         }
-         Entry->SetValue(val); 
-         Entry->SetLength(val.length());
-         plistEntries->insert(i,Entry); 
-        return true;
-      }           
-      if (group == (*i)->GetGroup() && element == (*i)->GetElement() ) {
-         (*i)->SetValue(val);
-         (*i)->SetLength(val.length()); 
-         return true;    
-      }   
-   }                                               
-}
 /**
  * \ingroup gdcmObject
  * \brief   Builds a hash table (multimap) containing 
@@ -178,11 +57,11 @@ void gdcmObject::ResetBoundaries(int flag) {
  *          related to this 'object'
  * @return
  */ 
-TagHeaderEntryHT gdcmObject::GetEntry(void) {
-   TagHeaderEntryHT HT;
-   for(ListTag::iterator i=beginObj;;++i) {
-      HT.insert( PairHT( (*i)->GetKey(),(*i)) );
-      if (i == endObj) break;      
+TagDocEntryHT gdcmObject::GetEntry(void) {
+   TagDocEntryHT HT;
+   docEntries=GetDocEntries();   
+   for(ListDocEntry::iterator i=docEntries.begin();i!=docEntries.end();++i) {
+      HT[(*i)->GetKey()]=*i;
    }
    return(HT);
 }
@@ -193,16 +72,14 @@ TagHeaderEntryHT gdcmObject::GetEntry(void) {
  *          pointers to all Header Entries (i.e Dicom Element)
  *          related to this 'object'
  * @return
- */ 
+ */
+ // FIXME : what was it used for ?!?
+ /* 
 ListTag gdcmObject::GetListEntry(void) {
-   ListTag list;
-   for(ListTag::iterator i=beginObj;;++i) {
-      list.push_back(*i);
-      if (i == endObj) break;      
-   }
-   return(list);
+   return(GetDocEntries());
 }
-
+*/
 
 //-----------------------------------------------------------------------------
 // Protected
@@ -212,24 +89,28 @@ ListTag gdcmObject::GetListEntry(void) {
  *          of a partially created DICOMDIR
  */
 void gdcmObject::FillObject(std::list<gdcmElement> elemList) {
+
+  // FillObject rempli le SQItem qui sera accroche au bon endroit
+
    std::list<gdcmElement>::iterator it;
    guint16 tmpGr,tmpEl;
    gdcmDictEntry *dictEntry;
-   gdcmHeaderEntry *entry;
-      
-   debInsertion = this->fin(); 
-   ++debInsertion;
-   finInsertion=debInsertion;
+   gdcmValEntry *entry;
+   
+   //gdcmSQItem *s = new gdcmSQItem;
    
+   // 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 gdcmHeaderEntry(dictEntry);
+      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());       
@@ -248,17 +129,11 @@ void gdcmObject::FillObject(std::list<gdcmElement> elemList) {
          }
       else
          {
-            entry->SetLength(entry->GetValue().length());       
+            entry->SetLength(entry->GetValue().length()); 
          }                                
-      ptagHT->insert( PairHT(entry->GetKey(),entry) ); // add in the (multimap) H Table
-      plistEntries->insert(debInsertion ,entry);       // add at the begining of the Patient list
-      ++finInsertion;                                     
-   }
-     
-   i=fin();
-   i++;
-   j=debInsertion;
-   j--;
+      //docEntries->insert(debInsertion ,entry); // ??? // add at the begining of the Patient list
+      AddDocEntry(entry);                                         
+   }   
 }   
 //-----------------------------------------------------------------------------
 // Private