X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocument.cxx;h=f2c4fb9585f8350f347c00480f1800ccf41e05c9;hb=a0fbf995c51ba9e31cca7f14ba1deffdf188f3b9;hp=615f8acd32386d3703f8d1e159e26483061d2c54;hpb=0fd97a2f44764117b637de53e09b8a329ca133f8;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 615f8acd..f2c4fb95 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/04 18:14:34 $ - Version: $Revision: 1.116 $ + Date: $Date: 2004/11/10 16:13:18 $ + Version: $Revision: 1.120 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -28,7 +28,7 @@ #include // For nthos: -#ifdef _MSC_VER +#if defined(_MSC_VER) || defined(__BORLANDC__) #include #else #include @@ -90,6 +90,7 @@ Document::Document( std::string const & filename ) : ElementSet(-1) Filename = filename; Initialise(); + Fp = 0; if ( !OpenFile() ) { return; @@ -181,6 +182,8 @@ Document::Document( std::string const & filename ) : ElementSet(-1) */ Document::Document() : ElementSet(-1) { + Fp = 0; + SetMaxSizeLoadEntry(MAX_SIZE_LOAD_ELEMENT_VALUE); Initialise(); PrintLevel = 1; // 'Medium' print level by default @@ -201,6 +204,8 @@ Document::~Document () //delete it->second; //temp remove } TagHT.clear(); + delete RLEInfo; + delete JPEGInfo; } //----------------------------------------------------------------------------- @@ -411,6 +416,13 @@ FileType Document::GetFileType() */ std::ifstream* Document::OpenFile() { + if(Fp) + { + dbg.Verbose( 0, + "Document::OpenFile is already opened when opening: ", + Filename.c_str()); + } + Fp = new std::ifstream(Filename.c_str(), std::ios::in | std::ios::binary); if(!Fp) @@ -439,7 +451,7 @@ std::ifstream* Document::OpenFile() return Fp; } - Fp->close(); + CloseFile(); dbg.Verbose( 0, "Document::OpenFile not DICOM/ACR (missing preamble)", Filename.c_str()); @@ -453,11 +465,14 @@ std::ifstream* Document::OpenFile() */ bool Document::CloseFile() { - Fp->close(); - delete Fp; - Fp = 0; + if( Fp ) + { + Fp->close(); + delete Fp; + Fp = 0; + } - return true; //FIXME how do we detect a non-close ifstream ? + return true; //FIXME how do we detect a non-close ifstream ? } /** @@ -476,7 +491,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 +505,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 +579,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 +598,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; @@ -881,13 +904,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 +1379,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 +1606,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 +1669,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 +2214,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 @@ -2367,7 +2401,7 @@ bool Document::CheckSwap() uint32_t s32; uint16_t s16; - char deb[HEADER_LENGTH_TO_READ]; + char deb[256]; //HEADER_LENGTH_TO_READ]; // First, compare HostByteOrder and NetworkByteOrder in order to // determine if we shall need to swap bytes (i.e. the Endian type).