+ // get the current file characteristics
+ patCurName = (*it)->GetEntryValue(0x0010,0x0010);
+ patCurID = (*it)->GetEntryValue(0x0010,0x0011);
+ studCurInstanceUID = (*it)->GetEntryValue(0x0020,0x000d);
+ studCurID = (*it)->GetEntryValue(0x0020,0x0010);
+ serCurInstanceUID = (*it)->GetEntryValue(0x0020,0x000e);
+ serCurID = (*it)->GetEntryValue(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);
+ }
+
+ // 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 adds to the HTable
+ * the Entries (Dicom Elements) corresponding to the given type
+ * @param path full path file name (only used when type = GDCM_DICOMDIR_IMAGE
+ * @param type DicomDirObject type to create (GDCM_DICOMDIR_PATIENT,
+ * GDCM_DICOMDIR_STUDY, GDCM_DICOMDIR_SERIE ...)
+ * @param header Header of the current file
+ */
+void DicomDir::SetElement(std::string const &path, DicomDirType type,
+ Document *header)
+{
+ ListDicomDirElem elemList;
+ ListDicomDirElem::const_iterator it;
+ uint16_t tmpGr, tmpEl;
+ DictEntry *dictEntry;
+ ValEntry *entry;
+ std::string val;
+ SQItem *si;
+
+ switch( type )
+ {
+ case GDCM_DICOMDIR_IMAGE:
+ elemList = Global::GetDicomDirElements()->GetDicomDirImageElements();
+ si = new DicomDirImage(true);
+ if ( !AddImageToEnd(static_cast<DicomDirImage *>(si)) )
+ {
+ delete si;
+ gdcmErrorMacro( "Add ImageToEnd failed");
+ }
+ break;
+ case GDCM_DICOMDIR_SERIE:
+ elemList = Global::GetDicomDirElements()->GetDicomDirSerieElements();
+ si = new DicomDirSerie(true);
+ if ( !AddSerieToEnd(static_cast<DicomDirSerie *>(si)) )
+ {
+ delete si;
+ gdcmErrorMacro( "Add SerieToEnd failed");
+ }
+ break;
+ case GDCM_DICOMDIR_STUDY:
+ elemList = Global::GetDicomDirElements()->GetDicomDirStudyElements();
+ si = new DicomDirStudy(true);
+ if ( !AddStudyToEnd(static_cast<DicomDirStudy *>(si)) )
+ {
+ delete si;
+ gdcmErrorMacro( "Add StudyToEnd failed");
+ }
+ break;
+ case GDCM_DICOMDIR_PATIENT:
+ elemList = Global::GetDicomDirElements()->GetDicomDirPatientElements();
+ si = new DicomDirPatient(true);
+ if ( !AddPatientToEnd(static_cast<DicomDirPatient *>(si)) )
+ {
+ delete si;
+ gdcmErrorMacro( "Add PatientToEnd failed");
+ }
+ break;
+ case GDCM_DICOMDIR_META:
+ elemList = Global::GetDicomDirElements()->GetDicomDirMetaElements();
+ si = new DicomDirMeta(true);
+ if ( MetaElems )
+ {
+ delete MetaElems;
+ gdcmErrorMacro( "MetaElements already exist, they will be destroyed");
+ }
+ MetaElems = static_cast<DicomDirMeta *>(si);
+ break;
+ default:
+ return;
+ }
+ // removed all the seems-to-be-useless stuff about Referenced Image Sequence
+ // to avoid further troubles
+ // imageElem 0008 1140 "" // Referenced Image Sequence
+ // imageElem fffe e000 "" // 'no length' item : length to be set to 0xffffffff later
+ // imageElem 0008 1150 "" // Referenced SOP Class UID : to be set/forged later
+ // imageElem 0008 1155 "" // Referenced SOP Instance UID : to be set/forged later
+ // imageElem fffe e00d "" // Item delimitation : length to be set to ZERO later
+
+ // FIXME : troubles found when it's a SeqEntry
+
+ // for all the relevant elements found in their own spot of the DicomDir.dic
+ for( it = elemList.begin(); it != elemList.end(); ++it)
+ {
+ tmpGr = it->Group;
+ tmpEl = it->Elem;
+ dictEntry = GetPubDict()->GetEntry(tmpGr, tmpEl);
+
+ entry = new ValEntry( dictEntry ); // Be sure it's never a BinEntry !
+
+ entry->SetOffset(0); // just to avoid further missprinting