From: regrain Date: Thu, 6 Jan 2005 17:16:15 +0000 (+0000) Subject: * src/gdcmDocument.[h|cxx] : remove all copy of DocEntry when parsing a file X-Git-Tag: Version1.0.bp~466 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=ac626b1dfb536a0fbf8eae7d3270daceaecb5bda;p=gdcm.git * src/gdcmDocument.[h|cxx] : remove all copy of DocEntry when parsing a file -- BeNours --- diff --git a/ChangeLog b/ChangeLog index 3bf56a4d..59fa0283 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2005-01-06 Benoit Regrain + * src/gdcmDocument.[h|cxx] : remove all copy of DocEntry when parsing a file + 2005-01-06 Benoit Regrain * src/gdcmDocEntrySet.[h|cxx], gdcmDocument.[h|cxx] : amelioration of ValEntry, BinEntry, SeqEntry creation or replace diff --git a/Testing/TestVR.cxx b/Testing/TestVR.cxx index 8fa9348d..1087e1bb 100644 --- a/Testing/TestVR.cxx +++ b/Testing/TestVR.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: TestVR.cxx,v $ Language: C++ - Date: $Date: 2004/11/16 04:28:20 $ - Version: $Revision: 1.2 $ + Date: $Date: 2005/01/06 17:16:15 $ + Version: $Revision: 1.3 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -22,8 +22,9 @@ int TestVR(int , char *[]) gdcm::VR vr; // There should be 16 entries vr.Print( std::cout ); - vr.IsVROfGdcmStringRepresentable( "" ); - vr.IsVROfGdcmBinaryRepresentable( "" ); + vr.IsVROfStringRepresentable( "" ); + vr.IsVROfBinaryRepresentable( "" ); + vr.IsVROfSequence( "" ); return 0; } diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 0098a572..4935b4ca 100644 --- a/src/gdcmDocument.cxx +++ b/src/gdcmDocument.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocument.cxx,v $ Language: C++ - Date: $Date: 2005/01/06 16:33:54 $ - Version: $Revision: 1.159 $ + Date: $Date: 2005/01/06 17:16:15 $ + Version: $Revision: 1.160 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -78,7 +78,7 @@ static const char *TransferSyntaxStrings[] = { // Unknown "Unknown Transfer Syntax" }; - + //----------------------------------------------------------------------------- // Refer to Document::CheckSwap() //const unsigned int Document::HEADER_LENGTH_TO_READ = 256; @@ -1256,6 +1256,12 @@ void Document::ParseDES(DocEntrySet *set, long offset, long l_max, bool delim_mode) { DocEntry *newDocEntry = 0; + ValEntry* newValEntry; + BinEntry* newBinEntry; + SeqEntry* newSeqEntry; + VRKey vr; + bool used=false; + long offsetEntry,readEntry; while (true) { @@ -1263,23 +1269,61 @@ void Document::ParseDES(DocEntrySet *set, long offset, { break; } + + used=true; newDocEntry = ReadNextDocEntry( ); if ( !newDocEntry ) { break; } - VRKey vr = newDocEntry->GetVR(); - if ( vr != "SQ" ) + vr = newDocEntry->GetVR(); + newValEntry = dynamic_cast(newDocEntry); + newBinEntry = dynamic_cast(newDocEntry); + newSeqEntry = dynamic_cast(newDocEntry); + + if ( newValEntry || newBinEntry ) { + offsetEntry=newDocEntry->GetOffset(); + readEntry=newDocEntry->GetReadLength(); - if ( Global::GetVR()->IsVROfGdcmStringRepresentable(vr) ) + if ( newBinEntry ) + { + if ( ! Global::GetVR()->IsVROfBinaryRepresentable(vr) ) + { + ////// Neither ValEntry NOR BinEntry: should mean UNKOWN VR + dbg.Verbose(0, "Document::ParseDES: neither Valentry, " + "nor BinEntry. Probably unknown VR."); + } + + //////////////////// BinEntry or UNKOWN VR: + // When "this" is a Document the Key is simply of the + // form ( group, elem )... + if (Document* dummy = dynamic_cast< Document* > ( set ) ) + { + (void)dummy; + newBinEntry->SetKey( newBinEntry->GetKey() ); + } + // but when "this" is a SQItem, we are inserting this new + // valEntry in a sequence item, and the kay has the + // generalized form (refer to \ref BaseTagKey): + if (SQItem* parentSQItem = dynamic_cast< SQItem* > ( set ) ) + { + newBinEntry->SetKey( parentSQItem->GetBaseTagKey() + + newBinEntry->GetKey() ); + } + + LoadDocEntry( newBinEntry ); + if( !set->AddEntry( newBinEntry ) ) + { + //Expect big troubles if here + //delete newBinEntry; + used=false; + } + } + else { /////////////////////// ValEntry - ValEntry* newValEntry = - new ValEntry( newDocEntry->GetDictEntry() ); //LEAK - newValEntry->Copy( newDocEntry ); - // When "set" is a Document, then we are at the top of the // hierarchy and the Key is simply of the form ( group, elem )... if (Document* dummy = dynamic_cast< Document* > ( set ) ) @@ -1301,55 +1345,23 @@ void Document::ParseDES(DocEntrySet *set, long offset, if( !set->AddEntry( newValEntry ) ) { // If here expect big troubles - delete newValEntry; //otherwise mem leak + //delete newValEntry; //otherwise mem leak + used=false; } if (delimitor) { - delete newDocEntry; + if(!used) + delete newDocEntry; break; } if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { - delete newDocEntry; + if(!used) + delete newDocEntry; break; } } - else - { - if ( ! Global::GetVR()->IsVROfGdcmBinaryRepresentable(vr) ) - { - ////// Neither ValEntry NOR BinEntry: should mean UNKOWN VR - dbg.Verbose(0, "Document::ParseDES: neither Valentry, " - "nor BinEntry. Probably unknown VR."); - } - - //////////////////// BinEntry or UNKOWN VR: - BinEntry* newBinEntry = new BinEntry( newDocEntry ); //LEAK - - // When "this" is a Document the Key is simply of the - // form ( group, elem )... - if (Document* dummy = dynamic_cast< Document* > ( set ) ) - { - (void)dummy; - newBinEntry->SetKey( newBinEntry->GetKey() ); - } - // but when "this" is a SQItem, we are inserting this new - // valEntry in a sequence item, and the kay has the - // generalized form (refer to \ref BaseTagKey): - if (SQItem* parentSQItem = dynamic_cast< SQItem* > ( set ) ) - { - newBinEntry->SetKey( parentSQItem->GetBaseTagKey() - + newBinEntry->GetKey() ); - } - - LoadDocEntry( newBinEntry ); - if( !set->AddEntry( newBinEntry ) ) - { - //Expect big troubles if here - delete newBinEntry; - } - } if ( ( newDocEntry->GetGroup() == 0x7fe0 ) && ( newDocEntry->GetElement() == 0x0010 ) ) @@ -1357,23 +1369,22 @@ void Document::ParseDES(DocEntrySet *set, long offset, TransferSyntaxType ts = GetTransferSyntax(); if ( ts == RLELossless ) { - long PositionOnEntry = Fp->tellg(); + long positionOnEntry = Fp->tellg(); Fp->seekg( newDocEntry->GetOffset(), std::ios::beg ); ComputeRLEInfo(); - Fp->seekg( PositionOnEntry, std::ios::beg ); + Fp->seekg( positionOnEntry, std::ios::beg ); } else if ( IsJPEG() ) { - long PositionOnEntry = Fp->tellg(); + long positionOnEntry = Fp->tellg(); Fp->seekg( newDocEntry->GetOffset(), std::ios::beg ); ComputeJPEGFragmentInfo(); - Fp->seekg( PositionOnEntry, std::ios::beg ); + Fp->seekg( positionOnEntry, std::ios::beg ); } } // Just to make sure we are at the beginning of next entry. - SkipToNextDocEntry(newDocEntry); - //delete newDocEntry; + SkipToNextDocEntry(offsetEntry,readEntry); } else { @@ -1391,9 +1402,6 @@ void Document::ParseDES(DocEntrySet *set, long offset, } } // no other way to create it ... - SeqEntry* newSeqEntry = - new SeqEntry( newDocEntry->GetDictEntry() ); - newSeqEntry->Copy( newDocEntry ); newSeqEntry->SetDelimitorMode( delim_mode ); // At the top of the hierarchy, stands a Document. When "set" @@ -1425,11 +1433,12 @@ void Document::ParseDES(DocEntrySet *set, long offset, set->AddEntry( newSeqEntry ); if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { - delete newDocEntry; break; } } - delete newDocEntry; + + if(!used) + delete newDocEntry; } } @@ -1996,10 +2005,10 @@ void Document::SkipDocEntry(DocEntry *entry) * \warning NOT end user intended method ! * @param entry entry to skip */ -void Document::SkipToNextDocEntry(DocEntry *entry) +void Document::SkipToNextDocEntry(long offset,long readLgth) { - Fp->seekg((long)(entry->GetOffset()), std::ios::beg); - Fp->seekg( (long)(entry->GetReadLength()), std::ios::cur); + Fp->seekg((long)(offset), std::ios::beg); + Fp->seekg( (long)(readLgth), std::ios::cur); } /** @@ -2578,9 +2587,24 @@ DocEntry* Document::ReadNextDocEntry() } HandleBrokenEndian(group, elem); - std::string vr=FindDocEntryVR(); + std::string vr = FindDocEntryVR(); + std::string realVR = vr; + + if( vr == GDCM_UNKNOWN) + { + DictEntry *dictEntry = GetDictEntryByNumber(group,elem); + if( dictEntry ) + realVR = dictEntry->GetVR(); + } + + DocEntry *newEntry; + if( Global::GetVR()->IsVROfSequence(realVR) ) + newEntry = NewSeqEntryByNumber(group, elem); + else if( Global::GetVR()->IsVROfStringRepresentable(realVR) ) + newEntry = NewValEntryByNumber(group, elem,vr); + else + newEntry = NewBinEntryByNumber(group, elem,vr); - DocEntry *newEntry = NewDocEntryByNumber(group, elem, vr); if( vr == GDCM_UNKNOWN ) { if( Filetype == ExplicitVR ) diff --git a/src/gdcmDocument.h b/src/gdcmDocument.h index 6b3a7bbc..09ba91d8 100644 --- a/src/gdcmDocument.h +++ b/src/gdcmDocument.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocument.h,v $ Language: C++ - Date: $Date: 2005/01/06 15:36:48 $ - Version: $Revision: 1.73 $ + Date: $Date: 2005/01/06 17:16:16 $ + Version: $Revision: 1.74 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -219,7 +219,7 @@ private: std::string GetDocEntryUnvalue(DocEntry *); void SkipDocEntry (DocEntry *); - void SkipToNextDocEntry (DocEntry *); + void SkipToNextDocEntry (long offset,long readLgth); void FixDocEntryFoundLength(DocEntry *, uint32_t); bool IsDocEntryAnInteger (DocEntry *); diff --git a/src/gdcmVR.cxx b/src/gdcmVR.cxx index 66006a86..9e032195 100644 --- a/src/gdcmVR.cxx +++ b/src/gdcmVR.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmVR.cxx,v $ Language: C++ - Date: $Date: 2005/01/06 13:35:38 $ - Version: $Revision: 1.25 $ + Date: $Date: 2005/01/06 17:16:16 $ + Version: $Revision: 1.26 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -112,7 +112,7 @@ int VR::Count(VRKey const & key) * \ref VR::IsVROfGdcmStringRepresentable . * @param tested value representation to check for. */ -bool VR::IsVROfGdcmBinaryRepresentable(VRKey const & tested) +bool VR::IsVROfBinaryRepresentable(VRKey const & tested) { //std::cout << "VR::IsVROfGdcmBinaryRepresentable====================" // << tested << std::endl; @@ -120,59 +120,51 @@ bool VR::IsVROfGdcmBinaryRepresentable(VRKey const & tested) if ( tested == GDCM_UNKNOWN) return true; - if ( ! IsValidVR(tested) ) - { - dbg.Verbose(0, "VR::IsVROfGdcmBinaryRepresentable: tested not a VR!"); + if ( IsVROfStringRepresentable(tested) ) return false; - } - if ( IsVROfGdcmStringRepresentable(tested) ) - { - dbg.Verbose(0, "VR::IsVROfGdcmBinaryRepresentable: binary VR !"); + if ( IsVROfSequence(tested) ) return false; - } return true; } -//----------------------------------------------------------------------------- /** * \brief Simple predicate that checks wether the given argument * corresponds to the Value Representation of a \ref ValEntry * but NOT a \ref BinEntry. * @param tested value representation to check for. */ -bool VR::IsVROfGdcmStringRepresentable(VRKey const & tested) +bool VR::IsVROfStringRepresentable(VRKey const & tested) { + return tested == "AE" || + tested == "AS" || + tested == "CS" || + tested == "DA" || + tested == "DS" || + tested == "IS" || + tested == "LO" || + tested == "LT" || + tested == "PN" || + tested == "SH" || + tested == "SL" || + tested == "SS" || + tested == "ST" || + tested == "TM" || + tested == "UI" || + tested == "UL" || + tested == "UN" || + tested == "US"; +} - if ( ! IsValidVR(tested) ) - { - dbg.Verbose(0, "VR::IsVROfGdcmStringRepresentable: tested not a VR!"); - return false; - } - - if ( tested == "AE" || - tested == "AS" || - tested == "CS" || - tested == "DA" || - tested == "DS" || - tested == "IS" || - tested == "LO" || - tested == "LT" || - tested == "PN" || - tested == "SH" || - tested == "SL" || - tested == "SS" || - tested == "ST" || - tested == "TM" || - tested == "UI" || - tested == "UL" || - tested == "UN" || - tested == "US" ) - { - return true; - } - return false; +/** + * \brief Simple predicate that checks wether the given argument + * corresponds to the Value Representation of a \ref SeqEntry + * @param tested value representation to check for. + */ +bool VR::IsVROfSequence(VRKey const & tested) +{ + return tested == "SQ"; } bool VR::IsValidVR(VRKey const & key) diff --git a/src/gdcmVR.h b/src/gdcmVR.h index bef9882b..0c658b64 100644 --- a/src/gdcmVR.h +++ b/src/gdcmVR.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmVR.h,v $ Language: C++ - Date: $Date: 2005/01/06 13:35:38 $ - Version: $Revision: 1.15 $ + Date: $Date: 2005/01/06 17:16:16 $ + Version: $Revision: 1.16 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -46,8 +46,9 @@ public: void Print(std::ostream &os = std::cout); int Count(VRKey const & key); - bool IsVROfGdcmBinaryRepresentable(VRKey const & tested); - bool IsVROfGdcmStringRepresentable(VRKey const & tested); + bool IsVROfBinaryRepresentable(VRKey const & tested); + bool IsVROfStringRepresentable(VRKey const & tested); + bool IsVROfSequence(VRKey const & tested); bool IsValidVR(VRKey const & key);