]> Creatis software - gdcm.git/blob - src/gdcmValidator.cxx
Fix bug (Thx, Manu)
[gdcm.git] / src / gdcmValidator.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: gdcmValidator.cxx,v $
5   Language:  C++
6   Date:      $Date: 2005/11/21 09:43:43 $
7   Version:   $Revision: 1.13 $
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 "gdcmValidator.h"
20 #include "gdcmElementSet.h"
21 #include "gdcmDataEntry.h"
22 #include "gdcmUtil.h"
23 #include <map>
24
25 #include <sstream>
26
27 namespace gdcm 
28 {
29 //-----------------------------------------------------------------------------
30 typedef std::map<uint16_t, int> GroupHT;    //  Hash Table
31 //-----------------------------------------------------------------------------
32 /// \brief Constructor
33 Validator::Validator()
34 {
35 }
36 ///\brief Canonical Destructor
37 Validator::~Validator()
38 {
39 }
40
41 // Function to compare the VM found while parsing d->GetString()
42 // compare to the one from the dictionary
43 bool CheckVM(DataEntry *entry)
44 {
45   // Don't waste time checking tags where VM is OB and OW, since we know
46   // it's allways 1, whatever the actual length (found on disc)
47   
48   if ( entry->GetVR() == "OB" ||  entry->GetVR() == "OW" )
49      return true;
50      
51   const std::string &s = entry->GetString();
52
53   unsigned int n = Util::CountSubstring( s , "\\");
54   
55   n++; // number of '\' + 1 == Value Multiplicity
56
57   std::string vmFromDict = entry->GetVM();
58   if ( vmFromDict == "1-n" || vmFromDict == "2-n" || vmFromDict == "3-n" )
59      return true;
60      
61   unsigned int m;
62   std::istringstream is;
63   is.str( vmFromDict );
64   is >> m;
65
66   return n == m;
67 }
68
69 void Validator::SetInput(ElementSet *input)
70 {
71
72 DocEntry *d;
73 /*
74 // First stage to check group length
75   GroupHT grHT;
76   d=input->GetFirstEntry();
77   while(d)
78   {
79     grHT[d->GetGroup()] = 0;
80     d=input->GetNextEntry();
81   }
82   for (GroupHT::iterator it = grHT.begin(); it != grHT.end(); ++it)  
83   {
84       std::cout << std::hex << it->first << std::endl; 
85   } 
86 */
87
88   // berk for now SetInput do two things at the same time
89   d=input->GetFirstEntry();
90   if (!d)
91   {
92      std::cout << "No Entry found" << std::endl;
93      return;
94   }
95   while(d)
96   { 
97     if ( DataEntry *v = dynamic_cast<DataEntry *>(d) )
98     { 
99       if ( v->GetVM() != gdcm::GDCM_UNKNOWN )
100          if ( !CheckVM(v) )
101          {
102             if (v->GetVM() == "FIXME" )
103               std::cout << "For Tag " <<  v->GetKey() << " VM = ["
104                        << v->GetVM() << "]" << std::endl;
105  
106             std::cout << "Tag (" <<  v->GetKey() 
107                       << ")-> [" << v->GetName() << "] VR :" << v->GetVR() 
108                       << " contains an illegal VM. Expected VM :[" 
109                       << v->GetVM() << "], value [" << v->GetString() << "]" 
110                       << std::endl;
111          }
112       
113       if ( v->GetReadLength() % 2 )
114       {
115         std::cout << "Tag (" <<  v->GetKey() 
116                   << ")-> [" << v->GetName() << "] has an uneven length :"
117                   << v->GetReadLength()
118                   << " [" << v->GetString() << "] " 
119                   << std::endl;         
120       }
121     }
122     else
123     {
124       // We skip pb of SQ recursive exploration
125     }
126     d=input->GetNextEntry();
127   }
128 }
129
130 } // end namespace gdcm