X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmValidator.cxx;h=23bdfe46fb2d92fc52edda3a8e98d48abfb95233;hb=56ad78cdf3b5de32f0a94a38cd32ddc9f403ffc3;hp=3b9ac39b3fb51330b5fd6846cc13c6efa01ac2ae;hpb=8ea92706ea6ef5e97c3cdca1daa41c9a3063bd7a;p=gdcm.git diff --git a/src/gdcmValidator.cxx b/src/gdcmValidator.cxx index 3b9ac39b..23bdfe46 100644 --- a/src/gdcmValidator.cxx +++ b/src/gdcmValidator.cxx @@ -3,8 +3,8 @@ 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 @@ -18,66 +18,113 @@ #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 -namespace gdcm -{ +namespace GDCM_NAME_SPACE +{ +//----------------------------------------------------------------------------- +typedef std::map 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(d) ) { - if ( gdcm::BinEntry *b = dynamic_cast(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(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