X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocument.cxx;h=ab150ec1196e13b5ab4c52f2f0e2dae1c8305131;hb=refs%2Ftags%2FVersion0.6.bp;hp=d6006ab5e2e4c948772f45b354ddebbe75825c92;hpb=8a3dd7efbcb545e7ed308eb7334b1e6dbbf40923;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index d6006ab5..ab150ec1 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/10/25 03:35:20 $ - Version: $Revision: 1.113 $ + Date: $Date: 2004/11/05 21:23:46 $ + Version: $Revision: 1.118 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -201,6 +201,8 @@ Document::~Document () //delete it->second; //temp remove } TagHT.clear(); + delete RLEInfo; + delete JPEGInfo; } //----------------------------------------------------------------------------- @@ -476,7 +478,8 @@ void Document::Write(std::ofstream* fp, FileType filetype) if (filetype == ImplicitVR) { - std::string ts = TransferSyntaxStrings[ImplicitVRLittleEndian]; + std::string ts = + Util::DicomString( TransferSyntaxStrings[ImplicitVRLittleEndian] ); ReplaceOrCreateByNumber(ts, 0x0002, 0x0010); /// \todo Refer to standards on page 21, chapter 6.2 @@ -489,8 +492,9 @@ void Document::Write(std::ofstream* fp, FileType filetype) if (filetype == ExplicitVR) { - std::string ts = TransferSyntaxStrings[ExplicitVRLittleEndian]; - ReplaceOrCreateByNumber(ts, 0x0002, 0x0010); + std::string ts = + Util::DicomString( TransferSyntaxStrings[ExplicitVRLittleEndian] ); + ReplaceOrCreateByNumber(ts, 0x0002, 0x0010); //LEAK /// \todo Refer to standards on page 21, chapter 6.2 /// "Value representation": values with a VR of UI shall be @@ -562,9 +566,13 @@ ValEntry* Document::ReplaceOrCreateByNumber( valEntry = new ValEntry(currentEntry); if ( !AddEntry(valEntry)) { + delete valEntry; dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: AddEntry" " failed allthough this is a creation."); } + // This is the reason why NewDocEntryByNumber are a real + // bad habit !!! FIXME + delete currentEntry; } else { @@ -577,12 +585,14 @@ ValEntry* Document::ReplaceOrCreateByNumber( valEntry = new ValEntry(currentEntry); if (!RemoveEntry(currentEntry)) { + delete valEntry; dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: removal" " of previous DocEntry failed."); return NULL; } if ( !AddEntry(valEntry)) { + delete valEntry; dbg.Verbose(0, "Document::ReplaceOrCreateByNumber: adding" " promoted ValEntry failed."); return NULL; @@ -729,7 +739,7 @@ bool Document::ReplaceIfExistByNumber(std::string const & value, bool Document::CheckIfEntryExistByNumber(uint16_t group, uint16_t element ) { const std::string &key = DictEntry::TranslateToKey(group, element ); - return TagHT.count(key); + return TagHT.count(key) != 0; } /** @@ -881,13 +891,10 @@ bool Document::SetEntryByNumber(std::string const& content, return false; } // Non even content must be padded with a space (020H)... - std::string finalContent = content; - if( finalContent.length() % 2 ) - { - finalContent += '\0'; // ... therefore we padd with (000H) .!?! - } + std::string finalContent = Util::DicomString( content.c_str() ); + assert( !(finalContent.size() % 2) ); valEntry->SetValue(finalContent); - + // Integers have a special treatement for their length: l = finalContent.length(); @@ -1359,7 +1366,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, //////////////////// BinEntry or UNKOWN VR: BinEntry* newBinEntry = - new BinEntry( newDocEntry->GetDictEntry() ); + new BinEntry( newDocEntry->GetDictEntry() ); //LEAK newBinEntry->Copy( newDocEntry ); // When "this" is a Document the Key is simply of the @@ -1586,7 +1593,8 @@ void Document::LoadDocEntry(DocEntry* entry) } // to be sure we are at the end of the value ... - Fp->seekg((long)entry->GetOffset()+(long)entry->GetLength(),std::ios_base::beg); + Fp->seekg((long)entry->GetOffset()+(long)entry->GetLength(), + std::ios_base::beg); return; } @@ -1648,15 +1656,28 @@ void Document::LoadDocEntry(DocEntry* entry) return; } - // We need an additional byte for storing \0 that is not on disk + // FIXME: We need an additional byte for storing \0 that is not on disk char *str = new char[length+1]; Fp->read(str, (size_t)length); - str[length] = '\0'; - std::string newValue = str; + str[length] = '\0'; //this is only useful when length is odd + // Special DicomString call to properly handle \0 and even length + std::string newValue; + if( length % 2 ) + { + newValue = Util::DicomString(str, length+1); + //dbg.Verbose(0, "Warning: bad length: ", length ); + dbg.Verbose(0, "For string :", newValue.c_str()); + // Since we change the length of string update it length + entry->SetReadLength(length+1); + } + else + { + newValue = Util::DicomString(str, length); + } delete[] str; if ( ValEntry* valEntry = dynamic_cast(entry) ) - { + { if ( Fp->fail() || Fp->eof())//Fp->gcount() == 1 { dbg.Verbose(1, "Document::LoadDocEntry", @@ -2180,7 +2201,7 @@ bool Document::IsDocEntryAnInteger(DocEntry *entry) { uint16_t element = entry->GetElement(); uint16_t group = entry->GetGroup(); - std::string vr = entry->GetVR(); + const std::string & vr = entry->GetVR(); uint32_t length = entry->GetLength(); // When we have some semantics on the element we just read, and if we @@ -2292,7 +2313,7 @@ uint16_t Document::ReadInt16() Fp->read ((char*)&g, (size_t)2); if ( Fp->fail() ) { - throw FormatError( "Document::ReadInt16()", " file error." ); + throw FormatError( "Document::ReadInt16()", " file error." ); } if( Fp->eof() ) { @@ -2685,8 +2706,18 @@ bool Document::ReadTag(uint16_t testGroup, uint16_t testElement) //// Read the Item Tag group and element, and make // sure they are what we expected: - uint16_t itemTagGroup = ReadInt16(); - uint16_t itemTagElement = ReadInt16(); + uint16_t itemTagGroup; + uint16_t itemTagElement; + try + { + itemTagGroup = ReadInt16(); + itemTagElement = ReadInt16(); + } + catch ( FormatError e ) + { + //std::cerr << e << std::endl; + return false; + } if ( itemTagGroup != testGroup || itemTagElement != testElement ) { std::ostringstream s; @@ -2932,9 +2963,9 @@ void Document::BuildFlatHashTableRecurse( TagDocEntryHT& builtHT, { if (ElementSet* elementSet = dynamic_cast< ElementSet* > ( set ) ) { - TagDocEntryHT* currentHT = elementSet->GetTagHT(); - for( TagDocEntryHT::const_iterator i = currentHT->begin(); - i != currentHT->end(); + TagDocEntryHT const & currentHT = elementSet->GetTagHT(); + for( TagDocEntryHT::const_iterator i = currentHT.begin(); + i != currentHT.end(); ++i) { DocEntry* entry = i->second;