#include "gdcmDataSetHelper.h"
#include "gdcmPrinter.h"
#include "gdcmReader.h"
#include "gdcmGlobal.h"
#include "gdcmTesting.h"
namespace gdcm
{
class Printer2 : public Printer
{
public:
VR PrintDataElement(std::ostringstream & os, const Dicts &dicts, const DataSet & ds, const DataElement &de, std::ostream &out, std::string const & indent ) {
const VR vr = Printer::PrintDataElement(os, dicts, ds, de, out, indent );
const VR vr2 = DataSetHelper::ComputeVR(*F, ds, de.GetTag());
if( vr != vr2 )
{
std::string privcrea = ds.GetPrivateCreator(de.GetTag());
const PrivateTag pt1(0x0027,0x33,"GEMS_IMAG_01");
const PrivateTag pt2(0x0045,0x72,"GEMS_FALCON_03");
const PrivateTag pt3(0x0045,0x73,"GEMS_FALCON_03");
const PrivateTag pt4(0x0029,0x1140,"SIEMENS MEDCOM HEADER");
if( PrivateTag(de.GetTag(),"GEMS_IMAG_01") == pt1 )
{
gdcm_assert( vr == VR::UL );
gdcm_assert( vr2 == VR::SL );
return vr;
}
if( PrivateTag(de.GetTag(),"GEMS_IMAG_01") == pt2
|| PrivateTag(de.GetTag(),"GEMS_IMAG_01") == pt3 )
{
gdcm_assert( vr == VR::IS );
gdcm_assert( vr2 == VR::DS );
return vr;
}
if( PrivateTag(de.GetTag(),"SIEMENS MEDCOM HEADER") == pt4 )
{
gdcm_assert( vr == VR::OB );
gdcm_assert( vr2 == VR::SQ );
return vr;
}
if( de.GetTag() == Tag(0x0020,0x0070) )
{
gdcm_assert( vr == VR::CS );
gdcm_assert( vr2 == VR::LO );
return vr;
}
if( de.GetTag() == Tag(0x0040,0x1008) )
{
gdcm_assert( vr == VR::ST );
gdcm_assert( vr2 == VR::LO );
return vr;
}
if( de.GetTag() == Tag(0x0040,0x0253) )
{
gdcm_assert( vr == VR::CS );
gdcm_assert( vr2 == VR::SH );
return vr;
}
if( de.GetTag() == Tag(0x0018,0x9305)
|| de.GetTag() == Tag(0x0018,0x9306)
|| de.GetTag() == Tag(0x0018,0x9307)
|| de.GetTag() == Tag(0x0023,0x1070) )
{
gdcm_assert( vr == VR::OB );
gdcm_assert( vr2 == VR::FD );
return vr;
}
if( de.GetTag() == Tag(0x0028,0x1101)
|| de.GetTag() == Tag(0x0028,0x1102)
|| de.GetTag() == Tag(0x0028,0x1103)
|| de.GetTag() == Tag(0x0028,0x1201)
|| de.GetTag() == Tag(0x0028,0x1202)
|| de.GetTag() == Tag(0x0028,0x1203) )
{
gdcm_assert( vr == VR::US );
gdcm_assert( vr2 == VR::SS || vr2 == VR::OW );
return vr;
}
if( de.GetTag() == Tag(0x0008,0x0010)
|| de.GetTag() == Tag(0x0018,0x4000)
|| de.GetTag() == Tag(0x0020,0x3402) )
{
gdcm_assert( vr == VR::LO );
gdcm_assert( vr2 == VR::CS || vr2 == VR::LT || vr2 == VR::SH );
return vr;
}
if( de.GetTag() == Tag(0x0020,0x1001)
|| de.GetTag() == Tag(0x0028,0x0005)
|| de.GetTag() == Tag(0x0028,0x0040)
|| de.GetTag() == Tag(0x0028,0x0200) )
{
gdcm_assert( vr == VR::DS || vr == VR::SS || vr == VR::SH );
gdcm_assert( vr2 == VR::IS || vr2 == VR::US || vr2 == VR::CS );
return vr;
}
if( de.GetTag() == Tag(0x0008,0x0040) )
{
gdcm_assert( vr == VR::SS );
gdcm_assert( vr2 == VR::US );
return vr;
}
if( vr == VR::SQ || vr2 == VR::SQ )
gdcm_assert( vr == vr2 );
if( !de.GetTag().IsPrivate() )
gdcm_assert( vr == vr2 );
}
return vr;
}
void PrintSQ(const SequenceOfItems *sqi, std::ostream & os, std::string const & indent)
{
if( !sqi ) return;
SequenceOfItems::ItemVector::const_iterator it = sqi->Items.begin();
for(; it != sqi->Items.end(); ++it)
{
const Item &item = *it;
const DataSet &ds = item.GetNestedDataSet();
const DataElement &deitem = item;
std::string nextindent = indent + " ";
os << nextindent << deitem.GetTag();
os << " ";
os << "na"; os << " ";
if( deitem.GetVL().IsUndefined() )
{
os << "(Item with undefined length)";
}
else
{
os << "(Item with defined length)";
}
os << "\n";
PrintDataSet(ds, os, nextindent + " ");
if( deitem.GetVL().IsUndefined() )
{
const Tag itemDelItem(0xfffe,0xe00d);
os << nextindent << itemDelItem << "\n";
}
}
if( sqi->GetLength().IsUndefined() )
{
const Tag seqDelItem(0xfffe,0xe0dd);
os << indent << seqDelItem << "\n";
}
}
void PrintDataSet(const DataSet &ds, std::ostream &out, std::string const & indent = "" )
{
const Global& g = GlobalInstance;
const Dicts &dicts = g.GetDicts();
DataSet::ConstIterator it = ds.Begin();
for( ; it != ds.End(); ++it )
{
const DataElement &de = *it;
const SequenceOfFragments *sqf = de.GetSequenceOfFragments();
std::ostringstream os;
VR refvr = PrintDataElement(os, dicts, ds, de, out, indent);
if( refvr == VR::SQ )
{
SmartPointer<SequenceOfItems> sqi2 = de.GetValueAsSQ(); PrintSQ(sqi2, os, indent);
}
else if ( sqf )
{
std::string nextindent = indent + " ";
const BasicOffsetTable & table = sqf->GetTable();
PrintDataElement(os,dicts,ds,table,out,nextindent);
size_t numfrag = sqf->GetNumberOfFragments();
for(size_t i = 0; i < numfrag; ++i)
{
const Fragment& frag = sqf->GetFragment(i);
PrintDataElement(os,dicts,ds,frag,out,nextindent);
}
const Tag seqDelItem(0xfffe,0xe0dd);
VL zero = 0;
os << seqDelItem;
os << " " << zero << "\n";
}
else
{
}
out << os.str();
}
}
void Print(std::ostream& os)
{
os << "# Dicom-File-Format\n";
os << "\n";
os << "# Dicom-Meta-Information-Header\n";
os << "# Used TransferSyntax: \n";
const FileMetaInformation &meta = F->GetHeader();
PrintDataSet(meta, os);
os << "\n# Dicom-Data-Set\n";
os << "# Used TransferSyntax: ";
const TransferSyntax &metats = meta.GetDataSetTransferSyntax();
os << metats;
os << std::endl;
const DataSet &ds = F->GetDataSet();
PrintDataSet(ds, os);
}
};
}
static int TestDataSetHelperFunc(const char *filename, bool verbose= false)
{
gdcm::Reader r;
r.SetFileName( filename );
if( !r.Read() )
{
std::cerr << "Could not read: " << filename << std::endl;
return 1;
}
const gdcm::File & file = r.GetFile();
gdcm::Printer2 print;
print.SetFile( file );
std::ostringstream out;
if( verbose )
print.Print( std::cout );
print.Print( out );
return 0;
}
int TestDataSetHelper(int argc, char *argv[])
{
if( argc == 2 )
{
const char *filename = argv[1];
return TestDataSetHelperFunc(filename, true);
}
int r = 0, i = 0;
gdcm::Trace::DebugOff();
gdcm::Trace::WarningOff();
gdcm::Trace::ErrorOff();
const char *filename;
const char * const *filenames = gdcm::Testing::GetFileNames();
while( (filename = filenames[i]) )
{
r += TestDataSetHelperFunc( filename );
++i;
}
return r;
}