Program: gdcm
Module: $RCSfile: gdcmSQItem.cxx,v $
Language: C++
- Date: $Date: 2005/10/27 09:52:33 $
- Version: $Revision: 1.78 $
+ Date: $Date: 2007/08/29 15:30:49 $
+ Version: $Revision: 1.87 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
#include <fstream>
-namespace gdcm
+namespace GDCM_NAME_SPACE
{
//-----------------------------------------------------------------------------
// Constructor / Destructor
* @param fp file pointer to an already open file.
* @param filetype type of the file (ACR, ImplicitVR, ExplicitVR, ...)
*/
-void SQItem::WriteContent(std::ofstream *fp, FileType filetype)
+void SQItem::WriteContent(std::ofstream *fp, FileType filetype,
+ bool insideMetaElements, bool dummy2)
{
int j;
uint16_t item[4] = { 0xfffe, 0xe000, 0xffff, 0xffff };
- uint16_t itemt[4]= { 0xfffe, 0xe00d, 0xffff, 0xffff };
+ uint16_t itemt[4]= { 0xfffe, 0xe00d, 0x0000, 0x0000 };
//we force the writting of an 'Item' Start Element
- // because we want to write the Item as a 'no Length' item
+ // because we want to write the Item as a 'No Length' item
for(j=0;j<4;++j)
{
binary_write( *fp, item[j]); // fffe e000 ffff ffff
// --> makes no difference since the only bugged file we have
// contains 'impossible tag' fffe|0000 in last position !
}
-
- (*it)->WriteContent(fp, filetype);
+ // false : we are not in MetaElements
+ // true : we are inside a Sequence
+ (*it)->WriteContent(fp, filetype, false, true);
}
//we force the writting of an 'Item Delimitation' item
// because we wrote the Item as a 'no Length' item
for(j=0;j<4;++j)
{
- binary_write( *fp, itemt[j]); // fffe e000 ffff ffff
+ binary_write( *fp, itemt[j]); // fffe e000 0000 0000
}
}
+/**
+ * \brief Compute the full length of the SQItem (not only value length)
+ * depending on the VR.
+ */
+uint32_t SQItem::ComputeFullLength()
+{
+ uint32_t l = 8; // Item Starter length
+ for (ListDocEntry::iterator it = DocEntries.begin();
+ it != DocEntries.end();
+ ++it)
+ {
+ // we skip delimitors (start and end one) because
+ // we force them as 'no length'
+ if ( (*it)->GetGroup() == 0xfffe )
+ {
+ continue;
+ }
+ l += (*it)->ComputeFullLength();
+ }
+ l += 8; // 'Item Delimitation' item
+ return l;
+}
+
/**
* \brief Inserts *in the right place* any Entry (Dicom Element)
* into the Sequence Item
++it;
insertSpot = it;
- //++insertSpot; // ?!?
DocEntries.insert(insertSpot, entry);
entry->Register();
return true;
DocEntries.clear();
}
-/**
- * \brief Move all the entries from a given Sequence Item
- */
-void SQItem::MoveObject(SQItem *source)
-{
- DocEntries = source->DocEntries;
- source->DocEntries.clear();
-}
-
/**
* \brief Get the first Dicom entry while visiting the SQItem
* \return The first DocEntry if found, otherwhise 0
return NULL;
}
+/**
+ * \brief Copies all the attributes from an other DocEntrySet
+ * @param set entry to copy from
+ * @remarks The contained DocEntries a not copied, only referenced
+ */
+void SQItem::Copy(DocEntrySet *set)
+{
+ // Remove all previous entries
+ ClearEntry();
+
+ DocEntrySet::Copy(set);
+
+ SQItem *sq = dynamic_cast<SQItem *>(set);
+ if( sq )
+ {
+ SQDepthLevel = sq->SQDepthLevel;
+ SQItemNumber = sq->SQItemNumber;
+
+ DocEntries = sq->DocEntries;
+ for(ItDocEntries = DocEntries.begin();ItDocEntries != DocEntries.end();++ItDocEntries)
+ (*ItDocEntries)->Register();
+ }
+}
+
//-----------------------------------------------------------------------------
// Protected