Program: gdcm
Module: $RCSfile: gdcmValidator.cxx,v $
Language: C++
- Date: $Date: 2005/06/14 20:33:54 $
- Version: $Revision: 1.1 $
+ Date: $Date: 2007/08/21 12:51:10 $
+ Version: $Revision: 1.16 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
#include "gdcmValidator.h"
#include "gdcmElementSet.h"
-#include "gdcmBinEntry.h"
-#include "gdcmValEntry.h"
+#include "gdcmDataEntry.h"
+#include "gdcmUtil.h"
+#include "gdcmDebug.h" // hidden way to include sstream
+#include <map>
-namespace gdcm
-{
+namespace GDCM_NAME_SPACE
+{
+//-----------------------------------------------------------------------------
+typedef std::map<uint16_t, int> GroupHT; // Hash Table
+//-----------------------------------------------------------------------------
+/// \brief Constructor
Validator::Validator()
{
}
-
+///\brief Canonical Destructor
Validator::~Validator()
{
}
-// Function to compare the VM found while parsing d->GetValue()
+// Function to compare the VM found while parsing d->GetString()
// compare to the one from the dictionary
-bool CheckVM(ValEntry *v)
+bool CheckVM(DataEntry *entry)
{
- const std::string &s = v->GetValue();
- std::string::size_type n = s.find("\\");
- if (n == s.npos) // none found
- {
- n = 0;
- }
- n++; //poteaux / intervalles
+ // Don't waste time checking tags where VM is OB and OW, since we know
+ // it's always 1, whatever the actual length (found on disc)
+
+ if ( entry->GetVR() == "OB" || entry->GetVR() == "OW" )
+ return true;
- unsigned int m = atoi(v->GetVM().c_str());
+ const std::string &s = entry->GetString();
+
+ unsigned int n = Util::CountSubstring( s , "\\");
+
+ n++; // number of '\' + 1 == Value Multiplicity
+
+ std::string vmFromDict = entry->GetVM();
+ if ( vmFromDict == "1-n" || vmFromDict == "2-n" || vmFromDict == "3-n" )
+ return true;
+
+ unsigned int m;
+ std::istringstream is;
+ is.str( vmFromDict );
+ is >> m;
return n == m;
}
void Validator::SetInput(ElementSet *input)
{
+
+DocEntry *d;
+/*
+// First stage to check group length
+ GroupHT grHT;
+ d=input->GetFirstEntry();
+ while(d)
+ {
+ grHT[d->GetGroup()] = 0;
+ d=input->GetNextEntry();
+ }
+ for (GroupHT::iterator it = grHT.begin(); it != grHT.end(); ++it)
+ {
+ std::cout << std::hex << it->first << std::endl;
+ }
+*/
+
// berk for now SetInput do two things at the same time
- gdcm::DocEntry *d=input->GetFirstEntry();
+ d=input->GetFirstEntry();
+ if (!d)
+ {
+ std::cout << "No Entry found" << std::endl;
+ return;
+ }
while(d)
+ {
+ if ( DataEntry *v = dynamic_cast<DataEntry *>(d) )
{
- if ( gdcm::BinEntry *b = dynamic_cast<gdcm::BinEntry*>(d) )
+ if ( v->GetVM() != GDCM_NAME_SPACE::GDCM_UNKNOWN )
+ if ( !CheckVM(v) )
+ {
+ if (v->GetVM() == "FIXME" )
+ std::cout << "For Tag " << v->GetKey() << " VM = ["
+ << v->GetVM() << "]" << std::endl;
+
+ std::cout << "Tag (" << v->GetKey()
+ << ")-> [" << v->GetName() << "] VR :" << v->GetVR()
+ << " contains an illegal VM. Expected VM :["
+ << v->GetVM() << "], value [" << v->GetString() << "]"
+ << std::endl;
+ }
+
+ if ( v->GetReadLength() % 2 )
{
-// copyH->InsertBinEntry( b->GetBinArea(),b->GetLength(),
-// b->GetGroup(),b->GetElement(),
-// b->GetVR() );
- (void)b;
- }
- else if ( gdcm::ValEntry *v = dynamic_cast<gdcm::ValEntry*>(d) )
- {
- if( !CheckVM(v))
- {
- std::cout << "Rah this DICOM contains one wrong tag:" <<
- v->GetValue() << " " <<
- v->GetGroup() << "," << v->GetElement() << "," <<
- v->GetVR() << " " << v->GetVM() << " " << v->GetName() << std::endl;
- }
+ std::cout << "Tag (" << v->GetKey()
+ << ")-> [" << v->GetName() << "] has an uneven length :"
+ << v->GetReadLength()
+ << " [" << v->GetString() << "] "
+ << std::endl;
}
+ }
else
- {
+ {
// We skip pb of SQ recursive exploration
- }
- d=input->GetNextEntry();
}
+ d=input->GetNextEntry();
+ }
}
} // end namespace gdcm