X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmSQItem.cxx;h=d5f11db52aa93f8046a37c2e647b9c076af403ce;hb=14da8fbfce99d66af65ee2a6294f90e70a054652;hp=0ed62981aeec4deb87fe99b01256ed36350abb12;hpb=bc69950a406d06c50f0fb75a96572784965cb534;p=gdcm.git diff --git a/src/gdcmSQItem.cxx b/src/gdcmSQItem.cxx index 0ed62981..d5f11db5 100644 --- a/src/gdcmSQItem.cxx +++ b/src/gdcmSQItem.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmSQItem.cxx,v $ Language: C++ - Date: $Date: 2005/10/18 08:35:50 $ - Version: $Revision: 1.76 $ + Date: $Date: 2005/11/21 09:46:27 $ + Version: $Revision: 1.80 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -61,7 +61,7 @@ void SQItem::WriteContent(std::ofstream *fp, FileType filetype) uint16_t itemt[4]= { 0xfffe, 0xe00d, 0xffff, 0xffff }; //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 @@ -99,6 +99,29 @@ void SQItem::WriteContent(std::ofstream *fp, FileType filetype) } } +/** + * \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 @@ -110,6 +133,7 @@ bool SQItem::AddEntry(DocEntry *entry) if (DocEntries.empty() ) { DocEntries.push_back(entry); + entry->Register(); return true; } @@ -131,9 +155,11 @@ bool SQItem::AddEntry(DocEntry *entry) break; } while (it != DocEntries.begin() ); - insertSpot = it++; - insertSpot++; // ?!? + ++it; + insertSpot = it; + //++insertSpot; // ?!? DocEntries.insert(insertSpot, entry); + entry->Register(); return true; } @@ -151,8 +177,8 @@ bool SQItem::RemoveEntry( DocEntry *entryToRemove ) if ( *it == entryToRemove ) { DocEntries.erase(it); - gdcmWarningMacro( "One element erased: " << entryToRemove->GetKey() ); - delete entryToRemove; + gdcmDebugMacro( "One element erased: " << entryToRemove->GetKey() ); + entryToRemove->Unregister(); return true; } } @@ -160,30 +186,6 @@ bool SQItem::RemoveEntry( DocEntry *entryToRemove ) return false ; } -/** - * \brief Clear the std::list from given entry BUT keep the entry. - * @param entryToRemove Entry to remove. - * @return true if the entry was found and removed; false otherwise - */ -bool SQItem::RemoveEntryNoDestroy(DocEntry *entryToRemove) -{ - for(ListDocEntry::iterator it = DocEntries.begin(); - it != DocEntries.end(); - ++it) - { - if ( *it == entryToRemove ) - { - DocEntries.erase(it); - gdcmWarningMacro( "One element removed, no destroyed: " - << entryToRemove->GetKey() ); - return true; - } - } - - gdcmWarningMacro( "Entry not found:" << entryToRemove->GetKey() ); - return false ; -} - /** * \brief Remove all entry in the Sequence Item */ @@ -193,27 +195,18 @@ void SQItem::ClearEntry() cc != DocEntries.end(); ++cc) { - delete *cc; + (*cc)->Unregister(); } DocEntries.clear(); } -/** - * \brief Clear the std::list from given Sequence Item BUT keep the entries - */ -void SQItem::ClearEntryNoDestroy() -{ - DocEntries.clear(); -} - - /** * \brief Move all the entries from a given Sequence Item */ void SQItem::MoveObject(SQItem *source) { DocEntries = source->DocEntries; - source->ClearEntryNoDestroy(); + source->DocEntries.clear(); } /**