]> Creatis software - gdcm.git/blobdiff - src/gdcmDocEntry.cxx
BUG: Need to lean c++ (bug in g++ ?)
[gdcm.git] / src / gdcmDocEntry.cxx
index 0afb302f29365000ad3a1f872ad36d6393af9bbe..5b1a9f3bc530d230a319e6d6645b58f300d57e3b 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocEntry.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/06/20 18:08:47 $
-  Version:   $Revision: 1.7 $
+  Date:      $Date: 2004/07/02 13:55:27 $
+  Version:   $Revision: 1.13 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -38,25 +38,14 @@ gdcmDocEntry::gdcmDocEntry(gdcmDictEntry* in) {
    entry = in;
 }
 
-/**
- * \ingroup gdcmDocEntry
- * \brief   Canonical Printer
- * @param   os ostream we want to print in
- */
-void gdcmDocEntry::Print(std::ostream & os) {
-   std::ostringstream s;
-   s << std::endl;
-   PrintCommonPart(os);
-   os << s.str();
-}
-
 //-----------------------------------------------------------------------------
 // Print
 /**
  * \ingroup gdcmDocEntry
  * \brief   Prints the common part of gdcmValEntry, gdcmBinEntry, gdcmSeqEntry
+ * @param   os ostream we want to print in
  */
-void gdcmDocEntry::PrintCommonPart(std::ostream & os) {
+void gdcmDocEntry::Print(std::ostream & os) {
 
    printLevel=2; // FIXME
    
@@ -66,7 +55,7 @@ void gdcmDocEntry::PrintCommonPart(std::ostream & os) {
    TSKey v;
    std::string d2, vr;
    std::ostringstream s;
-   guint32 lgth;
+   uint32_t lgth;
    char greltag[10];  //group element tag
 
    g  = GetGroup();
@@ -112,6 +101,85 @@ void gdcmDocEntry::PrintCommonPart(std::ostream & os) {
    os << s.str();      
 }
 
+/**
+ * \ingroup gdcmDocEntry
+ * \brief   Writes the common part of any gdcmValEntry, gdcmBinEntry, gdcmSeqEntry
+ */
+void gdcmDocEntry::Write(FILE *fp, FileType filetype) {
+
+   uint32_t FFFF  = 0xffffffff;
+   uint16_t group = GetGroup();
+   gdcmVRKey vr   = GetVR();
+   uint16_t el    = GetElement();
+   uint32_t 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;
+      }
+
+      uint16_t z=0;
+      uint16_t 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") || (vr == "UN") )
+         {
+            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);
+         }
+      }
+   } 
+   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);
+       }
+   }
+}
+
 //-----------------------------------------------------------------------------
 // Public
 
@@ -119,8 +187,8 @@ void gdcmDocEntry::PrintCommonPart(std::ostream & os) {
  * \ingroup gdcmDocEntry
  * \brief   Gets the full length of the elementary DocEntry (not only value length)
  */
-guint32 gdcmDocEntry::GetFullLength(void) {
-   guint32 l;
+uint32_t gdcmDocEntry::GetFullLength(void) {
+   uint32_t l;
    l = GetReadLength();
    if ( IsImplicitVR() ) 
       l = l + 8;  // 2 (gr) + 2 (el) + 4 (lgth) 
@@ -148,7 +216,8 @@ void gdcmDocEntry::Copy (gdcmDocEntry* e) {
 
 /**
  * \ingroup gdcmDocEntry
- * \brief   tells us if entry is the first one of a Sequence Item (fffe,e00d) 
+ * \brief   tells us if entry is the last one of a 'no length' SequenceItem 
+ *          (fffe,e00d) 
  */
 bool gdcmDocEntry::isItemDelimitor() {
    if ( (GetGroup() == 0xfffe) && (GetElement() == 0xe00d) )
@@ -158,7 +227,8 @@ bool gdcmDocEntry::isItemDelimitor() {
 }
 /**
  * \ingroup gdcmDocEntry
- * \brief   tells us if entry is the last one of a 'no length' Sequence fffe,e0dd) 
+ * \brief   tells us if entry is the last one of a 'no length' Sequence 
+ *          (fffe,e0dd) 
  */
 bool gdcmDocEntry::isSequenceDelimitor() {
    if (GetGroup() == 0xfffe && GetElement() == 0xe0dd)