-gdcmDicomDirPatient * gdcmDicomDir::NewPatient(void) {
- std::list<gdcmElement> elemList;
- std::list<gdcmElement>::iterator it;
- guint16 tmpGr,tmpEl;
- gdcmDictEntry *dictEntry;
- gdcmHeaderEntry *entry;
-
- elemList=gdcmGlobal::GetDicomDirElements()->GetDicomDirPatientElements();
- std::list<gdcmHeaderEntry *>::iterator debInsertion, finInsertion, i,j;
-
-
- debInsertion = metaElems->fin();
- ++debInsertion;
- finInsertion=debInsertion;
-
- // for all the DicomDirPatient Elements
- for(it=elemList.begin();it!=elemList.end();++it)
- {
- tmpGr=it->group;
- tmpEl=it->elem;
- dictEntry=GetPubDict()->GetDictEntryByNumber(tmpGr,tmpEl);
- entry=new gdcmHeaderEntry(dictEntry);
- entry->SetOffset(0); // just to avoid missprinting
- entry->SetValue(it->value);
-
- if(dictEntry->GetGroup()==0xfffe)
- {
- entry->SetLength(entry->GetValue().length());
- }
- else if( (dictEntry->GetVR()=="UL") || (dictEntry->GetVR()=="SL") )
+
+DicomDirMeta * DicomDir::NewMeta()
+{
+ DicomDirMeta *m = new DicomDirMeta();
+
+ if ( TagHT.begin() != TagHT.end() ) // after Document Parsing
+ {
+ TagDocEntryHT::iterator lastOneButSequence = TagHT.end();
+ lastOneButSequence --;
+ // ALL the 'out of Sequence' Tags belong to Meta Elems
+ // (we skip 0004|1220 [Directory record sequence] )
+ for ( TagDocEntryHT::iterator cc = TagHT.begin();
+ cc != lastOneButSequence;
+ ++cc)
+ {
+ m->AddEntry( cc->second );
+ }
+ }
+ else // after root directory parsing
+ {
+ ListDicomDirMetaElem const &elemList =
+ Global::GetDicomDirElements()->GetDicomDirMetaElements();
+ m->FillObject(elemList);
+ }
+ m->SetSQItemNumber(0); // To avoid further missprinting
+ return m;
+}
+
+/**
+ * \brief adds a new Patient (with the basic elements) to a partially created DICOMDIR
+ */
+DicomDirPatient *DicomDir::NewPatient()
+{
+ ListDicomDirPatientElem::const_iterator it;
+ uint16_t tmpGr,tmpEl;
+ DictEntry *dictEntry;
+ ValEntry *entry;
+
+ ListDicomDirPatientElem const & elemList =
+ Global::GetDicomDirElements()->GetDicomDirPatientElements();
+ DicomDirPatient *p = new DicomDirPatient();
+
+ // for all the DicomDirPatient Elements
+ for( it = elemList.begin(); it != elemList.end(); ++it )
+ {
+ tmpGr = it->Group;
+ tmpEl = it->Elem;
+ dictEntry = GetPubDict()->GetDictEntry(tmpGr, tmpEl);
+ entry = new ValEntry( dictEntry );
+ entry->SetOffset(0); // just to avoid further missprinting
+ entry->SetValue( it->Value );
+
+ p->AddEntry( entry );
+ }
+
+ Patients.push_front( p );
+
+ return p;
+}
+
+/**
+ * \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; //FIXME this is going to be a by copy operation
+ 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();
+ if( !AddDicomDirImageToEnd(static_cast<DicomDirImage *>(si)) )