X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocument.cxx;h=4511aab548db6c6a17ba7bf003d49fbf75804b8c;hb=a74a07febc4564ab7d9500e20fb02ce637409055;hp=3386f159c86a72b0bc6a036ab8a3e551fcefb18d;hpb=fbd2698cb0545343abc2d8aefe92bab1f5b3eaa3;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 3386f159..4511aab5 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/07/07 16:37:40 $ - Version: $Revision: 1.262 $ + Date: $Date: 2005/08/23 14:41:59 $ + Version: $Revision: 1.266 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -921,6 +921,12 @@ void Document::ParseDES(DocEntrySet *set, long offset, break; } + // Uncoment this printf line to be able to 'follow' the DocEntries + // when something *very* strange happens + + //printf( "%04x|%04x %s\n",newDocEntry->GetGroup(), + // newDocEntry->GetElement(), + // newDocEntry->GetVR().c_str() ); used = true; newValEntry = dynamic_cast(newDocEntry); newBinEntry = dynamic_cast(newDocEntry); @@ -963,7 +969,9 @@ void Document::ParseDES(DocEntrySet *set, long offset, if ( !set->AddEntry( newBinEntry ) ) { gdcmWarningMacro( "in ParseDES : cannot add a BinEntry " - << newBinEntry->GetKey() ); + << newBinEntry->GetKey() + << " (at offset : " + << newBinEntry->GetOffset() << " )" ); used=false; } else @@ -993,13 +1001,25 @@ void Document::ParseDES(DocEntrySet *set, long offset, // + newValEntry->GetKey() ); //} - if ( LoadMode & NO_SHADOW ) // User asked to skip, if possible, - // shadow groups ( if possible : - // whether element 0x0000 exits) + if ( !set->AddEntry( newValEntry ) ) { - if ( newValEntry->GetGroup()%2 != 0 ) + gdcmWarningMacro( "in ParseDES : cannot add a ValEntry " + << newValEntry->GetKey() + << " (at offset : " + << newValEntry->GetOffset() << " )" ); + used=false; + } + else + { + // Load only if we can add (not a duplicate key) + LoadDocEntry( newValEntry ); + } + + if ( newValEntry->GetElement() == 0x0000 ) // if on group length + { + if ( newValEntry->GetGroup()%2 != 0 ) // if Shadow Group { - if ( newValEntry->GetElement() == 0x0000 ) + if ( LoadMode & NO_SHADOW ) // if user asked to skip shad.gr { std::string strLgrGroup = newValEntry->GetValue(); int lgrGroup; @@ -1008,29 +1028,34 @@ void Document::ParseDES(DocEntrySet *set, long offset, lgrGroup = atoi(strLgrGroup.c_str()); Fp->seekg(lgrGroup, std::ios::cur); used = false; + RemoveEntry( newDocEntry ); + newDocEntry = 0; continue; } } } } - if ( !set->AddEntry( newValEntry ) ) - { - gdcmWarningMacro( "in ParseDES : cannot add a ValEntry " - << newValEntry->GetKey() ); - used=false; - } - else - { - // Load only if we can add (not a duplicate key) - LoadDocEntry( newValEntry ); - } - bool delimitor=newValEntry->IsItemDelimitor(); - if ( delimitor || + // FIXME : Brutal patch, waiting till we find a clever way to guess + // if a doc entry is a Sequence, + // - when it's odd number + // - and the file is Implicit VR Transfert Syntax + // + // '&& offset!=132' is a very fierce way to guess + // if we are at zero level (Probabely not enough ...). + // We want to go on parsing. + if ( (delimitor && offset!=132) || (!delim_mode && ((long)(Fp->tellg())-offset) >= l_max) ) { + if (delimitor && offset!=132) + { + gdcmWarningMacro( "in ParseDES : Item found out of a Sequence " + << newValEntry->GetKey() + << " (at offset : " + << newValEntry->GetOffset() << " )" ); + } if ( !used ) delete newDocEntry; break; @@ -1111,20 +1136,24 @@ void Document::ParseDES(DocEntrySet *set, long offset, if ( !set->AddEntry( newSeqEntry ) ) { gdcmWarningMacro( "in ParseDES : cannot add a SeqEntry " - << newSeqEntry->GetKey() ); + << newSeqEntry->GetKey() + << " (at offset : " + << newSeqEntry->GetOffset() << " )" ); used = false; } if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { if ( !used ) - delete newDocEntry; - break; + delete newDocEntry; + break; } } // end SeqEntry : VR = "SQ" if ( !used ) + { delete newDocEntry; + } } // end While } @@ -1714,9 +1743,15 @@ void Document::SkipDocEntry(DocEntry *entry) */ void Document::SkipToNextDocEntry(DocEntry *currentDocEntry) { - Fp->seekg((long)(currentDocEntry->GetOffset()), std::ios::beg); + int l = currentDocEntry->GetReadLength(); + if ( l == -1 ) // length = 0xffff shouldn't appear here ... + // ... but PMS imagers happen ! + return; + Fp->seekg((long)(currentDocEntry->GetOffset()), std::ios::beg); if (currentDocEntry->GetGroup() != 0xfffe) // for fffe pb + { Fp->seekg( (long)(currentDocEntry->GetReadLength()),std::ios::cur); + } } /** @@ -2128,7 +2163,9 @@ DocEntry *Document::ReadNextDocEntry() { DictEntry *dictEntry = GetDictEntry(group,elem); if ( dictEntry ) + { realVR = dictEntry->GetVR(); + } } }