X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocument.cxx;h=093dd0a31b11d6236edac93839a6abdfd5b5259f;hb=670d3f481aca03bf7eb30586080decaa76517d52;hp=553f2a872982271ac8f0351abbc52b7fcd9b9074;hpb=0ed7d52694776c5af4b91e48f003caed7da4d41f;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 553f2a87..093dd0a3 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/09/07 10:42:30 $ - Version: $Revision: 1.276 $ + Date: $Date: 2005/10/03 16:08:07 $ + Version: $Revision: 1.285 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -264,11 +264,11 @@ bool Document::DoTheLoadingDocumentJob( ) it != UserForceLoadList.end(); ++it) { - d = GetDocEntry( (*it).Group, (*it).Elem); - gdcmWarningMacro( "Force Load " << std::hex << (*it).Group << "|" <<(*it).Elem ); + d = GetDocEntry( (*it).Group, (*it).Elem); + if ( d == NULL) { gdcmWarningMacro( "You asked toForce Load " << std::hex @@ -283,9 +283,11 @@ bool Document::DoTheLoadingDocumentJob( ) continue; } - if ( dynamic_cast(d) ) + BinEntry *b = dynamic_cast(d); + if ( b ) { - LoadEntryBinArea((*it).Group, (*it).Elem); + LoadEntryBinArea(b); + b->SetValue(GDCM_BINLOADED); continue; } @@ -646,11 +648,10 @@ bool Document::CloseFile() } /** - * \brief Writes in a file all the Header Entries (Dicom Elements) + * \brief Writes in a file all the Entries (Dicom Elements) * @param fp file pointer on an already open file (actually: Output File Stream) * @param filetype Type of the File to be written * (ACR-NEMA, ExplicitVR, ImplicitVR) - * @return Always true. */ void Document::WriteContent(std::ofstream *fp, FileType filetype) { @@ -693,12 +694,18 @@ void Document::LoadEntryBinArea(uint16_t group, uint16_t elem) // Search the corresponding DocEntry DocEntry *docElement = GetDocEntry(group, elem); if ( !docElement ) + { + gdcmWarningMacro(std::hex << group << "|" << elem + << "doesn't exist" ); return; - + } BinEntry *binElement = dynamic_cast(docElement); if ( !binElement ) + { + gdcmWarningMacro(std::hex << group << "|" << elem + << "is NOT a BinEntry"); return; - + } LoadEntryBinArea(binElement); } @@ -956,9 +963,12 @@ void Document::ParseDES(DocEntrySet *set, long offset, BinEntry *newBinEntry; SeqEntry *newSeqEntry; VRKey vr; - bool used; + bool used; // will be set to false when something wrong happens to an Entry. + // (Entry will then be deleted) bool delim_mode_intern = delim_mode; bool first = true; + gdcmWarningMacro( "Enter in ParseDES, delim-mode " << delim_mode + << " at offset " << std::hex << offset ); while (true) { if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) @@ -968,6 +978,14 @@ void Document::ParseDES(DocEntrySet *set, long offset, newDocEntry = ReadNextDocEntry( ); + // FIXME : + // Private tag, in IMplicit VR are defaulted as a BinEntry, + // Very often they are only composed of Printable characters, + // and could be defaulted as a ValEntry. + // It's too late to do the Job + // (we should check the value, but we know it after LoadDocEntry ...) + // --> in next gdcm major release let's unify ValEntry and BinEntry ! + // Uncoment this printf line to be able to 'follow' the DocEntries // when something *very* strange happens @@ -980,7 +998,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, break; } - // an Item Starter found elsewhere but the first postition + // an Item Starter found elsewhere but the first position // of a SeqEntry means previous entry was a Sequence // but we didn't get it (private Sequence + Implicit VR) // we have to backtrack. @@ -1093,16 +1111,17 @@ void Document::ParseDES(DocEntrySet *set, long offset, { lgrGroup = atoi(strLgrGroup.c_str()); Fp->seekg(lgrGroup, std::ios::cur); - used = false; - RemoveEntry( newDocEntry ); - newDocEntry = 0; + //used = false; // never used + RemoveEntry( newDocEntry ); // Remove and delete + // bcc 5.5 is right "assigned a value that's never used" + // newDocEntry = 0; continue; } } } } - bool delimitor=newValEntry->IsItemDelimitor(); + bool delimitor = newValEntry->IsItemDelimitor(); if ( (delimitor) || (!delim_mode && ((long)(Fp->tellg())-offset) >= l_max) ) @@ -1139,7 +1158,8 @@ void Document::ParseDES(DocEntrySet *set, long offset, if ( newDocEntry->GetGroup()%2 != 0 ) { Fp->seekg( l, std::ios::cur); - used = false; + RemoveEntry( newDocEntry ); // Remove and delete + //used = false; // never used continue; } } @@ -1147,7 +1167,8 @@ void Document::ParseDES(DocEntrySet *set, long offset, { // User asked to skip *any* SeQuence Fp->seekg( l, std::ios::cur); - used = false; + //used = false; // never used + RemoveEntry( newDocEntry ); // Remove and delete continue; } // delay the dynamic cast as late as possible @@ -1181,9 +1202,17 @@ void Document::ParseDES(DocEntrySet *set, long offset, if ( l != 0 ) { // Don't try to parse zero-length sequences + + gdcmWarningMacro( "Entry in ParseSQ, delim " << delim_mode_intern + << " at offset " << std::hex + << newDocEntry->GetOffset() ); + ParseSQ( newSeqEntry, newDocEntry->GetOffset(), l, delim_mode_intern); + + gdcmWarningMacro( "Exit from ParseSQ, delim " << delim_mode_intern); + } if ( !set->AddEntry( newSeqEntry ) ) { @@ -1194,7 +1223,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, used = false; } - if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) + if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { if ( !used ) delete newDocEntry; @@ -1208,6 +1237,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, } first = false; } // end While + gdcmWarningMacro( "Exit from ParseDES, delim-mode " << delim_mode ); } /** @@ -1325,8 +1355,6 @@ return newEntry; * \brief Loads (or not) the element content depending if its length exceeds * or not the value specified with Document::SetMaxSizeLoadEntry() * @param entry Header Entry (Dicom Element) to be dealt with - * @param forceLoad wheter we want to load its content even if its length - * exceeds the value specified with Document::SetMaxSizeLoadEntry() */ void Document::LoadDocEntry(DocEntry *entry, bool forceLoad) { @@ -1683,7 +1711,7 @@ std::string Document::FindDocEntryVR() * and the taken VR. If they are different, the header entry is * updated with the new VR. * @param vr Dicom Value Representation - * @return false if the VR is incorrect of if the VR isn't referenced + * @return false if the VR is incorrect or if the VR isn't referenced * otherwise, it returns true */ bool Document::CheckDocEntryVR(VRKey vr) @@ -2169,7 +2197,7 @@ bool Document::CheckSwap() Filetype = ACR; return true; default : - gdcmWarningMacro( "ACR/NEMA unfound swap info (Really hopeless !)"); + gdcmWarningMacro("ACR/NEMA unfound swap info (Really hopeless !)"); Filetype = Unknown; return false; } @@ -2202,7 +2230,7 @@ void Document::SwitchByteSwapCode() } /** - * \brief during parsing, Header Elements too long are not loaded in memory + * \brief during parsing, Header Elements too long are not loaded in memory * @param newSize new size */ void Document::SetMaxSizeLoadEntry(long newSize) @@ -2236,7 +2264,7 @@ DocEntry *Document::ReadNextDocEntry() group = ReadInt16(); elem = ReadInt16(); } - catch ( FormatError e ) + catch ( FormatError ) { // We reached the EOF (or an error occured) therefore // header parsing has to be considered as finished. @@ -2256,7 +2284,15 @@ DocEntry *Document::ReadNextDocEntry() if ( vr == GDCM_UNKNOWN ) { if ( elem == 0x0000 ) // Group Length + { realVR = "UL"; // must be UL + } + else if (group%2 == 1 && (elem >= 0x0010 && elem <=0x00ff )) + { + // DICOM PS 3-5 7.8.1 a) states that those + // (gggg-0010->00FF where gggg is odd) attributes have to be LO + realVR = "LO"; + } else { DictEntry *dictEntry = GetDictEntry(group,elem); @@ -2271,9 +2307,9 @@ DocEntry *Document::ReadNextDocEntry() if ( Global::GetVR()->IsVROfSequence(realVR) ) newEntry = NewSeqEntry(group, elem); else if ( Global::GetVR()->IsVROfStringRepresentable(realVR) ) - newEntry = NewValEntry(group, elem,vr); + newEntry = NewValEntry(group, elem, realVR); else - newEntry = NewBinEntry(group, elem,vr); + newEntry = NewBinEntry(group, elem, realVR); if ( vr == GDCM_UNKNOWN ) { @@ -2297,7 +2333,7 @@ DocEntry *Document::ReadNextDocEntry() { FindDocEntryLength(newEntry); } - catch ( FormatError e ) + catch ( FormatError ) { // Call it quits delete newEntry; @@ -2335,6 +2371,22 @@ void Document::HandleBrokenEndian(uint16_t &group, uint16_t &elem) reversedEndian--; SwitchByteSwapCode(); } + else if (group == 0xfeff && elem == 0xdde0) + { + // reversed Sequence Terminator found + // probabely a bug in the header ! + // Do what you want, it breaks ! + //reversedEndian--; + //SwitchByteSwapCode(); + gdcmWarningMacro( "Should never get here! reversed Sequence Terminator!" ); + // fix the tag + group = 0xfffe; + elem = 0xe0dd; + } + else if (group == 0xfffe && elem == 0xe0dd) + { + gdcmWarningMacro( "Straight Sequence Terminator." ); + } } /**