]> Creatis software - gdcm.git/blobdiff - src/gdcmObject.cxx
Comments added
[gdcm.git] / src / gdcmObject.cxx
index 3f4b5101f4dc8c0e1bfda7f83661756bfe8713ad..d4527bc1449dc9e5f58601fb2adc29a91e4cf5b7 100644 (file)
@@ -1,10 +1,10 @@
 // gdcmObject.cxx
 //-----------------------------------------------------------------------------
 #include "gdcmObject.h"
-#include "gdcmUtil.h"
+#include "gdcmGlobal.h"
+#include "gdcmDebug.h"
 
 //-----------------------------------------------------------------------------
-// Constructor / Destructor
 /**
  * \ingroup gdcmObject
  * \brief  Constructor 
@@ -44,11 +44,10 @@ gdcmObject::~gdcmObject(void) {
 void gdcmObject::Print(std::ostream &os) {
    if(printLevel>=0) {
       ListTag::iterator i;
-      //for(ListTag::iterator i=beginObj;i!=endObj;++i) // JPR
       for(i=beginObj;;++i) {
          (*i)->SetPrintLevel(printLevel);
          (*i)->Print(os);
-        if (i == endObj) break;
+         if (i == endObj) break;
       }
    }
 }
@@ -61,7 +60,6 @@ void gdcmObject::Print(std::ostream &os) {
  * @return
  */ 
 std::string gdcmObject::GetEntryByNumber(guint16 group, guint16 element) {
-   //for(ListTag::iterator i=beginObj;i!=endObj;++i) // JPR
    for(ListTag::iterator i=beginObj;;++i) {
       if ( (*i)->GetGroup()==group && (*i)->GetElement()==element)
          return (*i)->GetValue();
@@ -85,6 +83,37 @@ std::string gdcmObject::GetEntryByName(TagName name)  {
    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,
@@ -101,7 +130,6 @@ std::string gdcmObject::GetEntryByName(TagName name)  {
  bool gdcmObject::SetEntryByNumber(std::string val,guint16 group, 
                                                   guint16 element) {
 
-   gdcmHeaderEntry *a;
    for(ListTag::iterator i=beginObj;;++i) { 
       if ( (*i)->GetGroup() == 0xfffe && (*i)->GetElement() == 0xe000 ) 
          continue;
@@ -112,13 +140,15 @@ std::string gdcmObject::GetEntryByName(TagName name)  {
          gdcmHeaderEntry *Entry;
          TagKey key = gdcmDictEntry::TranslateToKey(group, element);
          if ( ! ptagHT->count(key)) {
-          // we assume the element is a belongs to a Public Group (not a shadow one)
           // we assume a Public Dictionnary *is* loaded
            gdcmDict *PubDict         = gdcmGlobal::GetDicts()->GetDefaultPubDict();
-           // we assume the invoqued (group,elem) exists
-          // inside the Public Dictionary
-           gdcmDictEntry *DictEntry  = PubDict->GetDictEntryByNumber(group, element); 
-           // we assume the constuctor didn't fail
+           // 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
@@ -150,7 +180,6 @@ std::string gdcmObject::GetEntryByName(TagName name)  {
  */ 
 TagHeaderEntryHT gdcmObject::GetEntry(void) {
    TagHeaderEntryHT HT;
-   //for(ListTag::iterator i=beginObj;i!=endObj;++i) // JPR
    for(ListTag::iterator i=beginObj;;++i) {
       HT.insert( PairHT( (*i)->GetKey(),(*i)) );
       if (i == endObj) break;      
@@ -167,7 +196,6 @@ TagHeaderEntryHT gdcmObject::GetEntry(void) {
  */ 
 ListTag gdcmObject::GetListEntry(void) {
    ListTag list;
-   //for(ListTag::iterator i=beginObj;i!=endObj;++i) // JPR
    for(ListTag::iterator i=beginObj;;++i) {
       list.push_back(*i);
       if (i == endObj) break;      
@@ -178,7 +206,7 @@ ListTag gdcmObject::GetListEntry(void) {
 
 //-----------------------------------------------------------------------------
 // Protected
-/*
+/**
  * \ingroup gdcmObject
  * \brief   add the 'Object' related Dicom Elements to the listEntries
  *          of a partially created DICOMDIR
@@ -199,7 +227,7 @@ void gdcmObject::FillObject(std::list<gdcmElement> elemList) {
       tmpEl=it->elem;
       dictEntry=gdcmGlobal::GetDicts()->GetDefaultPubDict()->GetDictEntryByNumber(tmpGr,tmpEl);
       entry=new gdcmHeaderEntry(dictEntry);
-      entry->SetOffset(0); // just to avoid missprinting //JPR
+      entry->SetOffset(0); // just to avoid further missprinting
       entry->SetValue(it->value);
 
       if(dictEntry->GetGroup()==0xfffe) 
@@ -223,7 +251,7 @@ void gdcmObject::FillObject(std::list<gdcmElement> elemList) {
             entry->SetLength(entry->GetValue().length());       
          }                                
       ptagHT->insert( PairHT(entry->GetKey(),entry) ); // add in the (multimap) H Table
-      plistEntries->insert(debInsertion ,entry);       // en tete de liste des Patients
+      plistEntries->insert(debInsertion ,entry);       // add at the begining of the Patient list
       ++finInsertion;                                     
    }