Program: gdcm
Module: $RCSfile: gdcmDocument.cxx,v $
Language: C++
- Date: $Date: 2005/07/11 20:47:00 $
- Version: $Revision: 1.264 $
+ Date: $Date: 2005/08/23 12:57:49 $
+ Version: $Revision: 1.265 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
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<ValEntry*>(newDocEntry);
newBinEntry = dynamic_cast<BinEntry*>(newDocEntry);
if ( !set->AddEntry( newBinEntry ) )
{
gdcmWarningMacro( "in ParseDES : cannot add a BinEntry "
- << newBinEntry->GetKey() );
+ << newBinEntry->GetKey()
+ << " (at offset : "
+ << newBinEntry->GetOffset() << " )" );
used=false;
}
else
// + 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;
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 (offset!=132)
+ {
+ gdcmWarningMacro( "in ParseDES : Item found out of a Sequence "
+ << newValEntry->GetKey()
+ << " (at offset : "
+ << newValEntry->GetOffset() << " )" );
+ }
if ( !used )
delete newDocEntry;
break;
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
}
*/
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);
+ }
}
/**
{
DictEntry *dictEntry = GetDictEntry(group,elem);
if ( dictEntry )
+ {
realVR = dictEntry->GetVR();
+ }
}
}