From f42c171403bfb96eee2237f528a05d5f8591a7bd Mon Sep 17 00:00:00 2001 From: regrain Date: Wed, 9 Mar 2005 09:45:32 +0000 Subject: [PATCH] * src/gdcmFileHelper.cxx : remove memory leaks and bugs when writing files -- BeNours --- ChangeLog | 3 +++ Testing/TestWriteSimple.cxx | 23 ++++++++++++++--- src/gdcmFileHelper.cxx | 50 +++++++++++++++++-------------------- src/gdcmFileHelper.h | 5 ++-- 4 files changed, 48 insertions(+), 33 deletions(-) diff --git a/ChangeLog b/ChangeLog index b883f2f3..18f873c7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2005-03-07 Benoit Regrain + * src/gdcmFileHelper.cxx : remove memory leaks and bugs when writing files + 2005-02-22 Benoit Regrain * src/gdcmFileHelper.cxx : JPR bad personal choices fix diff --git a/Testing/TestWriteSimple.cxx b/Testing/TestWriteSimple.cxx index 2c28aea8..f16d153f 100644 --- a/Testing/TestWriteSimple.cxx +++ b/Testing/TestWriteSimple.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: TestWriteSimple.cxx,v $ Language: C++ - Date: $Date: 2005/03/03 11:03:41 $ - Version: $Revision: 1.27 $ + Date: $Date: 2005/03/09 09:45:33 $ + Version: $Revision: 1.28 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -269,6 +269,21 @@ int WriteSimple(Image &img) size_t dataSizeWritten = reread->GetImageDataSize(); uint8_t *imageDataWritten = reread->GetImageData(); + // Test the image write mode + if (reread->GetFile()->GetFileType() != file->GetWriteType()) + { + std::cout << "Failed" << std::endl + << " File type differ: " + << file->GetWriteType() << " # " + << reread->GetFile()->GetFileType() << std::endl; + delete fileToBuild; + delete file; + delete reread; + delete[] imageData; + + return 1; + } + // Test the image size if (fileToBuild->GetXSize() != reread->GetFile()->GetXSize() || fileToBuild->GetYSize() != reread->GetFile()->GetYSize() || @@ -337,13 +352,13 @@ int TestWriteSimple(int argc, char *argv[]) return 1; } - // gdcm::Debug::DebugOn(); + //gdcm::Debug::DebugOn(); int ret=0; int i=0; while( Images[i].sizeX>0 && Images[i].sizeY>0 ) { - std::cout << std::endl << "Test n :" << i << std::endl; + std::cout << "Test n :" << i; ret += WriteSimple(Images[i] ); i++; } diff --git a/src/gdcmFileHelper.cxx b/src/gdcmFileHelper.cxx index a5e91693..6852fe48 100644 --- a/src/gdcmFileHelper.cxx +++ b/src/gdcmFileHelper.cxx @@ -4,8 +4,8 @@ Module: $RCSfile: gdcmFileHelper.cxx,v $ Language: C++ - Date: $Date: 2005/03/07 18:48:02 $ - Version: $Revision: 1.28 $ + Date: $Date: 2005/03/09 09:45:33 $ + Version: $Revision: 1.29 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -660,6 +660,7 @@ bool FileHelper::Write(std::string const &fileName) RestoreWrite(); RestoreWriteFileType(); + RestoreWriteMandatory(); // -------------------------------------------------------------- // Special Patch to allow gdcm to re-write ACR-LibIDO formated images @@ -943,17 +944,6 @@ void FileHelper::SetWriteFileTypeToImplicitVR() */ void FileHelper::RestoreWriteFileType() { - // group 0002 may be pushed out for ACR-NEMA writting purposes - Archive->Restore(0x0002,0x0000); - Archive->Restore(0x0002,0x0001); - Archive->Restore(0x0002,0x0002); - Archive->Restore(0x0002,0x0003); - Archive->Restore(0x0002,0x0010); - Archive->Restore(0x0002,0x0012); - Archive->Restore(0x0002,0x0013); - Archive->Restore(0x0002,0x0016); - Archive->Restore(0x0002,0x0100); - Archive->Restore(0x0002,0x0102); } /** @@ -1054,16 +1044,10 @@ BinEntry *FileHelper::CopyBinEntry(uint16_t group, uint16_t elem, DocEntry *oldE = FileInternal->GetDocEntry(group, elem); BinEntry *newE; - if( oldE ) // The pb stands for Pixels Element, - // when File is created ex-nihilo + if( oldE ) if( oldE->GetVR()!=vr ) - { - gdcmWarningMacro( " Unconsistent VR for Bin Entry : [" << oldE->GetVR() - << "] vs [" << vr << "] for " << - std::hex << group << "|" << elem); - FileInternal->RemoveEntry( oldE ); oldE = NULL; - } + if( oldE ) { newE = new BinEntry(oldE->GetDictEntry()); @@ -1121,7 +1105,6 @@ void FileHelper::CheckMandatoryElements() // Create them if not found // Always modify the value // Push the entries to the archive. - ValEntry *e_0002_0000 = CopyValEntry(0x0002,0x0000); e_0002_0000->SetValue("0"); // for the moment Archive->Push(e_0002_0000); @@ -1130,6 +1113,7 @@ void FileHelper::CheckMandatoryElements() e_0002_0001->SetBinArea((uint8_t*)Util::GetFileMetaInformationVersion(), false); e_0002_0001->SetLength(2); + Archive->Push(e_0002_0001); ValEntry *e_0002_0002 = CopyValEntry(0x0002,0x0002); // [Secondary Capture Image Storage] @@ -1141,11 +1125,6 @@ void FileHelper::CheckMandatoryElements() e_0002_0003->SetValue(Util::CreateUniqueUID()); Archive->Push(e_0002_0003); - ValEntry *e_0002_0010 = CopyValEntry(0x0002,0x0010); - //[Explicit VR - Little Endian] - e_0002_0010->SetValue("1.2.840.10008.1.2.1"); - Archive->Push(e_0002_0010); - // 'Implementation Class UID' ValEntry *e_0002_0012 = CopyValEntry(0x0002,0x0012); e_0002_0012->SetValue(Util::CreateUniqueUID()); @@ -1366,6 +1345,23 @@ void FileHelper::CheckMandatoryElements() } } +/** + * \brief Restore in the File the initial group 0002 + */ +void FileHelper::RestoreWriteMandatory() +{ + // group 0002 may be pushed out for ACR-NEMA writting purposes + Archive->Restore(0x0002,0x0000); + Archive->Restore(0x0002,0x0001); + Archive->Restore(0x0002,0x0002); + Archive->Restore(0x0002,0x0003); + Archive->Restore(0x0002,0x0012); + Archive->Restore(0x0002,0x0013); + Archive->Restore(0x0002,0x0016); + Archive->Restore(0x0002,0x0100); + Archive->Restore(0x0002,0x0102); +} + //----------------------------------------------------------------------------- // Private /** diff --git a/src/gdcmFileHelper.h b/src/gdcmFileHelper.h index 99633894..9056534e 100644 --- a/src/gdcmFileHelper.h +++ b/src/gdcmFileHelper.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmFileHelper.h,v $ Language: C++ - Date: $Date: 2005/02/21 17:45:41 $ - Version: $Revision: 1.15 $ + Date: $Date: 2005/03/09 09:45:33 $ + Version: $Revision: 1.16 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -153,6 +153,7 @@ protected: BinEntry *CopyBinEntry(uint16_t group, uint16_t elem, const std::string &vr); void CheckMandatoryElements(); + void RestoreWriteMandatory(); private: void Initialize(); -- 2.45.1