]> Creatis software - gdcm.git/blob - src/gdcmHeaderEntry.cxx
upgrade GdcmHeaderEntry Print Method for DICOMDIR
[gdcm.git] / src / gdcmHeaderEntry.cxx
1 // gdcmHeaderEntry.cxx
2 //-----------------------------------------------------------------------------
3 //
4 #include "gdcmHeaderEntry.h"
5 #include "gdcmTS.h"
6 #include "gdcmUtil.h"
7
8 #ifdef GDCM_NO_ANSI_STRING_STREAM
9 #  include <strstream>
10 #  define  ostringstream ostrstream
11 # else
12 #  include <sstream>
13 #endif
14 #include <iomanip> // for std::ios::left, ...
15
16 //-----------------------------------------------------------------------------
17 // Constructor / Destructor
18 /**
19  * \ingroup gdcmHeaderEntry
20  * \brief   Constructor from a given gdcmDictEntry
21  * @param   in Pointer to existing dictionary entry
22  */
23 gdcmHeaderEntry::gdcmHeaderEntry(gdcmDictEntry* in) {
24         ImplicitVR = false;
25         entry = in;
26 }
27
28 //-----------------------------------------------------------------------------
29 // Print
30 void gdcmHeaderEntry::Print(std::ostream & os) {
31    size_t o;
32    unsigned short int g, e;
33    char st[20];
34    TSKey v;
35    std::string d2, vr;
36    gdcmTS * ts = gdcmGlobal::GetTS();
37    std::ostringstream s;
38    guint32 lgth;
39    char greltag[10];  //group element tag
40    g  = GetGroup();
41    e  = GetElement();
42    v  = GetValue();
43    o  = GetOffset();
44    vr = GetVR();
45    sprintf(greltag,"%04x|%04x ",g,e);           
46    s << greltag ;
47        
48    d2 = _CreateCleanString(v);  // replace non printable characters by '.'
49    if (printLevel>=2) { 
50       s << "lg : ";
51       lgth = GetReadLength();
52       if (lgth == 0xffffffff) {
53          sprintf(st,"x(ffff)");  // I said : "x(ffff)" !
54          s.setf(std::ios::left);
55          s << std::setw(10-strlen(st)) << " ";  
56          s << st << " ";
57          s.setf(std::ios::left);
58          s << std::setw(8) << "-1";      
59       } else {
60          sprintf(st,"x(%x)",lgth);
61          s.setf(std::ios::left);
62          s << std::setw(10-strlen(st)) << " ";  
63          s << st << " ";
64          s.setf(std::ios::left);
65          s << std::setw(8) << lgth; 
66       }
67       s << " Off.: ";
68       sprintf(st,"x(%x)",o); 
69       s << std::setw(10-strlen(st)) << " ";
70       s << st << " ";
71       s << std::setw(8) << o; 
72    }
73
74    s << "[" << vr  << "] ";
75
76    if (printLevel>=1) {      
77       s.setf(std::ios::left);
78       s << std::setw(66-GetName().length()) << " ";              
79    } 
80      
81    s << "[" << GetName()<< "]";       
82    if( (GetLength()<64) || (printLevel>=3) )
83       s << " [" << d2 << "]";
84    else
85       s << " [ gdcm::too long for print (" << GetLength() << ") ]";
86
87    // Display the UID value (instead of displaying the rough code)  
88    if (g == 0x0002) {  // Any more to be displayed ?
89       if ( (e == 0x0010) || (e == 0x0002) )
90          s << "  ==>\t[" << ts->GetValue(v) << "]";
91    } else {
92       if (g == 0x0008) {
93          if ( (e == 0x0016) || (e == 0x1150)  )
94             s << "  ==>\t[" << ts->GetValue(v) << "]";
95       } else {
96          if (g == 0x0004) {
97             if ( (e == 0x1510) || (e == 0x1512)  )
98                s << "  ==>\t[" << ts->GetValue(v) << "]";
99          }     
100       }
101    }
102    //if (e == 0x0000) {        // elem 0x0000 --> group length 
103    if ( (vr == "UL") || (vr == "US") || (vr == "SL") || (vr == "SS") ) {
104       if (v == "4294967295") // to avoid troubles in convertion 
105          sprintf (st," x(ffffffff)");
106       else      
107          sprintf(st," x(%x)",(unsigned long)atof(v.c_str()));
108       s << st;
109    }
110    s << std::endl;
111    os << s.str();
112 }
113
114 //-----------------------------------------------------------------------------
115 // Public
116
117 //-----------------------------------------------------------------------------
118 // Protected
119
120 //-----------------------------------------------------------------------------
121 // Private
122
123 //-----------------------------------------------------------------------------