#include "gdcmReader.h"
#include "gdcmWriter.h"
#include "gdcmFileMetaInformation.h"
#include "gdcmFile.h"
#include "gdcmTesting.h"
#include "gdcmMediaStorage.h"
#include "gdcmSystem.h"
struct element {
const char *in;
const char *inmd5;
const char *outmd5;
size_t outlen;
};
static const element list[] = {
{ "Enhanced_MR_Image_Storage_PixelSpacingNotIn_0028_0030.dcm",
"854653ae806c224bfae3f196af250311",
"e6d42da08e33e526dab4626864a1580e",
26851994 },
{ "Siemens_CT_Sensation64_has_VR_RT.dcm",
"3388c4f8e35cdb3d9512823f71e2415b",
"cc57ee3ff427b859d3022071c8f1be95",
526460 },
{ "ITK-GDCM-1.2.2.saysExplicitVR-butIsImplicitVR.dcm",
"1158160333e00c0d1f8a7fdcbe352cac",
"7fb2ef887fa29b9a793242b28d4e8258",
199218 },
{ "MR_Philips_Intera_in_SQ_2001_e05f_item_wrong_lgt_use_NOSHADOWSEQ.dcm",
"a8091f92ae895c2ef70143487e29b7d3",
"6bf002815fad665392acab24f09caa5e",
138596 },
{ "MR_Philips_Intera_No_PrivateSequenceImplicitVR.dcm", "aa07de9c01765602fe722e9ef2d8b92a",
"aa07de9c01765602fe722e9ef2d8b92a",
2106660 },
{ "MR_Philips_Intera_PrivateSequenceExplicitVR.dcm",
"a8091f92ae895c2ef70143487e29b7d3",
"6bf002815fad665392acab24f09caa5e",
138596 },
{ "MR_Philips_Intera_SwitchIndianess_noLgtSQItem_in_trueLgtSeq.dcm",
"3bbffc4c87f4f5554fafad5f8a002552",
"df0e01aae299317db1719e4de72b8937",
2106428 },
{ "illegal_UN_stands_for_SQ.dcm", "2e1aa4fbebd08bbdf252f57b8343a79a",
"4c6832a4378f5d953c1e92fdcbe43666",
33972 },
};
int TestInvalidDICOMFiles(int , char *[])
{
int r = 0;
gdcm::Trace::DebugOff();
gdcm::Trace::WarningOff();
const char *extradataroot = gdcm::Testing::GetDataExtraRoot();
if( !extradataroot )
{
return 1;
}
if( !gdcm::System::FileIsDirectory(extradataroot) )
{
std::cerr << "No such directory: " << extradataroot << std::endl;
return 1;
}
static const size_t n = sizeof( list ) / sizeof( element );
for( size_t i = 0; i < n; ++i )
{
const element &el = list[i];
std::string sfilename = extradataroot;
sfilename += "/gdcmSampleData/images_of_interest/";
sfilename += el.in;
const char *filename = sfilename.c_str();
if( !gdcm::System::FileExists(filename) )
{
std::cerr << "No such file: " << filename << std::endl;
return 1;
}
gdcm::Reader reader;
reader.SetFileName( filename );
if ( !reader.Read() )
{
std::cerr << "TestReadError: Failed to read: " << filename << std::endl;
return 1;
}
char digest_str[33];
bool b = gdcm::Testing::ComputeFileMD5(filename, digest_str);
if( !b ) return 1;
std::string md5ref = el.inmd5;
if( md5ref != digest_str )
{
std::cerr << "pb: " << md5ref << " vs " << digest_str << std::endl;
++r;
}
const char subdir[] = "TestInvalidDICOMFiles";
std::string tmpdir = gdcm::Testing::GetTempDirectory( subdir );
if( !gdcm::System::FileIsDirectory( tmpdir.c_str() ) )
{
gdcm::System::MakeDirectory( tmpdir.c_str() );
}
std::string outfilename = gdcm::Testing::GetTempFilename( filename, subdir );
std::cout << "Corrected to: " << outfilename << std::endl;
gdcm::Writer writer;
writer.SetFileName( outfilename.c_str() );
writer.SetFile( reader.GetFile() );
writer.SetCheckFileMetaInformation( false );
if( !writer.Write() )
{
std::cerr << "Failed to write: " << outfilename << std::endl;
++r;
}
char digest_str2[33];
bool b2 = gdcm::Testing::ComputeFileMD5(outfilename.c_str(), digest_str2);
if( !b2 ) return 1;
std::string md5ref2 = el.outmd5;
if( md5ref2 != digest_str2 )
{
std::cerr << "pb: " << md5ref2 << " vs " << digest_str2 << std::endl;
++r;
}
size_t s = gdcm::System::FileSize(outfilename.c_str());
if ( s != el.outlen ) {
std::cerr << "pb size: " << s << std::endl;
++r;
}
}
return r;
}