X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocument.cxx;h=4935b4caa4bd261507abdf8af49be813518e3861;hb=befb2f26b6053ac140ffa008e41d7bb8d7eeafc8;hp=0d865c24849e1da9478cd33a567c1427f8675d28;hpb=4beda181275414e5cba990113f8d16424b2c09e6;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 0d865c24..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 15:36:48 $ - Version: $Revision: 1.157 $ + 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 @@ -47,7 +47,7 @@ namespace gdcm static const char *TransferSyntaxStrings[] = { // Implicit VR Little Endian "1.2.840.10008.1.2", - // Implicit VR Little Endian DLX G.E? + // Implicit VR Big Endian DLX G.E? "1.2.840.113619.5.2", // Explicit VR Little Endian "1.2.840.10008.1.2.1", @@ -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; @@ -937,7 +937,8 @@ bool Document::SetEntryByNumber(uint8_t*content, int lgth, /** * \brief Accesses an existing DocEntry (i.e. a Dicom Element) * and modifies it's content with the given value. - * @param content new value (string) to substitute with + * @param content new value (string) to substitute with + * @param entry Entry to be modified */ bool Document::SetEntry(std::string const & content,ValEntry* entry) { @@ -953,9 +954,10 @@ bool Document::SetEntry(std::string const & content,ValEntry* entry) * \brief Accesses an existing BinEntry (i.e. a Dicom Element) * and modifies it's content with the given value. * @param content new value (void* -> uint8_t*) to substitute with + * @param entry Entry to be modified * @param lgth new value length */ -bool Document::SetEntry(uint8_t* content, int lgth,BinEntry* entry) +bool Document::SetEntry(uint8_t* content, int lgth, BinEntry* entry) { if(entry) { @@ -1254,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) { @@ -1261,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 ) ) @@ -1299,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 ) ) @@ -1355,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 { @@ -1389,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" @@ -1423,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; } } @@ -1801,7 +1812,7 @@ void Document::FindDocEntryLength( DocEntry *entry ) /** * \brief Find the Value Representation of the current Dicom Element. - * @param entry + * @return Value Representation of the current Entry */ std::string Document::FindDocEntryVR() { @@ -1833,7 +1844,6 @@ std::string Document::FindDocEntryVR() * \brief Check the correspondance between the VR of the header entry * and the taken VR. If they are different, the header entry is * updated with the new VR. - * @param entry Header Entry to check * @param vr Dicom Value Representation * @return false if the VR is incorrect of if the VR isn't referenced * otherwise, it returns true @@ -1995,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); } /** @@ -2577,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 )