// gdcmDicomDir.cxx
//-----------------------------------------------------------------------------
-#include "gdcmDicomDir.h"
-#include "gdcmDicomDirStudy.h"
-#include "gdcmDicomDirSerie.h"
-#include "gdcmDicomDirImage.h"
-#include "gdcmDirList.h"
-#include "gdcmUtil.h"
-
#include <string>
#include <algorithm>
-
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
#endif
+#include "gdcmDicomDir.h"
+#include "gdcmDicomDirStudy.h"
+#include "gdcmDicomDirSerie.h"
+#include "gdcmDicomDirImage.h"
+#include "gdcmDirList.h"
+#include "gdcmUtil.h"
+#include "gdcmDebug.h"
+#include "gdcmGlobal.h"
+
//-----------------------------------------------------------------------------
// For full DICOMDIR description, see:
// PS 3.3-2003, pages 731-750
//-----------------------------------------------------------------------------
+
// Constructor / Destructor
-/*
- * \ingroup gdcmDicomDir
- * \brief Constructor : Parses recursively the directory and creates the DicomDir
- * \ or uses an already built DICOMDIR, depending on 'parseDir' value
- * @param Name name of the root directory (parseDir = true)
- * name of the DICOMDIR (parseDir = false)
- * @param parseDir - true if user passed an entry point
+/**
+ * \brief Constructor Parses recursively the directory and creates the DicomDir
+ * or uses an already built DICOMDIR, depending on 'parseDir' value.
+ * @param FileName name
+ * - of the root directory (parseDir = true)
+ * - of the DICOMDIR (parseDir = false)
+ * @param parseDir boolean
+ * - true if user passed an entry point
* and wants to explore recursively the directories
- * - false if user passed an already built DICOMDIR file
+ * - false if user passed an already built DICOMDIR file
* and wants to use it
- * @param exception_on_error whether we want to throw an exception or not
+ * @param exception_on_error whether we want to throw an exception or not
*/
-gdcmDicomDir::gdcmDicomDir(const char *Name, bool parseDir,
+gdcmDicomDir::gdcmDicomDir(const char *FileName, bool parseDir,
bool exception_on_error):
- gdcmParser(Name,exception_on_error,true) // true : enable SeQuences
+ gdcmParser(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,
// if parseDir == false, it should be tagged as an error
dbg.Verbose(0, "gdcmDicomDir::gdcmDicomDir : entry list empty");
- if(strlen(Name)==1 && Name[0]=='.') { // user passed '.' as Name
+ if(strlen(FileName)==1 && FileName[0]=='.') { // user passed '.' as Name
// we get current directory name
- char*dummy=(char*) malloc(1000);
-#ifdef _MSC_VER
- _getcwd(dummy,(size_t)1000);
-#else
- getcwd(dummy,(size_t)1000);
-#endif
+ char* dummy= new char[1000];
+ getcwd(dummy, (size_t)1000);
SetFileName(dummy); // will be converted into a string
- free(dummy); // no longer needed
+ delete[] dummy; // no longer needed
}
if(parseDir)
{
- dbg.Verbose(0, "gdcmDicomDir::gdcmDicomDir : Parse directory and create the DicomDir");
- ParseDirectory();
+ dbg.Verbose(0, "gdcmDicomDir::gdcmDicomDir : Parse directory"
+ " and create the DicomDir");
+ ParseDirectory();
}
}
else {
CreateDicomDir();
CheckBoundaries(); // to maintain consistency between
// home-made gdcmDicomDir
- // and the ones comming from a DICOMDIR file
+ // and the ones comming from a DICOMDIR file
}
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief Constructor : creates an empty gdcmDicomDir
* @param exception_on_error whether we want to throw an exception or not
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief Canonical destructor
*/
//-----------------------------------------------------------------------------
// Print
-/*
+/**
* \ingroup gdcmDicomDir
* \brief Canonical Printer
*/
//-----------------------------------------------------------------------------
// Public
-/*
+/**
* \ingroup gdcmDicomDir
* \brief This predicate, based on hopefully reasonable heuristics,
* decides whether or not the current header was properly parsed
return(true);
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief fills the whole structure, starting from a root Directory
*/
CreateDicomDir();
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief Set the start method to call when the parsing of the directory starts
* @param method Method to call
* @param arg Argument to pass to the method
+ * @param argDelete Argument
* \warning In python : the arg parameter isn't considered
*/
void gdcmDicomDir::SetStartMethod(gdcmMethod *method,void *arg,gdcmMethod *argDelete)
startMethodArgDelete=argDelete;
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief Set the method to delete the argument
* The argument is destroyed when the method is changed or when the
startMethodArgDelete=method;
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief Set the progress method to call when the parsing of the directory progress
* @param method Method to call
* @param arg Argument to pass to the method
+ * @param argDelete Argument
* \warning In python : the arg parameter isn't considered
*/
void gdcmDicomDir::SetProgressMethod(gdcmMethod *method,void *arg,gdcmMethod *argDelete)
progressMethodArgDelete=argDelete;
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief Set the method to delete the argument
* The argument is destroyed when the method is changed or when the
progressMethodArgDelete=method;
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief Set the end method to call when the parsing of the directory ends
* @param method Method to call
* @param arg Argument to pass to the method
+ * @param argDelete Argument
* \warning In python : the arg parameter isn't considered
*/
-void gdcmDicomDir::SetEndMethod(gdcmMethod *method,void *arg,gdcmMethod *argDelete)
+void gdcmDicomDir::SetEndMethod(gdcmMethod *method, void *arg, gdcmMethod *argDelete)
{
if((endArg)&&(endMethodArgDelete))
endMethodArgDelete(endArg);
endMethodArgDelete=argDelete;
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief Set the method to delete the argument
* The argument is destroyed when the method is changed or when the class
return(false);
}
- char * filePreamble;
- filePreamble=(char*)calloc(128,1);
+ char * filePreamble = new char[128];
fwrite(filePreamble,128,1,fp1);
fwrite("DICM",4,1,fp1);
- free(filePreamble);
+ delete[] filePreamble;
UpdateDirectoryRecordSequenceLength();
- WriteDicomDirEntries(fp1);
+ WriteEntries(fp1);
fclose(fp1);
return true;
}
/**
- * \ingroup gdcmParser
- * \brief writes on disc according to the DICOMDIR format
- * using the tree-like structure
+ * \brief Writes in a file using the tree-like structure.
* @param _fp already open file pointer
*/
-void gdcmDicomDir::WriteDicomDirEntries(FILE *_fp)
+void gdcmDicomDir::WriteEntries(FILE *_fp)
{
// TODO (?) tester les echecs en ecriture
// (apres chaque fwrite, dans le WriteEntry)
ptrMeta= GetDicomDirMeta();
for(i=ptrMeta->debut();i!=ptrMeta->fin();++i) {
- WriteEntry(*i,_fp,DICOMDIR);
+ WriteEntry(*i,_fp, ExplicitVR);
}
itPatient = GetDicomDirPatients().begin();
while ( itPatient != GetDicomDirPatients().end() ) {
for(i=(*itPatient)->debut();i!=(*itPatient)->fin();++i) {
- WriteEntry(*i,_fp,DICOMDIR);
+ WriteEntry(*i,_fp, ExplicitVR);
}
itStudy = ((*itPatient)->GetDicomDirStudies()).begin();
while (itStudy != (*itPatient)->GetDicomDirStudies().end() ) {
for(i=(*itStudy)->debut();i!=(*itStudy)->fin();++i) {
- WriteEntry(*i,_fp,DICOMDIR);
+ WriteEntry(*i,_fp, ExplicitVR);
}
itSerie = ((*itStudy)->GetDicomDirSeries()).begin();
while (itSerie != (*itStudy)->GetDicomDirSeries().end() ) {
for(i=(*itSerie)->debut();i!=(*itSerie)->fin();++i) {
- WriteEntry(*i,_fp,DICOMDIR);
+ WriteEntry(*i,_fp, ExplicitVR);
}
itImage = ((*itSerie)->GetDicomDirImages()).begin();
while (itImage != (*itSerie)->GetDicomDirImages().end() ) {
for(i=(*itImage)->debut();i!=(*itImage)->fin();++i) {
- WriteEntry(*i,_fp,DICOMDIR);
+ WriteEntry(*i,_fp, ExplicitVR);
}
++itImage;
}
//-----------------------------------------------------------------------------
// Protected
-/*
+/**
* \ingroup gdcmDicomDir
* \brief create a gdcmHeader-like chained list from a root Directory
* @param path entry point of the tree-like structure
CallEndMethod();
}
-
+/**
+ * \ingroup gdcmDicomDir
+ * \brief modifies the limits of a gdcmObject, created from a DICOMDIR file
+ */
void gdcmDicomDir::CheckBoundaries()
{
itImage = ((*itSerie)->GetDicomDirImages()).begin();
while (itImage != (*itSerie)->GetDicomDirImages().end() ) {
(*itImage)->ResetBoundaries(1);
- ++itImage;
- }
- ++itSerie;
- }
- ++itStudy;
- }
- ++itPatient;
+ ++itImage;
+ }
+ ++itSerie;
+ }
+ ++itStudy;
+ }
+ ++itPatient;
}
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief adds a new Patient to a partially created DICOMDIR
*/
entry->SetValue(it->value);
if(dictEntry->GetGroup()==0xfffe)
- {
- entry->SetLength(entry->GetValue().length());
- }
+ {
+ entry->SetLength(entry->GetValue().length());
+ }
else if( (dictEntry->GetVR()=="UL") || (dictEntry->GetVR()=="SL") )
{
entry->SetLength(4);
return p;
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief CallStartMethod
*/
if(startMethod)
startMethod(startArg);
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief CallProgressMethod
*/
if(progressMethod)
progressMethod(progressArg);
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief CallEndMethod
*/
//-----------------------------------------------------------------------------
// Private
-/*
+/**
* \ingroup gdcmDicomDir
* \brief create a 'gdcmDicomDir' from a DICOMDIR gdcmHeader
*/
if(begin!=end)
AddObjectToEnd(type,begin,--end2);
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief AddObjectToEnd
* @param type
- * @param begin
- * @param end
+ * @param begin iterator on the first HeaderEntry within the chained List
+ * @param end iterator on the last HeaderEntry within the chained List
*/
void gdcmDicomDir::AddObjectToEnd(gdcmDicomDirType type,ListTag::iterator begin,ListTag::iterator end)
{
case gdcmDicomDir::GDCM_DICOMDIR_IMAGE:
AddDicomDirImageToEnd(begin,end);
break;
+ case gdcmDicomDir::GDCM_DICOMDIR_NONE:
+ AddDicomDirImageToEnd(begin,end); //FIXME
+ break;
}
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief Well ... Not realy to end, there is only one occurence
- * @param begin
- * @param end
+ * @param begin iterator on the first HeaderEntry within the chained List
+ * @param end iterator on the last HeaderEntry within the chained List
*/
void gdcmDicomDir::AddDicomDirMetaToEnd(ListTag::iterator begin,ListTag::iterator end)
{
metaElems = new gdcmDicomDirMeta(begin,end,&tagHT,&listEntries);
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief AddDicomDirPatientToEnd
- * @param begin
- * @param end
+ * @param begin iterator on the first HeaderEntry within the chained List
+ * @param end iterator on the last HeaderEntry within the chained List
*/
void gdcmDicomDir::AddDicomDirPatientToEnd(ListTag::iterator begin,ListTag::iterator end)
{
patients.push_back(new gdcmDicomDirPatient(begin,end,&tagHT, &listEntries));
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief AddDicomDirStudyToEnd
- * @param begin
- * @param end
+ * @param begin iterator on the first HeaderEntry within the chained List
+ * @param end iterator on the last HeaderEntry within the chained List
*/
void gdcmDicomDir::AddDicomDirStudyToEnd(ListTag::iterator begin,ListTag::iterator end)
{
(*itp)->AddDicomDirStudy(new gdcmDicomDirStudy(begin,end,&tagHT, &listEntries));
}
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief AddDicomDirSerieToEnd
- * @param begin
- * @param end
+ * @param begin iterator on the first HeaderEntry within the chained List
+ * @param end iterator on the last HeaderEntry within the chained List
*/
void gdcmDicomDir::AddDicomDirSerieToEnd(ListTag::iterator begin,ListTag::iterator end)
{
}
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief AddDicomDirImageToEnd
- * @param begin
- * @param end
+ * @param begin iterator on the first HeaderEntry within the chained List
+ * @param end iterator on the last HeaderEntry within the chained List
*/
void gdcmDicomDir::AddDicomDirImageToEnd(ListTag::iterator begin,ListTag::iterator end)
{
}
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief for each Header of the chained list, add/update the Patient/Study/Serie/Image info
* @param path path of the root directory
}
}
-/*
+/**
* \ingroup gdcmDicomDir
* \brief adds to the HTable and at the end of the Chained List
* the gdcmEntries (Dicom Elements) corresponding to the given type
//wasUpdated = 1; // is private
}
}
-
+/**
+ * \ingroup gdcmDicomDir
+ * \brief compares two dgcmHeaders
+ */
bool gdcmDicomDir::HeaderLessThan(gdcmHeader *header1,gdcmHeader *header2)
{
return(*header1<*header2);
}
-
+/**
+ * \ingroup gdcmDicomDir
+ * \brief Sets the accurate value for the (0x0004,0x1220) element of a DICOMDIR
+ */
void gdcmDicomDir::UpdateDirectoryRecordSequenceLength() {
int offset = 0;
offset += 4; // delimiters don't have a value.
}
}
- bool res=SetEntryLengthByNumber(offset, 0x0004, 0x1220); // Hope there is no dupps.
+ //bool res=SetEntryLengthByNumber(offset, 0x0004, 0x1220); // Hope there is no dupps.
+ SetEntryLengthByNumber(offset, 0x0004, 0x1220); // Hope there is no dupps.
return;
}