]> Creatis software - gdcm.git/blobdiff - src/gdcmSeqEntry.cxx
* Fix compilation warnings
[gdcm.git] / src / gdcmSeqEntry.cxx
index feadac76014a59750648d2d726136533ce882010..dd5c582abe4c58dd25022703f9e4fa3ed3af3359 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmSeqEntry.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/31 12:19:34 $
-  Version:   $Revision: 1.51 $
+  Date:      $Date: 2005/11/29 12:48:47 $
+  Version:   $Revision: 1.63 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -29,7 +29,6 @@
 
 namespace gdcm 
 {
-
 //-----------------------------------------------------------------------------
 // Constructor / Destructor
 /**
@@ -47,7 +46,7 @@ SeqEntry::SeqEntry( DictEntry *e )
 }
 
 /**
- * \brief   Constructor from a given SeqEntry
+ * \brief   Constructor from a given DocEntry
  * @param   e Pointer to existing Doc entry
  * @param   depth depth level of the current Seq entry
  */
@@ -68,57 +67,7 @@ SeqEntry::SeqEntry( DocEntry *e, int depth )
  */
 SeqEntry::~SeqEntry()
 {
-   for(ListSQItem::iterator cc = Items.begin(); cc != Items.end(); ++cc)
-   {
-      delete *cc;
-   }
-   if (SeqTerm)
-   {
-      delete SeqTerm;
-   }
-}
-
-//-----------------------------------------------------------------------------
-// Print
-/**
- * \brief   canonical Printer
- */
-void SeqEntry::Print( std::ostream &os, std::string const & )
-{
-   // First, Print the Dicom Element itself.
-   os << "S ";
-   DocEntry::Print(os);
-   os << std::endl;
-
-   if (GetReadLength() == 0)
-      return;
-
-   // Then, Print each SQ Item   
-   for(ListSQItem::iterator cc = Items.begin(); cc != Items.end(); ++cc)
-   {
-      (*cc)->SetPrintLevel(PrintLevel);
-      (*cc)->Print(os);   
-   }
-
-   // at end, print the sequence terminator item, if any
-   if (DelimitorMode)
-   {
-      for ( int i = 0; i < SQDepthLevel; i++ )
-      {
-         os << "   | " ;
-      }
-      if (SeqTerm != NULL)
-      {
-         SeqTerm->SetPrintLevel(PrintLevel);
-         SeqTerm->Print(os);
-         os << std::endl;
-      } 
-      else 
-      {
-         // fuse
-         gdcmVerboseMacro("  -------- should have a sequence terminator item");
-      }
-   }                    
+   ClearSQItem();
 }
 
 //-----------------------------------------------------------------------------
@@ -133,10 +82,11 @@ void SeqEntry::WriteContent(std::ofstream *fp, FileType filetype)
    uint16_t seq_term_gr = 0xfffe;
    uint16_t seq_term_el = 0xe0dd;
    uint32_t seq_term_lg = 0xffffffff;
-
-   //uint16_t item_term_gr = 0xfffe;
-   //uint16_t item_term_el = 0xe00d;
-   
+   // ignore 'Zero length' Sequences
+   if ( GetReadLength() == 0 )
+      return;
+       
    DocEntry::WriteContent(fp, filetype);
    for(ListSQItem::iterator cc  = Items.begin();
                             cc != Items.end();
@@ -152,6 +102,56 @@ void SeqEntry::WriteContent(std::ofstream *fp, FileType filetype)
    binary_write(*fp, seq_term_lg);
 }
 
+/**
+ * \brief   Compute the full length of the SeqEntry (not only value
+ *          length) depending on the VR.
+ */
+uint32_t SeqEntry::ComputeFullLength()
+{
+   uint32_t l = 12; // Tag (4) + VR (explicit) 4 + 4 (length);   
+   for(ListSQItem::iterator cc  = Items.begin();
+                            cc != Items.end();
+                          ++cc)
+   {        
+      l += (*cc)->ComputeFullLength();
+   }   
+   l += 8; // seq_term Tag (4) +  seq_term_lg (4)
+   return l;
+}
+
+/**
+ * \brief   adds the passed ITEM to the ITEM chained List for this SeQuence.
+ * @param sqItem SQItem to be pushed back in the SeqEntry
+ * @param itemNumber ordinal number of the SQItem
+ *  \note NOT end-user intendend method !
+ */
+void SeqEntry::AddSQItem(SQItem *sqItem, int itemNumber)
+{
+// FIXME : SQItemNumber is supposed to be the ordinal number of the SQItem
+//         within the Sequence.
+//         Either only 'push_back' is allowed, 
+//                and we just have to do something like SeqEntry::lastNb++
+//         Or we can add (or remove) anywhere, and SQItemNumber will be broken
+   sqItem->SetSQItemNumber(itemNumber);
+   Items.push_back(sqItem);
+   sqItem->Register();
+}
+
+/**
+ * \brief Remove all SQItem.
+ */
+void SeqEntry::ClearSQItem()
+{
+   for(ListSQItem::iterator cc = Items.begin(); cc != Items.end(); ++cc)
+   {
+      (*cc)->Unregister();
+   }
+   if (SeqTerm)
+   {
+      SeqTerm->Unregister();
+   }
+}
+
 /**
  * \brief   Get the first entry while visiting the SeqEntry
  * \return  The first SQItem if found, otherwhise NULL
@@ -206,34 +206,108 @@ SQItem *SeqEntry::GetSQItem(int nb)
    return *(Items.end());
 }
 
-/// \brief returns the number of SQItems within the current Sequence
+/**
+ * \brief returns the number of SQItems within the current Sequence
+ */
 unsigned int SeqEntry::GetNumberOfSQItems()
 {
    return Items.size();
 }
 
-/// \brief   adds the passed ITEM to the ITEM chained List for this SeQuence.
-/// @param sqItem SQItem to be pushed back in the SeqEntry
-/// @param itemNumber ordinal number of the SQItem
-/// \note NOT end-user intendend method !
-void SeqEntry::AddSQItem(SQItem *sqItem, int itemNumber)
+/**
+ * \brief Sets the Sequence Delimitation Item
+ * \param e Delimitation item
+ */
+void SeqEntry::SetDelimitationItem(DocEntry *e)
 {
-// FIXME : SQItemNumber is supposed to be the ordinal number of the SQItem
-//         within the Sequence.
-//         Either only 'push_back' is allowed, 
-//                and we just have to do something like SeqEntry::lastNb++
-//         Or we can add (or remove) anywhere, and SQItemNumber will be broken
-   sqItem->SetSQItemNumber(itemNumber);
-   Items.push_back(sqItem);
+   if( SeqTerm != e )
+   {
+      if( SeqTerm )
+         SeqTerm->Unregister();
+      SeqTerm = e;
+      if( SeqTerm )
+         SeqTerm->Register();
+   }
+}
+
+/**
+ * \brief Copies all the attributes from an other DocEntry 
+ * @param doc entry to copy from
+ * @remarks The contained SQItems a not copied, only referenced
+ */
+void SeqEntry::Copy(DocEntry *doc)
+{
+   // Delete previous SQ items
+   ClearSQItem();
+
+   DocEntry::Copy(doc);
+   SeqEntry *entry = dynamic_cast<SeqEntry *>(doc);
+   if ( entry )
+   {
+      DelimitorMode = entry->DelimitorMode;
+      SQDepthLevel = entry->SQDepthLevel;
+
+      SeqTerm = entry->SeqTerm;
+      if(SeqTerm)
+         SeqTerm->Register();
+      Items = entry->Items;
+      for(ItSQItem = Items.begin();ItSQItem != Items.end(); ++ItSQItem)
+      {
+         (*ItSQItem)->Register();
+      }
+   }
 }
 
 //-----------------------------------------------------------------------------
 // Protected
 
-
 //-----------------------------------------------------------------------------
 // Private
 
 //-----------------------------------------------------------------------------
-} // end namespace gdcm
+// Print
+/**
+ * \brief   canonical Printer
+ */
+void SeqEntry::Print( std::ostream &os, std::string const & )
+{
+   // First, Print the Dicom Element itself.
+   os << "S ";
+   DocEntry::Print(os);
+   os << std::endl;
+
+   if (GetReadLength() == 0)
+      return;
+
+   // Then, Print each SQ Item   
+   for(ListSQItem::iterator cc = Items.begin(); cc != Items.end(); ++cc)
+   {
+      (*cc)->SetPrintLevel(PrintLevel);
+      (*cc)->Print(os);   
+   }
+
+   // at end, print the sequence terminator item, if any
+   if (DelimitorMode)
+   {
+      int i;
+      for ( i = 0; i < SQDepthLevel; i++ )
+         os << "   | " ;
+      os << " --- "  << std::endl;
+      for ( i = 0; i < SQDepthLevel; i++ )
+         os << "   | " ;
+      if (SeqTerm != NULL)
+      {
+         SeqTerm->SetPrintLevel(PrintLevel);
+         SeqTerm->Print(os);
+         os << std::endl;
+      } 
+      else 
+      {
+         // fuse
+         gdcmWarningMacro("  -------- should have a sequence terminator item");
+      }
+   }
+}
 
+//-----------------------------------------------------------------------------
+} // end namespace gdcm