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