+/**
+ * \brief for each Header of the chained list, add/update the Patient/Study/Serie/Image info
+ * @param path path of the root directory
+ * @param list chained list of Headers
+ */
+void DicomDir::SetElements(std::string const & path, VectDocument const &list)
+{
+ TagHT.clear();
+ Patients.clear();
+
+ std::string patPrevName = "", patPrevID = "";
+ std::string studPrevInstanceUID = "", studPrevID = "";
+ std::string serPrevInstanceUID = "", serPrevID = "";
+
+ std::string patCurName, patCurID;
+ std::string studCurInstanceUID, studCurID;
+ std::string serCurInstanceUID, serCurID;
+
+ bool first = true;
+ for( VectDocument::const_iterator it = list.begin();
+ it != list.end(); ++it )
+ {
+ // get the current file characteristics
+ patCurName = (*it)->GetEntry(0x0010,0x0010);
+ patCurID = (*it)->GetEntry(0x0010,0x0011);
+ studCurInstanceUID = (*it)->GetEntry(0x0020,0x000d);
+ studCurID = (*it)->GetEntry(0x0020,0x0010);
+ serCurInstanceUID = (*it)->GetEntry(0x0020,0x000e);
+ serCurID = (*it)->GetEntry(0x0020,0x0011);
+
+ if( patCurName != patPrevName || patCurID != patPrevID || first )
+ {
+ SetElement(path, GDCM_DICOMDIR_PATIENT, *it);
+ first = true;
+ }
+
+ // if new Study Deal with 'STUDY' Elements
+ if( studCurInstanceUID != studPrevInstanceUID || studCurID != studPrevID
+ || first )
+ {
+ SetElement(path, GDCM_DICOMDIR_STUDY, *it);
+ first = true;
+ }
+
+ // if new Serie Deal with 'SERIE' Elements
+ if( serCurInstanceUID != serPrevInstanceUID || serCurID != serPrevID
+ || first )
+ {
+ SetElement(path, GDCM_DICOMDIR_SERIE, *it);
+ first = true;
+ }
+
+ // Always Deal with 'IMAGE' Elements
+ SetElement(path, GDCM_DICOMDIR_IMAGE, *it);
+
+ patPrevName = patCurName;
+ patPrevID = patCurID;
+ studPrevInstanceUID = studCurInstanceUID;
+ studPrevID = studCurID;
+ serPrevInstanceUID = serCurInstanceUID;
+ serPrevID = serCurID;
+ first = false;
+ }
+}
+
+/**
+ * \brief Move the content of the src SQItem to the dst SQItem
+ * Only DocEntry's are moved
+ *
+ */
+void DicomDir::MoveSQItem(SQItem *dst,SQItem *src)
+{
+ DocEntry *entry;
+
+ src->Initialize();
+ entry = src->GetNextEntry();
+ while(entry)
+ {
+ src->RemoveEntryNoDestroy(entry);
+ dst->AddEntry(entry);
+
+ src->Initialize();
+ entry = src->GetNextEntry();
+ }
+}
+
+/**
+ * \brief compares two dgcmHeaders
+ */
+bool DicomDir::HeaderLessThan(Document *header1, Document *header2)
+{
+ return *header1 < *header2;
+}
+
+
+/**
+ * \brief Get the first entry while visiting the DicomDirPatients
+ * \return The next DicomDirPatient if found, otherwhise NULL
+ */
+DicomDirPatient *DicomDir::GetFirstEntry()
+{
+ ItDicomDirPatient = Patients.begin();
+ if ( ItDicomDirPatient != Patients.end() )
+ return *ItDicomDirPatient;
+ return NULL;
+}
+
+/**
+ * \brief Get the next entry while visiting the DicomDirPatients
+ * \note : meaningfull only if GetFirstEntry already called
+ * \return The next DicomDirPatient if found, otherwhise NULL
+ */
+DicomDirPatient *DicomDir::GetNextEntry()
+{
+ gdcmAssertMacro (ItDicomDirPatient != Patients.end());
+ {
+ ++ItDicomDirPatient;
+ if ( ItDicomDirPatient != Patients.end() )
+ return *ItDicomDirPatient;
+ }
+ return NULL;
+}
+
+
+} // end namespace gdcm
+