]> Creatis software - gdcm.git/blob - src/gdcmDicomDirElement.cxx
Enhance gdcm::File::IsReable() heuristics to be able to process some Loic
[gdcm.git] / src / gdcmDicomDirElement.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: gdcmDicomDirElement.cxx,v $
5   Language:  C++
6   Date:      $Date: 2005/06/24 10:55:58 $
7   Version:   $Revision: 1.38 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18
19 #include "gdcmDicomDirElement.h"
20 #include "gdcmUtil.h"
21 #include "gdcmDebug.h"
22 #include "gdcmDictSet.h"
23
24 #include <fstream>
25 #include <iostream>
26
27 namespace gdcm 
28 {
29 //-----------------------------------------------------------------------------
30 /// \brief auto generate function, to fill up the default elements for 
31 ///        a DICOMDIR, if relevant file is not found on user's disk
32 void FillDefaultDIRDict(DicomDirElement *dde);
33
34 //-----------------------------------------------------------------------------
35 // Constructor / Destructor
36 /**
37  * \brief   constructor : populates the chained lists 
38  *          from the file 'Dicts/DicomDir.dic'
39  */
40 DicomDirElement::DicomDirElement()
41 {
42    std::string filename = DictSet::BuildDictPath() + DICT_ELEM;
43    std::ifstream from(filename.c_str());
44    if ( !from )
45    {
46       gdcmWarningMacro( "Can't open DicomDirElement dictionary" 
47                         << filename.c_str());
48       FillDefaultDIRDict( this );
49    }
50    else
51    {
52       char buff[1024];
53       std::string strType;
54       Element elem;
55       DicomDirType type;
56
57       while (!from.eof())
58       {
59          from >> std::ws;
60          from.getline(buff, 1024, ' ');
61          strType = buff;
62
63          if ( strType == "metaElem" )
64             type = DD_META;
65          else if ( strType == "patientElem" )
66             type = DD_PATIENT;
67          else if ( strType == "studyElem" )
68             type = DD_STUDY;
69          else if ( strType == "serieElem" )
70             type = DD_SERIE;
71          else if ( strType == "imageElem" )
72             type = DD_IMAGE;
73          else
74          {
75             gdcmWarningMacro("Unknown type found in the file : "
76                              <<filename.c_str());
77             type = DD_UNKNOWN;
78          }
79
80          if ( type!=DD_UNKNOWN )
81          {
82             from >> std::hex >> elem.Group >> elem.Elem;
83
84             from >> std::ws;
85             from.getline(buff, 1024, '"');
86             from >> std::ws;
87             from.getline(buff, 1024, '"');
88             elem.Value = buff;
89
90             AddEntry(type, elem);
91          }
92          from.getline(buff, 1024, '\n');
93       }
94       from.close();
95    }
96 }
97
98 /**
99  * \brief   canonical destructor 
100  */
101 DicomDirElement::~DicomDirElement()
102 {
103    DicomDirMetaList.clear();
104    DicomDirPatientList.clear();
105    DicomDirStudyList.clear();
106    DicomDirSerieList.clear();
107    DicomDirImageList.clear();
108 }
109
110 //-----------------------------------------------------------------------------
111 // Public
112 /**
113  * \brief Add an entry to one of the DicomDir Elements 
114  *        (Patient, Study, Serie, Image)
115  * @param type Element type (DD_PATIENT, DD_STUDY, DD_SERIE, DD_IMAGE) 
116  * @param elem elem
117  */
118 bool DicomDirElement::AddEntry(DicomDirType type, Element const &elem)
119 {
120    switch( type )
121    {
122       case DD_META :
123          DicomDirMetaList.push_back(elem);
124          break;
125       case DD_PATIENT :
126          DicomDirPatientList.push_back(elem);
127          break;
128       case DD_STUDY :
129          DicomDirStudyList.push_back(elem);
130          break;
131       case DD_SERIE :
132          DicomDirSerieList.push_back(elem);
133          break;
134       case DD_IMAGE :
135          DicomDirImageList.push_back(elem);
136          break;
137       default :
138          return false;
139    }
140    return true;
141 }
142
143 /**
144  * \brief Add an entry to one of the DicomDir Elements 
145  *        (Patient, Study, Serie, Image)
146  * @param type Element type (DD_PATIENT, DD_STUDY, DD_SERIE, DD_IMAGE) 
147  * @param group  Group number of the entry to be added
148  * @param elem Element number of the entry to be added
149  */
150 void DicomDirElement::AddDicomDirElement(DicomDirType type,
151                                          uint16_t group, uint16_t elem)
152 {
153    Element el;
154    el.Group = group;
155    el.Elem  = elem;
156    el.Value = "";
157    AddEntry(type, el);
158 }
159 //-----------------------------------------------------------------------------
160 // Protected
161
162 //-----------------------------------------------------------------------------
163 // Private
164
165 //-----------------------------------------------------------------------------
166 // Print
167 /**
168  * \brief   Print all
169  * @param   os The output stream to be written to.
170  */
171 void DicomDirElement::Print(std::ostream &os)
172 {
173    std::ostringstream s;
174    std::list<Element>::iterator it;
175    //char greltag[10];  //group element tag
176    std::string greltag;
177
178    s << "Meta Elements :"<<std::endl;
179    for (it = DicomDirMetaList.begin(); it != DicomDirMetaList.end(); ++it)
180    {
181       greltag = DictEntry::TranslateToKey(it->Group,it->Elem);
182       s << "   (" << greltag << ") = " << it->Value << std::endl;
183    }
184
185    s << "Patient Elements :"<<std::endl;
186    for (it = DicomDirPatientList.begin(); it != DicomDirPatientList.end(); ++it)
187    {
188       greltag = DictEntry::TranslateToKey(it->Group,it->Elem);
189       s << "   (" << greltag << ") = " << it->Value << std::endl;
190    }
191
192    s << "Study Elements :"<<std::endl;
193    for (it = DicomDirStudyList.begin(); it != DicomDirStudyList.end(); ++it)
194    {
195       greltag = DictEntry::TranslateToKey(it->Group, it->Elem);
196       s << "   (" << greltag << ") = " << it->Value << std::endl;
197    }
198
199    s << "Serie Elements :"<<std::endl;
200    for (it = DicomDirSerieList.begin(); it != DicomDirSerieList.end(); ++it)
201    {
202       greltag = DictEntry::TranslateToKey( it->Group, it->Elem);
203       s << "   (" << greltag << ") = " << it->Value << std::endl;
204    }
205
206    s << "Image Elements :"<<std::endl;
207    for (it = DicomDirImageList.begin(); it != DicomDirImageList.end(); ++it)
208    {
209       greltag = DictEntry::TranslateToKey(it->Group, it->Elem);
210       s << "   (" << greltag << ") = " << it->Value << std::endl;
211    }
212
213    os << s.str();
214 }
215
216 //-----------------------------------------------------------------------------
217 } // end namespace gdcm