]> Creatis software - gdcm.git/blobdiff - src/gdcmDocEntry.cxx
ENH: Some cosmetic cleanup of gdcmFile, main changes are: lgrTotal -> ImageDataSize...
[gdcm.git] / src / gdcmDocEntry.cxx
index 9c553bb13e93a2872343a6a5e348cb9b5b211282..69d07b069fb97817be3d4b1d21b653805abc9f9b 100644 (file)
@@ -1,6 +1,20 @@
-// gdcmDocEntry.cxx
-//-----------------------------------------------------------------------------
-//
+/*=========================================================================
+                                                                                
+  Program:   gdcm
+  Module:    $RCSfile: gdcmDocEntry.cxx,v $
+  Language:  C++
+  Date:      $Date: 2004/06/24 18:03:14 $
+  Version:   $Revision: 1.10 $
+                                                                                
+  Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
+  l'Image). All rights reserved. See Doc/License.txt or
+  http://www.creatis.insa-lyon.fr/Public/Gdcm/License.htm for details.
+                                                                                
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+                                                                                
+=========================================================================*/
 
 #include "gdcmDocEntry.h"
 #include "gdcmTS.h"
@@ -9,7 +23,7 @@
 
 #include <iomanip> // for std::ios::left, ...
 
-
+// CLEAN ME
 #define MAX_SIZE_PRINT_ELEMENT_VALUE 64
 
 //-----------------------------------------------------------------------------
@@ -28,32 +42,29 @@ gdcmDocEntry::gdcmDocEntry(gdcmDictEntry* in) {
 // Print
 /**
  * \ingroup gdcmDocEntry
- * \brief   canonical Printer
+ * \brief   Prints the common part of gdcmValEntry, gdcmBinEntry, gdcmSeqEntry
+ * @param   os ostream we want to print in
  */
 void gdcmDocEntry::Print(std::ostream & os) {
 
-// TODO : (no more chained list ...)
-
-/*
+   printLevel=2; // FIXME
+   
    size_t o;
    unsigned short int g, e;
    char st[20];
    TSKey v;
    std::string d2, vr;
-   gdcmTS * ts = gdcmGlobal::GetTS();
    std::ostringstream s;
    guint32 lgth;
    char greltag[10];  //group element tag
 
    g  = GetGroup();
    e  = GetElement();
-   v  = GetValue();
    o  = GetOffset();
    vr = GetVR();
    sprintf(greltag,"%04x|%04x ",g,e);           
    s << greltag ;
        
-   d2 = CreateCleanString(v);  // replace non printable characters by '.'
    if (printLevel>=2) { 
       s << "lg : ";
       lgth = GetReadLength(); // ReadLength, as opposed to UsableLength
@@ -87,52 +98,85 @@ void gdcmDocEntry::Print(std::ostream & os) {
    }
     
    s << "[" << GetName()<< "]";
+   os << s.str();      
+}
 
-   if (voidArea != NULL) {
-       s << " [gdcm::Non String Data Loaded in Unsecure Area (" 
-         << GetLength() << ") ]";
-   } 
-   
-   else {             
-      if( (GetLength()<MAX_SIZE_PRINT_ELEMENT_VALUE) || 
-          (printLevel>=3)  || 
-          (d2.find("gdcm::NotLoaded.") < d2.length()) )
-         s << " [" << d2 << "]";
-      else 
-         s << " [gdcm::too long for print (" << GetLength() << ") ]";
-   }
-   
-   // Display the UID value (instead of displaying only the rough code)  
-   if (g == 0x0002) {  // Any more to be displayed ?
-      if ( (e == 0x0010) || (e == 0x0002) )
-         s << "  ==>\t[" << ts->GetValue(v) << "]";
-   } else {
-      if (g == 0x0008) {
-         if ( (e == 0x0016) || (e == 0x1150)  )
-            s << "  ==>\t[" << ts->GetValue(v) << "]";
-      } else {
-         if (g == 0x0004) {
-           if ( (e == 0x1510) || (e == 0x1512)  )
-              s << "  ==>\t[" << ts->GetValue(v) << "]";
-        }     
+/**
+ * \ingroup gdcmDocEntry
+ * \brief   Writes the common part of any gdcmValEntry, gdcmBinEntry, gdcmSeqEntry
+ */
+void gdcmDocEntry::Write(FILE *fp, FileType filetype) {
+
+   guint32 FFFF = 0xffffffff;
+   guint16 group  = GetGroup();
+   VRKey   vr     = GetVR();
+   guint16 el     = GetElement();
+   guint32 lgr    = GetReadLength();
+
+   if ( (group == 0xfffe) && (el == 0x0000) ) 
+     // Fix in order to make some MR PHILIPS images e-film readable
+     // see gdcmData/gdcm-MR-PHILIPS-16-Multi-Seq.dcm:
+     // we just *always* ignore spurious fffe|0000 tag !   
+      return; 
+
+//
+// ----------- Writes the common part
+//
+   fwrite ( &group,(size_t)2 ,(size_t)1 ,fp);  //group
+   fwrite ( &el,   (size_t)2 ,(size_t)1 ,fp);  //element
+      
+   if ( filetype == gdcmExplicitVR ) {
+
+      // Special case of delimiters:
+      if (group == 0xfffe) {
+         // Delimiters have NO Value Representation
+         // Hence we skip writing the VR.
+         // In order to avoid further troubles, we choose to write them
+         // as 'no-length' Item Delimitors (we pad by writing 0xffffffff)
+         // The end of a given Item will be found when  :
+         //  - a new Item Delimitor Item is encountered (the Seq goes on)
+         //  - a Sequence Delimitor Item is encountered (the Seq just ended)
+
+       // TODO : verify if the Sequence Delimitor Item was forced during Parsing 
+
+         int ff=0xffffffff;
+         fwrite (&ff,(size_t)4 ,(size_t)1 ,fp);
+         return;
       }
-   }
-   //if (e == 0x0000) {        // elem 0x0000 --> group length 
-   if ( (vr == "UL") || (vr == "US") || (vr == "SL") || (vr == "SS") ) {
-      if (v == "4294967295") // to avoid troubles in convertion 
-         sprintf (st," x(ffffffff)");
-      else {
-         if ( GetLength() !=0 )        
-            sprintf(st," x(%x)", atoi(v.c_str()));//FIXME
-        else
-         sprintf(st," "); 
+
+      guint16 z=0;
+      guint16 shortLgr = lgr;
+      if (vr == "unkn") {     // Unknown was 'written'
+         // deal with Little Endian            
+         fwrite ( &shortLgr,(size_t)2 ,(size_t)1 ,fp);
+         fwrite ( &z,  (size_t)2 ,(size_t)1 ,fp);
+      } else {
+         fwrite (vr.c_str(),(size_t)2 ,(size_t)1 ,fp); 
+                  
+         if ( (vr == "OB") || (vr == "OW") || (vr == "SQ") )
+         {
+            fwrite ( &z,  (size_t)2 ,(size_t)1 ,fp);
+            if (vr == "SQ") {
+            // we set SQ length to ffffffff
+            // and  we shall write a Sequence Delimitor Item 
+            // at the end of the Sequence! 
+               fwrite ( &FFFF,(size_t)4 ,(size_t)1 ,fp);
+            } else {
+               fwrite ( &lgr,(size_t)4 ,(size_t)1 ,fp);
+            }
+         } else {
+            fwrite ( &shortLgr,(size_t)2 ,(size_t)1 ,fp);
+         }
       }
-      s << st;
+   } 
+   else // IMPLICIT VR 
+   { 
+      if (vr == "SQ") {
+          fwrite ( &FFFF,(size_t)4 ,(size_t)1 ,fp);
+       } else {
+          fwrite ( &lgr,(size_t)4 ,(size_t)1 ,fp);
+       }
    }
-   s << std::endl;
-   os << s.str();
-   
-   */
 }
 
 //-----------------------------------------------------------------------------
@@ -140,11 +184,11 @@ void gdcmDocEntry::Print(std::ostream & os) {
 
 /**
  * \ingroup gdcmDocEntry
- * \brief   Gets the full length of the DocEntry (not only value length)
+ * \brief   Gets the full length of the elementary DocEntry (not only value length)
  */
 guint32 gdcmDocEntry::GetFullLength(void) {
    guint32 l;
-   l = GetLength();
+   l = GetReadLength();
    if ( IsImplicitVR() ) 
       l = l + 8;  // 2 (gr) + 2 (el) + 4 (lgth) 
    else    
@@ -159,7 +203,6 @@ guint32 gdcmDocEntry::GetFullLength(void) {
  * \ingroup gdcmDocEntry
  * \brief   Copies all the attributes from an other DocEntry 
  */
-
 void gdcmDocEntry::Copy (gdcmDocEntry* e) {
    this->entry        = e->entry;
    this->UsableLength = e->UsableLength;
@@ -167,16 +210,25 @@ void gdcmDocEntry::Copy (gdcmDocEntry* e) {
    this->ImplicitVR   = e->ImplicitVR;
    this->Offset       = e->Offset;
    this->printLevel   = e->printLevel;
-   this->SQDepthLevel = e->SQDepthLevel;      
+   // TODO : remove gdcmDocEntry SQDepth
 }
 
+/**
+ * \ingroup gdcmDocEntry
+ * \brief   tells us if entry is the last one of a 'no length' SequenceItem 
+ *          (fffe,e00d) 
+ */
 bool gdcmDocEntry::isItemDelimitor() {
    if ( (GetGroup() == 0xfffe) && (GetElement() == 0xe00d) )
       return true;
    else
       return false;      
 }
-
+/**
+ * \ingroup gdcmDocEntry
+ * \brief   tells us if entry is the last one of a 'no length' Sequence 
+ *          (fffe,e0dd) 
+ */
 bool gdcmDocEntry::isSequenceDelimitor() {
    if (GetGroup() == 0xfffe && GetElement() == 0xe0dd)
       return true;