X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocument.cxx;h=73c7ecf74cd10d2e3c127b600eb3b826b9f09c68;hb=e5e7b1bd7ee84e8f9dc7da5d1d42b598fac68399;hp=854e6db28d1193494b02061ea6219ec690e3aed7;hpb=b8ca604b2c1c17790f19ac61b63dfb5b550ac6c0;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 854e6db2..73c7ecf7 100644 --- a/src/gdcmDocument.cxx +++ b/src/gdcmDocument.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocument.cxx,v $ Language: C++ - Date: $Date: 2004/11/17 10:20:07 $ - Version: $Revision: 1.133 $ + Date: $Date: 2004/11/25 10:24:34 $ + Version: $Revision: 1.138 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -39,6 +39,8 @@ namespace gdcm static const char *TransferSyntaxStrings[] = { // Implicit VR Little Endian "1.2.840.10008.1.2", + // Implicit VR Little Endian DLX G.E? + "1.2.840.113619.5.2", // Explicit VR Little Endian "1.2.840.10008.1.2.1", // Deflated Explicit VR Little Endian @@ -486,6 +488,15 @@ void Document::Write(std::ofstream* fp, FileType filetype) /// (necessary if user wants to write a DICOM V3 file /// starting from an ACR-NEMA (V2) Header + if ( filetype == ImplicitVR || filetype == ExplicitVR ) + { + // writing Dicom File Preamble + char filePreamble[128]; + memset(filePreamble, 0, 128); + fp->write(filePreamble, 128); + fp->write("DICM", 4); + } + if (filetype == ImplicitVR) { std::string ts = @@ -1063,7 +1074,12 @@ void Document::LoadEntryBinArea(uint16_t group, uint16_t elem) if ( !docElement ) return; - size_t o =(size_t)docElement->GetOffset(); + BinEntry *binElement = dynamic_cast(docElement); + if( !binElement ) + return; + + LoadEntryBinArea(binElement); +/* size_t o =(size_t)docElement->GetOffset(); Fp->seekg( o, std::ios_base::beg); size_t l = docElement->GetLength(); uint8_t* a = new uint8_t[l]; @@ -1086,8 +1102,9 @@ void Document::LoadEntryBinArea(uint16_t group, uint16_t elem) { delete[] a; dbg.Verbose(0, "Document::LoadEntryBinArea setting failed."); - } + }*/ } + /** * \brief Loads (from disk) the element content * when a string is not suitable @@ -1095,8 +1112,16 @@ void Document::LoadEntryBinArea(uint16_t group, uint16_t elem) */ void Document::LoadEntryBinArea(BinEntry* element) { + if(element->GetBinArea()) + return; + + bool openFile = !Fp; + if(openFile) + OpenFile(); + size_t o =(size_t)element->GetOffset(); Fp->seekg(o, std::ios_base::beg); + size_t l = element->GetLength(); uint8_t* a = new uint8_t[l]; if( !a ) @@ -1114,6 +1139,9 @@ void Document::LoadEntryBinArea(BinEntry* element) } element->SetBinArea(a); + + if(openFile) + CloseFile(); } /** @@ -1258,9 +1286,12 @@ ValEntry* Document::GetValEntryByNumber(uint16_t group, uint16_t element) */ void Document::LoadDocEntrySafe(DocEntry * entry) { - long PositionOnEntry = Fp->tellg(); - LoadDocEntry(entry); - Fp->seekg(PositionOnEntry, std::ios_base::beg); + if(Fp) + { + long PositionOnEntry = Fp->tellg(); + LoadDocEntry(entry); + Fp->seekg(PositionOnEntry, std::ios_base::beg); + } } /** @@ -1387,10 +1418,12 @@ void Document::ParseDES(DocEntrySet *set, long offset, if (delimitor) { + delete newDocEntry; break; } if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { + delete newDocEntry; break; } } @@ -1455,6 +1488,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, // Just to make sure we are at the beginning of next entry. SkipToNextDocEntry(newDocEntry); + //delete newDocEntry; } else { @@ -1506,6 +1540,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, set->AddEntry( newSeqEntry ); if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { + delete newDocEntry; break; } } @@ -1535,13 +1570,14 @@ void Document::ParseSQ( SeqEntry* seqEntry, { if ( newDocEntry->IsSequenceDelimitor() ) { - seqEntry->SetSequenceDelimitationItem( newDocEntry ); + seqEntry->SetSequenceDelimitationItem( newDocEntry ); break; } } if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { - break; + delete newDocEntry; + break; } SQItem *itemSQ = new SQItem( seqEntry->GetDepthLevel() ); @@ -1563,6 +1599,7 @@ void Document::ParseSQ( SeqEntry* seqEntry, } ParseDES(itemSQ, newDocEntry->GetOffset(), l, dlm_mod); + delete newDocEntry; seqEntry->AddEntry( itemSQ, SQItemNumber ); SQItemNumber++; @@ -2609,6 +2646,7 @@ bool Document::CheckSwap() } + /** * \brief Restore the unproperly loaded values i.e. the group, the element * and the dictionary entry depending on them. @@ -3100,7 +3138,7 @@ void Document::BuildFlatHashTableRecurse( TagDocEntryHT& builtHT, * Document. * * The structure used by a Document (through \ref ElementSet), - * in order to old the parsed entries of a Dicom header, is a recursive + * in order to hold the parsed entries of a Dicom header, is a recursive * one. This is due to the fact that the sequences (when present) * can be nested. Additionaly, the sequence items (represented in * gdcm as \ref SQItem) add an extra complexity to the data