]> Creatis software - gdcm.git/blob - src/gdcmDicomDir.h
Replace confusing names gdcmImage, etc by gdcmDicomDirImage etc, to avoid
[gdcm.git] / src / gdcmDicomDir.h
1 // gdcmDicomDir.h
2 //-----------------------------------------------------------------------------
3 #ifndef GDCMDICOMDIR_H
4 #define GDCMDICOMDIR_H
5
6 #include "gdcmHeader.h"
7 #include "gdcmCommon.h"
8 #include "gdcmDicomDirPatient.h"
9 #include "gdcmDicomDirMeta.h"
10 #include "gdcmDicomDirElement.h"
11
12 #include <list>
13 #include <vector>
14
15 //-----------------------------------------------------------------------------
16 typedef std::list<gdcmDicomDirPatient *>   ListDicomDirPatient;
17 typedef std::vector<gdcmHeader *>  ListHeader;
18
19 typedef GDCM_EXPORT void(gdcmMethod)(void * = NULL);
20 //-----------------------------------------------------------------------------
21 /*
22  * \defgroup gdcmDicomDir
23  * \brief    gdcmDicomDir defines an object representing a DICOMDIR in memory.
24  *
25  */
26 class GDCM_EXPORT gdcmDicomDir: public gdcmParser
27 {
28 public:
29 //   gdcmDicomDir(ListTag *l,
30 //                bool exception_on_error = false);
31    gdcmDicomDir(const char *FileName, 
32                 bool parseDir = false,
33                 bool exception_on_error = false);
34    
35    ~gdcmDicomDir(void);
36
37    void SetPrintLevel(int level) { printLevel = level; };
38    virtual void Print(std::ostream &os = std::cout);
39
40 // Informations contained in the parser
41    virtual bool IsReadable(void);
42    inline gdcmDicomDirMeta   *GetDicomDirMeta()      {return metaElems;};
43    inline ListDicomDirPatient &GetDicomDirPatients() {return patients;};
44
45 // Parsing
46    void ParseDirectory(void);
47
48    void SetStartMethod(gdcmMethod *,void * =NULL,gdcmMethod * =NULL);
49    void SetStartMethodArgDelete(gdcmMethod *);
50    void SetProgressMethod(gdcmMethod *,void * =NULL,gdcmMethod * =NULL);
51    void SetProgressMethodArgDelete(gdcmMethod *);
52    void SetEndMethod(gdcmMethod *,void * =NULL,gdcmMethod * =NULL);
53    void SetEndMethodArgDelete(gdcmMethod *);
54
55    inline float GetProgress(void)  {return(progress);};
56
57    inline void AbortProgress(void) {abort=true;};
58    inline bool IsAborted(void)     {return(abort);};
59
60 // Write
61    bool Write(std::string fileName);
62
63 // Types
64    typedef enum
65    {
66       GDCM_DICOMDIR_NONE,
67       GDCM_DICOMDIR_META,
68       GDCM_DICOMDIR_PATIENT,
69       GDCM_DICOMDIR_STUDY,
70       GDCM_DICOMDIR_SERIE,
71       GDCM_DICOMDIR_IMAGE,
72    } gdcmDicomDirType;
73    
74 protected:
75    void NewDicomDir(std::string path);
76    std::string GetPath(void);
77
78    void CallStartMethod(void);
79    void CallProgressMethod(void);
80    void CallEndMethod(void);
81
82 private:
83    void CreateDicomDir(void);
84    void AddObjectToEnd(gdcmDicomDirType type,
85                         ListTag::iterator begin,ListTag::iterator end);
86    void AddDicomDirMetaToEnd   (ListTag::iterator begin,ListTag::iterator end);
87    void AddDicomDirPatientToEnd(ListTag::iterator begin,ListTag::iterator end);
88    void AddDicomDirStudyToEnd  (ListTag::iterator begin,ListTag::iterator end);
89    void AddDicomDirSerieToEnd  (ListTag::iterator begin,ListTag::iterator end);
90    void AddDicomDirImageToEnd  (ListTag::iterator begin,ListTag::iterator end);
91
92    void SetElements(std::string &path,ListHeader &list);
93    void SetElement (std::string &path,gdcmDicomDirType type,gdcmHeader *header);
94    
95    void UpdateDirectoryRecordSequenceLength(void);
96
97    static bool HeaderLessThan(gdcmHeader *header1,gdcmHeader *header2);
98
99    gdcmDicomDirMeta *metaElems;
100    ListDicomDirPatient patients;
101
102    gdcmMethod *startMethod;
103    gdcmMethod *progressMethod;
104    gdcmMethod *endMethod;
105    gdcmMethod *startMethodArgDelete;
106    gdcmMethod *progressMethodArgDelete;
107    gdcmMethod *endMethodArgDelete;
108    void *startArg;
109    void *progressArg;
110    void *endArg;
111
112    float progress;
113    bool abort;
114 };
115
116 //-----------------------------------------------------------------------------
117 #endif