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