X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocument.cxx;h=5f6d117066a1b0b01e0bc889ccc336bcad3df691;hb=1f395cbc93181939a4f440b8e8fd3e0ac4962f75;hp=82142ef0b87f4be3d5d9ba9e0018de87f055dd1e;hpb=644b593cd2531a6f7205530c58d967a98817ce12;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 82142ef0..5f6d1170 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/10/18 21:19:57 $ - Version: $Revision: 1.297 $ + Date: $Date: 2005/10/26 06:34:03 $ + Version: $Revision: 1.309 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -277,7 +277,7 @@ bool Document::DoTheLoadingDocumentJob( ) */ void Document::AddForceLoadElement (uint16_t group, uint16_t elem) { - Element el; + DicomElement el; el.Group = group; el.Elem = elem; UserForceLoadList.push_back(el); @@ -386,7 +386,8 @@ FileType Document::GetFileType() * \brief Accessor to the Transfer Syntax (when present) of the * current document (it internally handles reading the * value from disk when only parsing occured). - * @return The encountered Transfer Syntax of the current document. + * @return The encountered Transfer Syntax of the current document, if DICOM. + * GDCM_UNKNOWN for ACR-NEMA files (or broken headers ...) */ std::string Document::GetTransferSyntax() { @@ -605,7 +606,7 @@ void Document::WriteContent(std::ofstream *fp, FileType filetype) // Skip if user wants to write an ACR-NEMA file if ( filetype == ImplicitVR || filetype == ExplicitVR || - filetype == JPEG ) + filetype == JPEG ) { // writing Dicom File Preamble char filePreamble[128]; @@ -660,7 +661,7 @@ void Document::LoadEntryBinArea(uint16_t group, uint16_t elem) /** * \brief Loads (from disk) the element content * when a string is not suitable - * @param elem Entry whose binArea is going to be loaded + * @param entry Entry whose binArea is going to be loaded */ void Document::LoadEntryBinArea(DataEntry *entry) { @@ -684,7 +685,7 @@ void Document::LoadEntryBinArea(DataEntry *entry) return; } - // Read the datas + // Read the data Fp->read((char*)data, l); if ( Fp->fail() || Fp->eof() ) { @@ -718,7 +719,7 @@ void Document::LoadEntryBinArea(DataEntry *entry) } case 8: { - gdcmWarningMacro("Can't swap 64 bits datas"); + gdcmWarningMacro("Can't swap 64 bits data"); /* uint64_t *data64 = (uint64_t *)data; for(i=0;iGetVR(); + + // Useless checking, now ! + /* if ( Filetype == ExplicitVR && !Global::GetVR()->IsVROfBinaryRepresentable(vr) ) { ////// No DataEntry: should mean UNKOWN VR gdcmWarningMacro( std::hex << newDocEntry->GetGroup() << "|" << newDocEntry->GetElement() - << " : No DataEntry." - "Probably unknown VR."); + << " : unknown VR." + " Probably 'Implicit VR' entry within " + "an explicit VR 'document'."); } + */ if ( !set->AddEntry( newDataEntry ) ) { @@ -1019,6 +1026,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, } else { + newDataEntry->Delete(); // Load only if we can add (not a duplicate key) LoadDocEntry( newDataEntry ); } @@ -1051,7 +1059,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, (!delim_mode && ((long)(Fp->tellg())-offset) >= l_max) ) { if ( !used ) - delete newDocEntry; + newDocEntry->Delete(); break; } @@ -1081,8 +1089,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, if ( newDocEntry->GetGroup()%2 != 0 ) { Fp->seekg( l, std::ios::cur); - RemoveEntry( newDocEntry ); // Remove and delete - //used = false; // never used + newDocEntry->Delete(); // Delete, not in the set continue; } } @@ -1090,8 +1097,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, { // User asked to skip *any* SeQuence Fp->seekg( l, std::ios::cur); - //used = false; // never used - RemoveEntry( newDocEntry ); // Remove and delete + newDocEntry->Delete(); // Delete, not in the set continue; } // delay the dynamic cast as late as possible @@ -1104,11 +1110,9 @@ void Document::ParseDES(DocEntrySet *set, long offset, // is a Document, then we are building the first depth level. // Hence the SeqEntry we are building simply has a depth // level of one: -// SQItem *parentSQItem = dynamic_cast< SQItem* > ( set ); if ( set == this ) // ( dynamic_cast< Document* > ( set ) ) { newSeqEntry->SetDepthLevel( 1 ); - // newSeqEntry->SetKey( newSeqEntry->GetKey() ); } // But when "set" is already a SQItem, we are building a nested // sequence, and hence the depth level of the new SeqEntry @@ -1118,9 +1122,6 @@ void Document::ParseDES(DocEntrySet *set, long offset, else if (SQItem *parentSQItem = dynamic_cast< SQItem* > ( set ) ) { newSeqEntry->SetDepthLevel( parentSQItem->GetDepthLevel() + 1 ); - - // newSeqEntry->SetKey( parentSQItem->GetBaseTagKey() - // + newSeqEntry->GetKey() ); } if ( l != 0 ) @@ -1145,18 +1146,22 @@ void Document::ParseDES(DocEntrySet *set, long offset, << newSeqEntry->GetOffset() << " )" ); used = false; } + else + { + newDocEntry->Delete(); + } if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { if ( !used ) - delete newDocEntry; - break; + newDocEntry->Delete(); + break; } } // end SeqEntry : VR = "SQ" if ( !used ) { - delete newDocEntry; + newDocEntry->Delete(); } first = false; } // end While @@ -1190,16 +1195,17 @@ void Document::ParseSQ( SeqEntry *seqEntry, if ( newDocEntry->IsSequenceDelimitor() ) { seqEntry->SetDelimitationItem( newDocEntry ); + newDocEntry->Delete(); break; } } if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { - delete newDocEntry; + newDocEntry->Delete(); break; } // create the current SQItem - SQItem *itemSQ = new SQItem( seqEntry->GetDepthLevel() ); + SQItem *itemSQ = SQItem::New( seqEntry->GetDepthLevel() ); unsigned int l = newDocEntry->GetReadLength(); if ( l == 0xffffffff ) @@ -1213,7 +1219,6 @@ void Document::ParseSQ( SeqEntry *seqEntry, // Let's try :------------ // remove fff0,e000, created out of the SQItem - delete newDocEntry; Fp->seekg(offsetStartCurrentSQItem, std::ios::beg); // fill up the current SQItem, starting at the beginning of fff0,e000 @@ -1223,6 +1228,8 @@ void Document::ParseSQ( SeqEntry *seqEntry, // end try ----------------- seqEntry->AddSQItem( itemSQ, SQItemNumber ); + itemSQ->Delete(); + newDocEntry->Delete(); SQItemNumber++; if ( !delim_mode && ((long)(Fp->tellg())-offset ) >= l_max ) { @@ -1241,7 +1248,7 @@ DocEntry *Document::Backtrack(DocEntry *docEntry) { // delete the Item Starter, built erroneously out of any Sequence // it's not yet in the HTable/chained list - delete docEntry; + docEntry->Delete(); // Get all info we can from PreviousDocEntry uint16_t group = PreviousDocEntry->GetGroup(); @@ -1496,7 +1503,7 @@ VRKey Document::FindDocEntryVR() VRKey vr; Fp->read(&(vr[0]),(size_t)2); - gdcmDebugMacro( "--> VR: " << vr ) + //gdcmDebugMacro( "--> VR: " << vr ) if ( !CheckDocEntryVR(vr) ) { gdcmWarningMacro( "Unknown VR '" << vr << "'" ) @@ -1647,9 +1654,9 @@ bool Document::IsDocEntryAnInteger(DocEntry *entry) } else { - // Allthough this should never happen, still some images have a + // Although this should never happen, still some images have a // corrupted group length [e.g. have a glance at offset x(8336) of - // gdcmData/gdcm-MR-PHILIPS-16-Multi-Seq.dcm]. + // gdcmData/gdcm-MR-PHILIPS-16-Multi-Seq.dcm. // Since for dicom compliant and well behaved headers, the present // test is useless (and might even look a bit paranoid), when we // encounter such an ill-formed image, we simply display a warning @@ -1880,8 +1887,8 @@ bool Document::CheckSwap() */ void Document::SwitchByteSwapCode() { - gdcmWarningMacro( "Switching Byte Swap code from "<< SwapCode - << " at :" <tellg() ); + gdcmDebugMacro( "Switching Byte Swap code from "<< SwapCode + << " at: 0x" << std::hex << Fp->tellg() ); if ( SwapCode == 1234 ) { SwapCode = 4321; @@ -1898,6 +1905,7 @@ void Document::SwitchByteSwapCode() { SwapCode = 3412; } + gdcmDebugMacro( " Into: "<< SwapCode ); } /** @@ -1971,10 +1979,11 @@ DocEntry *Document::ReadNextDocEntry() if ( dictEntry ) { realVR = dictEntry->GetVR(); + dictEntry->Unregister(); } } } - gdcmDebugMacro( "Found VR: " << vr << " / Real VR: " << realVR ); + // gdcmDebugMacro( "Found VR: " << vr << " / Real VR: " << realVR ); DocEntry *newEntry; if ( Global::GetVR()->IsVROfSequence(realVR) ) @@ -2011,7 +2020,7 @@ DocEntry *Document::ReadNextDocEntry() catch ( FormatError ) { // Call it quits - delete newEntry; + newEntry->Delete(); return 0; }