-// gdcmDicomDir.cxx
-//-----------------------------------------------------------------------------
+/*=========================================================================
+
+ Program: gdcm
+ Module: $RCSfile: gdcmDicomDir.cxx,v $
+ Language: C++
+ Date: $Date: 2004/06/28 09:30:58 $
+ Version: $Revision: 1.53 $
+
+ 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 <string>
#include <algorithm>
#include <sys/types.h>
#include "gdcmDebug.h"
#include "gdcmGlobal.h"
#include "gdcmHeader.h"
-
#include "gdcmSeqEntry.h"
#include "gdcmSQItem.h"
#include "gdcmValEntry.h"
// For full DICOMDIR description, see:
// PS 3.3-2003, pages 731-750
//-----------------------------------------------------------------------------
+// Constructor / Destructor
+void gdcmDicomDir::Initialize(void)
+{
+ startMethod = NULL;
+ progressMethod = NULL;
+ endMethod = NULL;
+ startMethodArgDelete = NULL;
+ progressMethodArgDelete = NULL;
+ endMethodArgDelete = NULL;
+ startArg = NULL;
+ progressArg = NULL;
+ endArg = NULL;
+
+ progress = 0.0;
+ abort = false;
+
+ metaElems = (gdcmDicomDirMeta *)0;
+}
-// Constructor / Destructor
/**
* \brief Constructor Parses recursively the directory and creates the DicomDir
bool exception_on_error):
gdcmDocument(FileName,exception_on_error,true) // true : enable SeQuences
{
- // que l'on ai passe un root directory ou un DICOMDIR
- // et quelle que soit la valeur de parseDir,
- // on a lance gdcmDocument
-
- startMethod= NULL;
- progressMethod= NULL;
- endMethod= NULL;
- startMethodArgDelete= NULL;
- progressMethodArgDelete=NULL;
- endMethodArgDelete= NULL;
- startArg= NULL;
- progressArg= NULL;
- endArg= NULL;
-
- progress=0.0;
- abort=false;
-
- metaElems=NULL;
+ // que l'on ai passe un root directory ou un DICOMDIR
+ // et quelle que soit la valeur de parseDir,
+ // on a lance gdcmDocument
+ Initialize();
-// gdcmDocument already executed
-// if user passed a root directory, sure we didn't get anything
+ // gdcmDocument already executed
+ // if user passed a root directory, sure we didn't get anything
- if( GetEntry().begin()==GetEntry().end() )
+ if( GetEntry().begin() == GetEntry().end() )
{
- // if parseDir == false, it should be tagged as an error
dbg.Verbose(0, "gdcmDicomDir::gdcmDicomDir : entry HT empty");
if(strlen(FileName)==1 && FileName[0]=='.') { // user passed '.' as Name
dbg.Verbose(0, "gdcmDicomDir::gdcmDicomDir : Parse directory"
" and create the DicomDir");
ParseDirectory();
+ } else {
+ /// \todo if parseDir == false, it should be tagged as an error
}
}
- else {
- gdcmDocEntry *e = GetDocEntryByNumber(0x0004, 0x1220); // Directory record sequence
+ else
+ {
+ // Directory record sequence
+ gdcmDocEntry *e = GetDocEntryByNumber(0x0004, 0x1220);
if (e==NULL) {
- dbg.Verbose(0, "gdcmDicomDir::gdcmDicomDir : NO Directory record sequence (0x0004,0x1220)"
- );
- // FIXME : what to do when the parsed file IS NOT a DICOMDIR file ?
+ dbg.Verbose(0, "gdcmDicomDir::gdcmDicomDir : NO Directory record"
+ " sequence (0x0004,0x1220)");
+ /// \todo FIXME : what to do when the parsed file IS NOT a
+ /// DICOMDIR file ?
}
CreateDicomDir();
}
gdcmDicomDir::gdcmDicomDir(bool exception_on_error):
gdcmDocument(exception_on_error)
{
- startMethod= NULL;
- progressMethod= NULL;
- endMethod= NULL;
- startMethodArgDelete= NULL;
- progressMethodArgDelete=NULL;
- endMethodArgDelete= NULL;
- startArg= NULL;
- progressArg= NULL;
- endArg= NULL;
- progress=0.0;
- abort=false;
- std::string pathBidon = ""; // Sorry, NULL not allowed ...
+
+ Initialize();
+
+ std::string pathBidon = "Bidon"; // Sorry, NULL not allowed ...
SetElement(pathBidon, GDCM_DICOMDIR_META, NULL); // Set the META elements
AddDicomDirMeta();
}
-
/**
- * \ingroup gdcmDicomDir
* \brief Canonical destructor
*/
gdcmDicomDir::~gdcmDicomDir()
if(metaElems)
delete metaElems;
- for(ListDicomDirPatient::iterator cc=patients.begin();cc!=patients.end();++cc)
+ for(ListDicomDirPatient::iterator cc = patients.begin();
+ cc!= patients.end();
+ ++cc)
{
delete *cc;
}
//-----------------------------------------------------------------------------
// Print
/**
- * \ingroup gdcmDicomDir
* \brief Canonical Printer
*/
void gdcmDicomDir::Print(std::ostream &os)
metaElems->SetPrintLevel(printLevel);
metaElems->Print(os);
}
- for(ListDicomDirPatient::iterator cc=patients.begin();cc!=patients.end();++cc)
+ for(ListDicomDirPatient::iterator cc = patients.begin();
+ cc != patients.end();
+ ++cc)
{
(*cc)->SetPrintLevel(printLevel);
(*cc)->Print(os);
//-----------------------------------------------------------------------------
// Public
/**
- * \ingroup gdcmDicomDir
* \brief This predicate, based on hopefully reasonable heuristics,
* decides whether or not the current header was properly parsed
* and contains the mandatory information for being considered as
* @param _fp already open file pointer
*/
-void gdcmDicomDir::WriteEntries(FILE *_fp)
+void gdcmDicomDir::WriteEntries(FILE *) //_fp
{
/// \todo (?) tester les echecs en ecriture
/// (apres chaque fwrite, dans le WriteEntry)
for(i=(*itPatient)->debut();i!=(*itPatient)->fin();++i) {
WriteEntry(*i,_fp, gdcmExplicitVR);
}
- itStudy = ((*itPatient)->GetDicomDirStudies()).begin();
- while (itStudy != (*itPatient)->GetDicomDirStudies().end() ) {
+ itStudy = ((*itPatient)->GetDicomDirStudies()).begin();
+ while (itStudy != (*itPatient)->GetDicomDirStudies().end() ) {
for(i=(*itStudy)->debut();i!=(*itStudy)->fin();++i) {
WriteEntry(*i,_fp, gdcmExplicitVR);
}
for(i=(*itImage)->debut();i!=(*itImage)->fin();++i) {
WriteEntry(*i,_fp, gdcmExplicitVR);
}
- ++itImage;
- }
- ++itSerie;
+ ++itImage;
+ }
+ ++itSerie;
}
- ++itStudy;
+ ++itStudy;
}
++itPatient;
}
void gdcmDicomDir::CreateDicomDirChainedList(std::string path)
{
CallStartMethod();
-
gdcmDirList fileList(path,1); // gets recursively the file list
unsigned int count=0;
VectDocument list;
it!=fileList.end();
++it)
{
+ std::cout << "nom fichier " << it->c_str() << std::endl; //JPR
+
progress=(float)(count+1)/(float)fileList.size();
CallProgressMethod();
if(abort)
- break;
+ break;
header=new gdcmHeader(it->c_str());
- if(header->IsReadable())
+ if(!header) {
+ std::cout << "echec new Header " << it->c_str() << std::endl; // JPR
+ }
+ if(header->IsReadable()) {
list.push_back(header); // adds the file header to the chained list
+ std::cout << "readable : " <<it->c_str() << std::endl;
+ }
else
delete header;
count++;
+
}
// sorts Patient/Study/Serie/
std::sort(list.begin(),list.end(),gdcmDicomDir::HeaderLessThan);
}
else
{
- entry->SetLength(entry->GetValue().length());
+ entry->SetLength(entry->GetValue().length());
}
s->AddDocEntry(entry);
}
return p;
}
-
/**
- * \ingroup gdcmDicomDir
* \brief adds to the HTable
* the gdcmEntries (Dicom Elements) corresponding to the given type
* @param path full path file name (only used when type = GDCM_DICOMDIR_IMAGE
- * @param type gdcmObject type to create (GDCM_DICOMDIR_PATIENT, GDCM_DICOMDIR_STUDY, GDCM_DICOMDIR_SERIE ...)
+ * @param type gdcmObject type to create (GDCM_DICOMDIR_PATIENT,
+ * GDCM_DICOMDIR_STUDY, GDCM_DICOMDIR_SERIE ...)
* @param header gdcmHeader of the current file
*/
void gdcmDicomDir::SetElement(std::string &path,gdcmDicomDirType type,
std::list<gdcmElement>::iterator it;
guint16 tmpGr, tmpEl;
gdcmDictEntry *dictEntry;
- gdcmDocEntry *entry;
+ gdcmValEntry *entry;
std::string val;
- switch(type)
- {
+ switch(type){
case GDCM_DICOMDIR_PATIENT:
elemList=gdcmGlobal::GetDicomDirElements()->GetDicomDirPatientElements();
break;
return;
}
- for(it=elemList.begin();it!=elemList.end();++it)
- {
+ for(it=elemList.begin();it!=elemList.end();++it) {
tmpGr=it->group;
tmpEl=it->elem;
dictEntry=GetPubDict()->GetDictEntryByNumber(tmpGr,tmpEl);
- entry=new gdcmDocEntry(dictEntry);
+ entry=new gdcmValEntry(dictEntry); // Be sure it's never a BinEntry !
+
entry->SetOffset(0); // just to avoid further missprinting
if(header)
if(val==GDCM_UNFOUND)
{
if((tmpGr==0x0004) &&(tmpEl==0x1130) ) // File-set ID
- {
- // force to the *end* File Name
- val=GetName(path);
+ {
+ // force to the *end* File Name
+ val=GetName(path);
}
else if( (tmpGr==0x0004) && (tmpEl==0x1500) ) // Only used for image
{
if(header->GetFileName().substr(0,path.length())!=path)
{
- dbg.Verbose(0, "gdcmDicomDir::SetElement : the base path of file name is incorrect");
+ dbg.Verbose(0, "gdcmDicomDir::SetElement : the base path"
+ " of file name is incorrect");
val=header->GetFileName();
}
- else {
+ else
+ {
val=&(header->GetFileName().c_str()[path.length()]);
- }
+ }
}
else
{
else
{
if (header->GetEntryLengthByNumber(tmpGr,tmpEl)== 0)
- val=it->value;
+ val=it->value;
}
- ((gdcmValEntry *)entry)->SetValue(val);
+ entry->SetValue(val);
if(dictEntry)
{
- if(dictEntry->GetGroup()==0xfffe)
- {
- entry->SetLength(((gdcmValEntry *)entry)->GetValue().length());
- }
- else if( (dictEntry->GetVR()=="UL") || (dictEntry->GetVR()=="SL") )
+ if(dictEntry->GetGroup()==0xfffe) {
+ entry->SetLength(entry->GetValue().length());
+ }
+ else if( (dictEntry->GetVR()=="UL") || (dictEntry->GetVR()=="SL") )
{
entry->SetLength(4);
}
- else if( (dictEntry->GetVR()=="US") || (dictEntry->GetVR()=="SS") )
+ else if( (dictEntry->GetVR()=="US") || (dictEntry->GetVR()=="SS") )
{
entry->SetLength(2);
}
- else if(dictEntry->GetVR()=="SQ")
+ else if(dictEntry->GetVR()=="SQ")
{
entry->SetLength(0xffffffff);
}
- else
+ else
{
- entry->SetLength(((gdcmValEntry *)entry)->GetValue().length());
+ entry->SetLength(entry->GetValue().length());
}
}
//AddDocEntry(entry); // both in H Table and in chained list
tagHT[entry->GetKey()] = entry; // FIXME : use a SEQUENCE !
}
}
+
/**
- * \ingroup gdcmDicomDir
* \brief CallStartMethod
*/
void gdcmDicomDir::CallStartMethod(void)
gdcmDicomDirType type=gdcmDicomDir::GDCM_DICOMDIR_META;
- gdcmDocEntry *e = GetDocEntryByNumber(0x0004, 0x1220); // Directory record sequence
- if (e==NULL) {
- dbg.Verbose(0, "gdcmDicomDir::gdcmDicomDir : NO Directory record sequence (0x0004,0x1220)"
- );
- // FIXME : what to do when the parsed file IS NOT a DICOMDIR file ?
+ // Directory record sequence
+ gdcmDocEntry *e = GetDocEntryByNumber(0x0004, 0x1220);
+ if (e==NULL)
+ {
+ dbg.Verbose(0, "gdcmDicomDir::gdcmDicomDir : NO Directory record"
+ " sequence (0x0004,0x1220)");
+ /// \todo FIXME: what to do when the parsed file IS NOT a DICOMDIR file ?
return;
}
- gdcmDicomDirMeta *m = new gdcmDicomDirMeta(&tagHT);
-
- gdcmSeqEntry *s = (gdcmSeqEntry *)e; // FIXME : It is allowed ???
+ gdcmSeqEntry* s = dynamic_cast<gdcmSeqEntry*>(e);
+ if (!s)
+ {
+ dbg.Verbose(0, "gdcmDicomDir::CreateDicomDir: no SeqEntry present");
+ return;
+ }
+
ListSQItem listItems = s->GetSQItems();
+ gdcmDicomDirMeta *m = new gdcmDicomDirMeta(&tagHT);
+ (void)m; //??
gdcmDocEntry * d;
+ std::string v;
for(ListSQItem::iterator i=listItems.begin(); i !=listItems.end();++i)
{
d=(*i)->GetDocEntryByNumber(0x0004, 0x1430); // Directory Record Type
- std::string v=((gdcmValEntry *)d)->GetValue();
-
+ if (gdcmValEntry* ValEntry = dynamic_cast< gdcmValEntry* >(d) )
+ {
+ v = ValEntry->GetValue();
+ }
+ else
+ {
+ dbg.Verbose(0, "gdcmDicomDir::CreateDicomDir: not a ValEntry.");
+ continue;
+ }
+
if(v=="PATIENT ")
{
AddDicomDirPatientToEnd(*i);
//AddObjectToEnd(type,*i);
type=gdcmDicomDir::GDCM_DICOMDIR_PATIENT;
- }
+ }
else if(v=="STUDY ")
{
}
else
- continue ; // It was 'non PATIENT', 'non STUDY', 'non SERIE', 'non IMAGE' SQItem
+ // It was not a 'PATIENT', nor a 'STUDY', nor a 'SERIE',
+ // neither an 'IMAGE' SQItem. Skip to next item.
+ continue;
}
}
/**
AddDicomDirImageToEnd(s);
break;
case gdcmDicomDir::GDCM_DICOMDIR_NONE:
- AddDicomDirImageToEnd(s); //FIXME
+ AddDicomDirImageToEnd(s); //FIXME
break;
}
}
}
}
//bool res=SetEntryLengthByNumber(offset, 0x0004, 0x1220); // Hope there is no dupps.
- SetEntryLengthByNumber(offset, 0x0004, 0x1220); // Hope there is no dupps.
+ SetEntryLengthByNumber(offset, 0x0004, 0x1220); // Hope there is no dupps.
return;
*/
}