]> Creatis software - gdcm.git/blob - src/gdcmVR.cxx
The bad hack I made to bypass illegal images where undefined length UN data
[gdcm.git] / src / gdcmVR.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: gdcmVR.cxx,v $
5   Language:  C++
6   Date:      $Date: 2007/09/25 15:21:57 $
7   Version:   $Revision: 1.62 $
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 "gdcmVR.h"
20 #include "gdcmUtil.h"
21 #include "gdcmDictSet.h"
22 #include "gdcmDebug.h"
23
24 #include <fstream>
25 #include <iostream>
26 #include <string.h>
27
28 namespace GDCM_NAME_SPACE 
29 {
30 //-----------------------------------------------------------------------------
31 /// \brief auto generated function, to fill up the 'Value Representation'
32 ///        Dictionnary, if relevant file is not found on user's disk
33 void FillDefaultVRDict(VRHT &vr);
34
35 //-----------------------------------------------------------------------------
36 // Constructor / Destructor
37 /**
38  * \brief Constructor
39  */
40 VR::VR() 
41 {
42    std::string filename = DictSet::BuildDictPath() + DICT_VR;
43    std::ifstream from(filename.c_str());
44    if ( !from )
45    {
46       gdcmWarningMacro("Can't open dictionary " << filename.c_str());
47       FillDefaultVRDict(vr);
48    }
49    else
50    {
51       char buff[1024];
52       VRKey key;
53       VRAtr name;
54    
55       while (!from.eof()) 
56       {
57          from >> std::ws;
58          from.getline(buff, 1024, ' ');
59          if( strcmp(buff,"") == 0)
60             continue;
61
62          key = buff;
63          from >> std::ws;
64          from.getline(buff, 1024, ';');
65          name = buff;
66    
67          from >> std::ws;
68          from.getline(buff, 1024, '\n');
69    
70          vr[key] = name;
71       }
72       from.close();
73    }
74 }
75
76 /**
77  * \brief Destructor
78  */
79 VR::~VR()
80 {
81    vr.clear();
82 }
83
84 //-----------------------------------------------------------------------------
85 // Public
86
87 /**
88  * \brief   Simple predicate that checks whether the given argument
89  *          corresponds to the Value Representation of a DataEntry .
90  * @param   tested value representation to check for.
91  */
92 bool VR::IsVROfBinaryRepresentable(VRKey const &tested)
93 {
94    if ( IsVROfStringRepresentable(tested) )
95       return false;
96
97    if ( IsVROfSequence(tested) )
98       return false;
99
100    return true;
101 }
102
103 /**
104  * \brief   Simple predicate that checks whether the given argument
105  *          corresponds to the Value Representation of a
106  *          'std::string representable' value.
107  * @param   tested value representation to be checked.
108  */
109 bool VR::IsVROfStringRepresentable(VRKey const &tested)
110 {
111    return tested == "AE" ||
112           tested == "AS" ||
113           tested == "CS" ||
114           tested == "DA" ||
115           tested == "DS" ||
116           tested == "FL" ||
117           tested == "FD" ||
118           tested == "IS" || 
119           tested == "LO" ||
120           tested == "LT" ||
121           tested == "PN" ||
122           tested == "SH" ||
123           tested == "SL" ||
124           tested == "SS" ||
125           tested == "ST" ||
126           tested == "TM" ||
127           tested == "UI" ||
128           tested == "UL" ||
129           tested == "US" ||
130           tested == "UT";
131
132    // Should be quicker
133    // --> will *never* work : any rotten value would be considered as OK !
134 /*
135    return tested != "OB" &&
136           tested != "OW" &&
137           tested != "OF" &&
138           tested != "AT" && // Attribute Tag ?!? contain no printable character
139           tested != "UN" && // UN is an actual VR !
140           tested != "SQ" ;
141 */
142 }
143 /// \brief returns the length of a elementary elem whose VR is passed
144 unsigned short VR::GetAtomicElementLength(VRKey const &tested)
145 {
146    // Unsigned & signed short
147    if( tested == "US" || tested == "SS" )
148       return 2;
149    // Unsigned & signed long
150    if( tested == "UL" || tested == "SL" )
151       return 4;
152    // Float
153    if( tested == "FL" )
154       return 4;
155    // Double
156    if( tested == "FD" )
157       return 8;
158    // Word string
159    if( tested == "OW" )
160       return 2;
161    // Float string
162    if( tested == "OF" || tested == "OL")
163       return 4;   
164    return 1;
165 }
166
167 // VS6 need a single implementation in the dll
168 #if defined(_MSC_VER) && (_MSC_VER == 1200)
169 /// \brief checks is a supposed-to-be VR is a 'legal' one.
170 bool VR::IsValidVR(VRKey const &key)
171 {
172   return vr.find(key) != vr.end();
173 #ifdef USECOMPLETELYUNTESTEDCODE
174   // to avoid to search in a std::map of std::string,
175   // since each std::string is 2 characters longs, we check the array
176   // (29 char comparisons in the worst case!)
177   
178   // "RT" is an undocumented VR, found in some Siemens images.
179   // We added it here to be able to read these images.
180   // Dict/gdcmVR.dic, Document has to be updated, too.
181   static const char VRvalues[] =
182     "AEASATCSDADSDTFLFDISLOLTOBOWOLOFPNSHSLSQSSSTTMUIULUNUSUTRT";
183
184   //int nbVal = strlen(VRvalues)/2; // save CPU time.
185   int nbVal = 29;
186  
187   const char *pt = VRvalues;
188   for (int i=0;i<nbVal;i++)
189   {
190      if(key[0] == *pt++) {
191        if(key[1] == *pt++) {
192           return true;
193        }
194      }  
195      else {
196         pt++;
197      }        
198   }
199   return false;
200 #endif
201
202 }
203 #endif
204
205 //-----------------------------------------------------------------------------
206 // Protected
207
208 //-----------------------------------------------------------------------------
209 // Private
210
211 //-----------------------------------------------------------------------------
212 // Print
213 /**
214  * \brief   Print all 
215  * @param   os The output stream to be written to.
216  */
217 void VR::Print(std::ostream &os,std::string const &) 
218 {
219    for (VRHT::iterator it = vr.begin(); it != vr.end(); ++it)
220    {
221       os << "VR : " << it->first << " = " << it->second << std::endl;
222    }
223 }
224
225 //-----------------------------------------------------------------------------
226 } // end namespace gdcm