]> Creatis software - gdcm.git/blob - src/gdcmDicomDir.h
Allow to create ex nihilo DICOMDIR
[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    gdcmDicomDir(bool exception_on_error = false); 
35                    
36    ~gdcmDicomDir(void);
37
38    void SetPrintLevel(int level) { printLevel = level; };
39    virtual void Print(std::ostream &os = std::cout);
40
41 // Informations contained in the parser
42    virtual bool IsReadable(void);
43 /**
44  * \ingroup gdcmDicomDir
45  * \brief   returns a pointer to the gdcmDicomDirMeta for this DICOMDIR.
46  */   
47    inline gdcmDicomDirMeta   *GetDicomDirMeta()      
48       {return metaElems;};
49 /**
50  * \ingroup gdcmDicomDir
51  * \brief   returns the PATIENT chained List for this DICOMDIR.
52  */      
53    inline ListDicomDirPatient &GetDicomDirPatients() 
54       {return patients;};
55
56 // Parsing
57    void ParseDirectory(void);
58
59    void SetStartMethod(gdcmMethod *,void * =NULL,gdcmMethod * =NULL);
60    void SetStartMethodArgDelete(gdcmMethod *);
61    void SetProgressMethod(gdcmMethod *,void * =NULL,gdcmMethod * =NULL);
62    void SetProgressMethodArgDelete(gdcmMethod *);
63    void SetEndMethod(gdcmMethod *,void * =NULL,gdcmMethod * =NULL);
64    void SetEndMethodArgDelete(gdcmMethod *);
65
66    inline float GetProgress(void)  {return(progress);};
67    inline void  AbortProgress(void){abort=true;      };
68    inline bool  IsAborted(void)    {return(abort);   };
69    
70 // Adding
71   gdcmDicomDirPatient * NewPatient(void);
72
73 // Write
74    bool Write(std::string fileName);
75
76 // Types
77    typedef enum
78    {
79       GDCM_DICOMDIR_NONE,
80       GDCM_DICOMDIR_META,
81       GDCM_DICOMDIR_PATIENT,
82       GDCM_DICOMDIR_STUDY,
83       GDCM_DICOMDIR_SERIE,
84       GDCM_DICOMDIR_IMAGE,
85    } gdcmDicomDirType;
86    
87 protected:
88    void CreateDicomDirChainedList(std::string path);
89    std::string GetPath(void);
90
91    void CallStartMethod(void);
92    void CallProgressMethod(void);
93    void CallEndMethod(void);
94
95 private:
96    void CreateDicomDir(void);
97    void AddObjectToEnd(gdcmDicomDirType type,
98                                 ListTag::iterator begin,ListTag::iterator end);
99    void AddDicomDirMetaToEnd   (ListTag::iterator begin,ListTag::iterator end);
100    void AddDicomDirPatientToEnd(ListTag::iterator begin,ListTag::iterator end);
101    void AddDicomDirStudyToEnd  (ListTag::iterator begin,ListTag::iterator end);
102    void AddDicomDirSerieToEnd  (ListTag::iterator begin,ListTag::iterator end);
103    void AddDicomDirImageToEnd  (ListTag::iterator begin,ListTag::iterator end);
104
105    void SetElements(std::string &path,ListHeader &list);
106    void SetElement (std::string &path,gdcmDicomDirType type,gdcmHeader *header);
107    
108    void UpdateDirectoryRecordSequenceLength(void);
109
110    static bool HeaderLessThan(gdcmHeader *header1,gdcmHeader *header2);
111    void WriteDicomDirEntries(FILE *_fp);   
112    
113 // Variables
114 /**
115 * \brief pointer on *the* gdcmObject 'DicomDirMeta Elements'
116 */
117    gdcmDicomDirMeta *metaElems;
118 /**
119 * \brief chained list of DicomDirPatient (to be exploited recursively)
120 */   
121    ListDicomDirPatient patients;
122
123    gdcmMethod *startMethod;
124    gdcmMethod *progressMethod;
125    gdcmMethod *endMethod;
126    gdcmMethod *startMethodArgDelete;
127    gdcmMethod *progressMethodArgDelete;
128    gdcmMethod *endMethodArgDelete;
129    void *startArg;
130    void *progressArg;
131    void *endArg;
132
133    float progress;
134    bool abort;
135 };
136
137 //-----------------------------------------------------------------------------
138 #endif