]> Creatis software - gdcm.git/blob - src/gdcmHeaderEntry.cxx
ENH: Remove redundancie about GDCM_DICT stuff, now we only need to modify
[gdcm.git] / src / gdcmHeaderEntry.cxx
1 // gdcmHeaderEntry.cxx
2 //-----------------------------------------------------------------------------
3 //
4 #include "gdcmHeaderEntry.h"
5 #include "gdcmTS.h"
6 #include "gdcmGlobal.h"
7 #include "gdcmUtil.h"
8
9 #include <iomanip> // for std::ios::left, ...
10
11
12 #define MAX_SIZE_PRINT_ELEMENT_VALUE 64
13
14 //-----------------------------------------------------------------------------
15 // Constructor / Destructor
16 /**
17  * \ingroup gdcmHeaderEntry
18  * \brief   Constructor from a given gdcmDictEntry
19  * @param   in Pointer to existing dictionary entry
20  */
21 gdcmHeaderEntry::gdcmHeaderEntry(gdcmDictEntry* in) {
22    ImplicitVR = false;
23    voidArea = NULL; // unsecure memory area to hold 'non string' values
24    entry = in;
25 }
26
27 //-----------------------------------------------------------------------------
28 // Print
29 /**
30  * \ingroup gdcmHeaderEntry
31  * \brief   canonical Printer
32  */
33 void gdcmHeaderEntry::Print(std::ostream & os) {
34    size_t o;
35    unsigned short int g, e;
36    char st[20];
37    TSKey v;
38    std::string d2, vr;
39    gdcmTS * ts = gdcmGlobal::GetTS();
40    std::ostringstream s;
41    guint32 lgth;
42    char greltag[10];  //group element tag
43
44    g  = GetGroup();
45    e  = GetElement();
46    v  = GetValue();
47    o  = GetOffset();
48    vr = GetVR();
49    sprintf(greltag,"%04x|%04x ",g,e);           
50    s << greltag ;
51        
52    d2 = CreateCleanString(v);  // replace non printable characters by '.'
53    if (printLevel>=2) { 
54       s << "lg : ";
55       lgth = GetReadLength(); // ReadLength, as opposed to UsableLength
56       if (lgth == 0xffffffff) {
57          sprintf(st,"x(ffff)");  // I said : "x(ffff)" !
58          s.setf(std::ios::left);
59          s << std::setw(10-strlen(st)) << " ";  
60          s << st << " ";
61          s.setf(std::ios::left);
62          s << std::setw(8) << "-1";      
63       } else {
64          sprintf(st,"x(%x)",lgth);
65          s.setf(std::ios::left);
66          s << std::setw(10-strlen(st)) << " ";  
67          s << st << " ";
68          s.setf(std::ios::left);
69          s << std::setw(8) << lgth; 
70       }
71       s << " Off.: ";
72       sprintf(st,"x(%x)",o); 
73       s << std::setw(10-strlen(st)) << " ";
74       s << st << " ";
75       s << std::setw(8) << o; 
76    }
77
78    s << "[" << vr  << "] ";
79
80    if (printLevel>=1) {      
81       s.setf(std::ios::left);
82       s << std::setw(66-GetName().length()) << " ";
83    }
84     
85    s << "[" << GetName()<< "]";
86
87    if (voidArea != NULL) {
88        s << " [gdcm::Non String Data Loaded in Unsecure Area (" 
89          << GetLength() << ") ]";
90    } 
91    
92    else {             
93       if( (GetLength()<MAX_SIZE_PRINT_ELEMENT_VALUE) || 
94           (printLevel>=3)  || 
95           (d2.find("gdcm::NotLoaded.") < d2.length()) )
96          s << " [" << d2 << "]";
97       else 
98          s << " [gdcm::too long for print (" << GetLength() << ") ]";
99    }
100    
101    // Display the UID value (instead of displaying only the rough code)  
102    if (g == 0x0002) {  // Any more to be displayed ?
103       if ( (e == 0x0010) || (e == 0x0002) )
104          s << "  ==>\t[" << ts->GetValue(v) << "]";
105    } else {
106       if (g == 0x0008) {
107          if ( (e == 0x0016) || (e == 0x1150)  )
108             s << "  ==>\t[" << ts->GetValue(v) << "]";
109       } else {
110          if (g == 0x0004) {
111             if ( (e == 0x1510) || (e == 0x1512)  )
112                s << "  ==>\t[" << ts->GetValue(v) << "]";
113          }     
114       }
115    }
116    //if (e == 0x0000) {        // elem 0x0000 --> group length 
117    if ( (vr == "UL") || (vr == "US") || (vr == "SL") || (vr == "SS") ) {
118       if (v == "4294967295") // to avoid troubles in convertion 
119          sprintf (st," x(ffffffff)");
120       else {
121          if ( GetLength() !=0 )        
122             sprintf(st," x(%x)", atoi(v.c_str()));//FIXME
123          else
124           sprintf(st," "); 
125       }
126       s << st;
127    }
128    s << std::endl;
129    os << s.str();
130 }
131
132 //-----------------------------------------------------------------------------
133 // Public
134
135 /**
136  * \ingroup gdcmHeaderEntry
137  * \brief   Gets the full length of the HeaderEntry (not only value length)
138  */
139 guint32 gdcmHeaderEntry::GetFullLength(void) {
140    guint32 l;
141    l = GetLength();
142    if ( IsImplicitVR() ) 
143       l = l + 8;  // 2 (gr) + 2 (el) + 4 (lgth) 
144    else    
145       if ( GetVR()=="OB" || GetVR()=="OW" || GetVR()=="SQ" )
146          l = l + 12; // 2 (gr) + 2 (el) + 2 (vr) + 2 (unused) + 4 (lgth)
147       else
148          l = l + 8;  // 2 (gr) + 2 (el) + 2 (vr) + 2 (lgth)
149    return(l);
150 }
151
152 //-----------------------------------------------------------------------------
153 // Protected
154
155 //-----------------------------------------------------------------------------
156 // Private
157
158 //-----------------------------------------------------------------------------