X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=src%2FgdcmDocument.cxx;h=8937fa3ea97638ab36e1d647d066bc983c8867fd;hb=827d0d72b115d9e54aac8f0b054856dffff862ca;hp=c6e9131090ff9376715bb18cb2d7690a5d1ad6bb;hpb=58156942f515f7d313b9b098156313a44f3b1e2b;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index c6e91310..8937fa3e 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/01/07 22:03:30 $ - Version: $Revision: 1.166 $ + Date: $Date: 2005/01/11 00:21:48 $ + Version: $Revision: 1.172 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -47,7 +47,7 @@ namespace gdcm static const char *TransferSyntaxStrings[] = { // Implicit VR Little Endian "1.2.840.10008.1.2", - // Implicit VR Big Endian DLX G.E? + // Implicit VR Big Endian DLX (G.E Private) "1.2.840.113619.5.2", // Explicit VR Little Endian "1.2.840.10008.1.2.1", @@ -123,7 +123,7 @@ Document::Document( std::string const &filename ) : ElementSet(-1) // Load 'non string' values - std::string PhotometricInterpretation = GetEntryByNumber(0x0028,0x0004); + std::string PhotometricInterpretation = GetEntry(0x0028,0x0004); if( PhotometricInterpretation == "PALETTE COLOR " ) { LoadEntryBinArea(0x0028,0x1200); // gray LUT @@ -169,16 +169,16 @@ Document::Document( std::string const &filename ) : ElementSet(-1) // we switch lineNumber and columnNumber // std::string RecCode; - RecCode = GetEntryByNumber(0x0008, 0x0010); // recognition code + RecCode = GetEntry(0x0008, 0x0010); // recognition code if (RecCode == "ACRNEMA_LIBIDO_1.1" || RecCode == "CANRME_AILIBOD1_1." ) // for brain-damaged softwares // with "little-endian strings" { Filetype = ACR_LIBIDO; - std::string rows = GetEntryByNumber(0x0028, 0x0010); - std::string columns = GetEntryByNumber(0x0028, 0x0011); - SetEntryByNumber(columns, 0x0028, 0x0010); - SetEntryByNumber(rows , 0x0028, 0x0011); + std::string rows = GetEntry(0x0028, 0x0010); + std::string columns = GetEntry(0x0028, 0x0011); + SetEntry(columns, 0x0028, 0x0010); + SetEntry(rows , 0x0028, 0x0011); } // ----------------- End of ACR-LibIDO kludge ------------------ } @@ -303,7 +303,7 @@ bool Document::IsReadable() */ TransferSyntaxType Document::GetTransferSyntax() { - DocEntry *entry = GetDocEntryByNumber(0x0002, 0x0010); + DocEntry *entry = GetDocEntry(0x0002, 0x0010); if ( !entry ) { return UnknownTS; @@ -395,7 +395,7 @@ bool Document::IsDicomV3() // Anyway, it's to late check if the 'Preamble' was found ... // And ... would it be a rich idea to check ? // (some 'no Preamble' DICOM images exist !) - return GetDocEntryByNumber(0x0002, 0x0010) != NULL; + return GetDocEntry(0x0002, 0x0010) != NULL; } /** @@ -449,6 +449,9 @@ std::ifstream *Document::OpenFile() zero == 0x0005 || zero == 0x0500 || zero == 0x0006 || zero == 0x0600 || zero == 0x0007 || zero == 0x0700 || zero == 0x0008 || zero == 0x0800 ) { + std::string msg + = Util::Format("ACR/DICOM with no preamble: (%04x)\n", zero); + gdcmVerboseMacro( msg.c_str() ); return Fp; } @@ -536,13 +539,13 @@ void Document::WriteContent(std::ofstream *fp, FileType filetype) * \return pointer to the modified/created Header Entry (NULL when creation * failed). */ -ValEntry *Document::ReplaceOrCreateByNumber(std::string const &value, - uint16_t group, - uint16_t elem, - TagName const &vr ) +ValEntry *Document::ReplaceOrCreate(std::string const &value, + uint16_t group, + uint16_t elem, + TagName const &vr ) { ValEntry *valEntry = 0; - DocEntry *currentEntry = GetDocEntryByNumber( group, elem); + DocEntry *currentEntry = GetDocEntry( group, elem); if (currentEntry) { @@ -568,7 +571,7 @@ ValEntry *Document::ReplaceOrCreateByNumber(std::string const &value, // Create a new valEntry if necessary if (!valEntry) { - valEntry = NewValEntryByNumber(group, elem, vr); + valEntry = NewValEntry(group, elem, vr); if ( !AddEntry(valEntry)) { @@ -595,14 +598,14 @@ ValEntry *Document::ReplaceOrCreateByNumber(std::string const &value, * \return pointer to the modified/created Header Entry (NULL when creation * failed). */ -BinEntry *Document::ReplaceOrCreateByNumber(uint8_t *binArea, - int lgth, - uint16_t group, - uint16_t elem, - TagName const &vr ) +BinEntry *Document::ReplaceOrCreate(uint8_t *binArea, + int lgth, + uint16_t group, + uint16_t elem, + TagName const &vr ) { BinEntry *binEntry = 0; - DocEntry *currentEntry = GetDocEntryByNumber( group, elem); + DocEntry *currentEntry = GetDocEntry( group, elem); // Verify the currentEntry if (currentEntry) @@ -629,7 +632,7 @@ BinEntry *Document::ReplaceOrCreateByNumber(uint8_t *binArea, // Create a new binEntry if necessary if (!binEntry) { - binEntry = NewBinEntryByNumber(group, elem, vr); + binEntry = NewBinEntry(group, elem, vr); if ( !AddEntry(binEntry)) { @@ -670,10 +673,10 @@ BinEntry *Document::ReplaceOrCreateByNumber(uint8_t *binArea, * \return pointer to the modified/created SeqEntry (NULL when creation * failed). */ -SeqEntry *Document::ReplaceOrCreateByNumber( uint16_t group, uint16_t elem) +SeqEntry *Document::ReplaceOrCreate( uint16_t group, uint16_t elem) { SeqEntry *seqEntry = 0; - DocEntry *currentEntry = GetDocEntryByNumber( group, elem); + DocEntry *currentEntry = GetDocEntry( group, elem); // Verify the currentEntry if (currentEntry) @@ -700,7 +703,7 @@ SeqEntry *Document::ReplaceOrCreateByNumber( uint16_t group, uint16_t elem) // Create a new seqEntry if necessary if (!seqEntry) { - seqEntry = NewSeqEntryByNumber(group, elem); + seqEntry = NewSeqEntry(group, elem); if ( !AddEntry(seqEntry)) { @@ -722,10 +725,10 @@ SeqEntry *Document::ReplaceOrCreateByNumber( uint16_t group, uint16_t elem) * @param elem element number of the Entry * \return boolean */ -bool Document::ReplaceIfExistByNumber(std::string const &value, - uint16_t group, uint16_t elem ) +bool Document::ReplaceIfExist(std::string const &value, + uint16_t group, uint16_t elem ) { - SetEntryByNumber(value, group, elem); + SetEntry(value, group, elem); return true; } @@ -744,7 +747,7 @@ std::string Document::GetTransferSyntaxValue(TransferSyntaxType type) * @param element Element number of the searched Dicom Element * @return true is found */ -bool Document::CheckIfEntryExistByNumber(uint16_t group, uint16_t element ) +bool Document::CheckIfEntryExist(uint16_t group, uint16_t element ) { const std::string &key = DictEntry::TranslateToKey(group, element ); return TagHT.count(key) != 0; @@ -760,7 +763,7 @@ bool Document::CheckIfEntryExistByNumber(uint16_t group, uint16_t element ) * @return Corresponding element value representation when it exists, * and the string GDCM_UNFOUND ("gdcm::Unfound") otherwise. */ -std::string Document::GetEntryByNumber(uint16_t group, uint16_t element) +std::string Document::GetEntry(uint16_t group, uint16_t element) { TagKey key = DictEntry::TranslateToKey(group, element); if ( !TagHT.count(key)) @@ -785,9 +788,9 @@ std::string Document::GetEntryByNumber(uint16_t group, uint16_t element) * @return Corresponding element value representation when it exists, * and the string GDCM_UNFOUND ("gdcm::Unfound") otherwise. */ -std::string Document::GetEntryVRByNumber(uint16_t group, uint16_t element) +std::string Document::GetEntryVR(uint16_t group, uint16_t element) { - DocEntry *elem = GetDocEntryByNumber(group, element); + DocEntry *elem = GetDocEntry(group, element); if ( !elem ) { return GDCM_UNFOUND; @@ -803,9 +806,9 @@ std::string Document::GetEntryVRByNumber(uint16_t group, uint16_t element) * @param element Element number of the searched tag. * @return Corresponding element length; -2 if not found */ -int Document::GetEntryLengthByNumber(uint16_t group, uint16_t element) +int Document::GetEntryLength(uint16_t group, uint16_t element) { - DocEntry *elem = GetDocEntryByNumber(group, element); + DocEntry *elem = GetDocEntry(group, element); if ( !elem ) { return -2; //magic number @@ -821,10 +824,10 @@ int Document::GetEntryLengthByNumber(uint16_t group, uint16_t element) * @param group group number of the Dicom Element to modify * @param element element number of the Dicom Element to modify */ -bool Document::SetEntryByNumber(std::string const& content, - uint16_t group, uint16_t element) +bool Document::SetEntry(std::string const& content, + uint16_t group, uint16_t element) { - ValEntry *entry = GetValEntryByNumber(group, element); + ValEntry *entry = GetValEntry(group, element); if (!entry ) { gdcmVerboseMacro( "No corresponding ValEntry (try promotion first)."); @@ -842,10 +845,10 @@ bool Document::SetEntryByNumber(std::string const& content, * @param group group number of the Dicom Element to modify * @param element element number of the Dicom Element to modify */ -bool Document::SetEntryByNumber(uint8_t*content, int lgth, - uint16_t group, uint16_t element) +bool Document::SetEntry(uint8_t*content, int lgth, + uint16_t group, uint16_t element) { - BinEntry *entry = GetBinEntryByNumber(group, element); + BinEntry *entry = GetBinEntry(group, element); if (!entry ) { gdcmVerboseMacro( "No corresponding ValEntry (try promotion first)."); @@ -904,9 +907,9 @@ bool Document::SetEntry(uint8_t *content, int lgth, BinEntry *entry) * @param elem element number of the Entry * @return Pointer to the 'non string' area */ -void *Document::GetEntryBinAreaByNumber(uint16_t group, uint16_t elem) +void *Document::GetEntryBinArea(uint16_t group, uint16_t elem) { - DocEntry *entry = GetDocEntryByNumber(group, elem); + DocEntry *entry = GetDocEntry(group, elem); if (!entry) { gdcmVerboseMacro( "No entry"); @@ -929,7 +932,7 @@ void *Document::GetEntryBinAreaByNumber(uint16_t group, uint16_t elem) void Document::LoadEntryBinArea(uint16_t group, uint16_t elem) { // Search the corresponding DocEntry - DocEntry *docElement = GetDocEntryByNumber(group, elem); + DocEntry *docElement = GetDocEntry(group, elem); if ( !docElement ) return; @@ -967,7 +970,7 @@ void Document::LoadEntryBinArea(BinEntry *element) /// \todo check the result Fp->read((char*)a, l); - if( Fp->fail() || Fp->eof()) //Fp->gcount() == 1 + if( Fp->fail() || Fp->eof()) { delete[] a; return; @@ -986,10 +989,10 @@ void Document::LoadEntryBinArea(BinEntry *element) * @param element Element number of the searched Dicom Element * @return */ -/*bool Document::SetEntryBinAreaByNumber(uint8_t *area, - uint16_t group, uint16_t element) +/*bool Document::SetEntryBinArea(uint8_t *area, + uint16_t group, uint16_t element) { - DocEntry *currentEntry = GetDocEntryByNumber(group, element); + DocEntry *currentEntry = GetDocEntry(group, element); if ( !currentEntry ) { return false; @@ -1014,7 +1017,7 @@ void Document::LoadEntryBinArea(BinEntry *element) * @param element Element number of the searched Dicom Element * @return */ -DocEntry *Document::GetDocEntryByNumber(uint16_t group, uint16_t element) +DocEntry *Document::GetDocEntry(uint16_t group, uint16_t element) { TagKey key = DictEntry::TranslateToKey(group, element); if ( !TagHT.count(key)) @@ -1025,14 +1028,14 @@ DocEntry *Document::GetDocEntryByNumber(uint16_t group, uint16_t element) } /** - * \brief Same as \ref Document::GetDocEntryByNumber except it only + * \brief Same as \ref Document::GetDocEntry except it only * returns a result when the corresponding entry is of type * ValEntry. * @return When present, the corresponding ValEntry. */ -ValEntry *Document::GetValEntryByNumber(uint16_t group, uint16_t element) +ValEntry *Document::GetValEntry(uint16_t group, uint16_t element) { - DocEntry *currentEntry = GetDocEntryByNumber(group, element); + DocEntry *currentEntry = GetDocEntry(group, element); if ( !currentEntry ) { return 0; @@ -1047,14 +1050,14 @@ ValEntry *Document::GetValEntryByNumber(uint16_t group, uint16_t element) } /** - * \brief Same as \ref Document::GetDocEntryByNumber except it only + * \brief Same as \ref Document::GetDocEntry except it only * returns a result when the corresponding entry is of type * BinEntry. * @return When present, the corresponding BinEntry. */ -BinEntry *Document::GetBinEntryByNumber(uint16_t group, uint16_t element) +BinEntry *Document::GetBinEntry(uint16_t group, uint16_t element) { - DocEntry *currentEntry = GetDocEntryByNumber(group, element); + DocEntry *currentEntry = GetDocEntry(group, element); if ( !currentEntry ) { return 0; @@ -1109,8 +1112,7 @@ uint32_t Document::SwapLong(uint32_t a) a=( ((a<< 8) & 0xff00ff00) | ((a>>8) & 0x00ff00ff) ); break; default : - //std::cout << "swapCode= " << SwapCode << std::endl; - gdcmErrorMacro(" Document::SwapLong : unset swap code"); + gdcmErrorMacro( "Unset swap code:" << SwapCode ); a = 0; } return a; @@ -1462,8 +1464,8 @@ void Document::LoadDocEntry(DocEntry *entry) else { // fusible - std::cout<< "MaxSizeLoadEntry exceeded, neither a BinEntry " - << "nor a ValEntry ?! Should never print that !" << std::endl; + gdcmErrorMacro( "MaxSizeLoadEntry exceeded, neither a BinEntry " + << "nor a ValEntry ?! Should never print that !" ); } // to be sure we are at the end of the value ... @@ -1539,8 +1541,8 @@ void Document::LoadDocEntry(DocEntry *entry) if( length % 2 ) { newValue = Util::DicomString(str, length+1); - gdcmVerboseMacro("Warning: bad length: " << length ); - gdcmVerboseMacro("For string :" << newValue.c_str()); + gdcmVerboseMacro("Warning: bad length: " << length << + ",For string :" << newValue.c_str()); // Since we change the length of string update it length //entry->SetReadLength(length+1); } @@ -1552,9 +1554,9 @@ void Document::LoadDocEntry(DocEntry *entry) if ( ValEntry *valEntry = dynamic_cast(entry) ) { - if ( Fp->fail() || Fp->eof())//Fp->gcount() == 1 + if ( Fp->fail() || Fp->eof()) { - gdcmVerboseMacro( "Unread element value"); + gdcmVerboseMacro("Unread element value"); valEntry->SetValue(GDCM_UNREAD); return; } @@ -1571,8 +1573,7 @@ void Document::LoadDocEntry(DocEntry *entry) } else { - gdcmErrorMacro("Document::LoadDocEntry" - "Should have a ValEntry, here !"); + gdcmErrorMacro( "Should have a ValEntry, here !"); } } @@ -1676,8 +1677,7 @@ void Document::FindDocEntryLength( DocEntry *entry ) // and the dictionary entry depending on them. uint16_t correctGroup = SwapShort( entry->GetGroup() ); uint16_t correctElem = SwapShort( entry->GetElement() ); - DictEntry *newTag = GetDictEntryByNumber( correctGroup, - correctElem ); + DictEntry *newTag = GetDictEntry( correctGroup, correctElem ); if ( !newTag ) { // This correct tag is not in the dictionary. Create a new one. @@ -1718,7 +1718,7 @@ void Document::FindDocEntryLength( DocEntry *entry ) std::string Document::FindDocEntryVR() { if ( Filetype != ExplicitVR ) - return(GDCM_UNKNOWN); + return GDCM_UNKNOWN; long positionOnEntry = Fp->tellg(); // Warning: we believe this is explicit VR (Value Representation) because @@ -1736,9 +1736,9 @@ std::string Document::FindDocEntryVR() if( !CheckDocEntryVR(vr) ) { Fp->seekg(positionOnEntry, std::ios::beg); - return(GDCM_UNKNOWN); + return GDCM_UNKNOWN; } - return(vr); + return vr; } /** @@ -1904,14 +1904,12 @@ void Document::SkipDocEntry(DocEntry *entry) /** * \brief Skips to the begining of the next Header Entry * \warning NOT end user intended method ! - * @param offset start of skipping - * @param readLgth length to skip - + * @param currentDocEntry entry to skip */ -void Document::SkipToNextDocEntry(DocEntry *newDocEntry) +void Document::SkipToNextDocEntry(DocEntry *currentDocEntry) { - Fp->seekg((long)(newDocEntry->GetOffset()), std::ios::beg); - Fp->seekg( (long)(newDocEntry->GetReadLength()),std::ios::cur); + Fp->seekg((long)(currentDocEntry->GetOffset()), std::ios::beg); + Fp->seekg( (long)(currentDocEntry->GetReadLength()),std::ios::cur); } /** @@ -1919,7 +1917,7 @@ void Document::SkipToNextDocEntry(DocEntry *newDocEntry) * the parser went Jabberwocky) one can hope improving things by * applying some heuristics. * @param entry entry to check - * @param foundLength fist assumption about length + * @param foundLength first assumption about length */ void Document::FixDocEntryFoundLength(DocEntry *entry, uint32_t foundLength) @@ -1995,7 +1993,7 @@ void Document::FixDocEntryFoundLength(DocEntry *entry, */ bool Document::IsDocEntryAnInteger(DocEntry *entry) { - uint16_t element = entry->GetElement(); + uint16_t elem = entry->GetElement(); uint16_t group = entry->GetGroup(); const std::string &vr = entry->GetVR(); uint32_t length = entry->GetLength(); @@ -2003,7 +2001,7 @@ bool Document::IsDocEntryAnInteger(DocEntry *entry) // When we have some semantics on the element we just read, and if we // a priori know we are dealing with an integer, then we shall be // able to swap it's element value properly. - if ( element == 0 ) // This is the group length of the group + if ( elem == 0 ) // This is the group length of the group { if ( length == 4 ) { @@ -2020,7 +2018,7 @@ bool Document::IsDocEntryAnInteger(DocEntry *entry) // message and proceed on parsing (while crossing fingers). long filePosition = Fp->tellg(); gdcmVerboseMacro( "Erroneous Group Length element length on : (" - << std::hex << group << " , " << element + << std::hex << group << " , " << elem << ") -before- position x(" << filePosition << ")" << "lgt : " << length ); } @@ -2058,8 +2056,8 @@ uint32_t Document::FindDocEntryLengthOBOrOW() } catch ( FormatError ) { - throw FormatError("Document::FindDocEntryLengthOBOrOW()", - " group or element not present."); + throw FormatError("Unexpected end of file encountered during ", + "Document::FindDocEntryLengthOBOrOW()"); } // We have to decount the group and element we just read @@ -2067,7 +2065,11 @@ uint32_t Document::FindDocEntryLengthOBOrOW() if ( group != 0xfffe || ( ( elem != 0xe0dd ) && ( elem != 0xe000 ) ) ) { - gdcmVerboseMacro( "Neither an Item tag nor a Sequence delimiter tag."); + long filePosition = Fp->tellg(); + gdcmVerboseMacro( "Neither an Item tag nor a Sequence delimiter tag on :" + << std::hex << group << " , " << elem + << ") -before- position x(" << filePosition << ")" ); + Fp->seekg(positionOnEntry, std::ios::beg); throw FormatUnexpected( "Neither an Item tag nor a Sequence delimiter tag."); } @@ -2438,7 +2440,7 @@ void Document::HandleBrokenEndian(uint16_t group, uint16_t elem) group = 0xfffe; elem = 0xe000; } - else if ((group == 0xfffe) && (elem == 0xe00d) && reversedEndian) + else if (group == 0xfffe && elem == 0xe00d && reversedEndian) { // end of reversed endian group reversedEndian--; @@ -2477,18 +2479,18 @@ DocEntry *Document::ReadNextDocEntry() if( vr == GDCM_UNKNOWN) { - DictEntry *dictEntry = GetDictEntryByNumber(group,elem); + DictEntry *dictEntry = GetDictEntry(group,elem); if( dictEntry ) realVR = dictEntry->GetVR(); } DocEntry *newEntry; if( Global::GetVR()->IsVROfSequence(realVR) ) - newEntry = NewSeqEntryByNumber(group, elem); + newEntry = NewSeqEntry(group, elem); else if( Global::GetVR()->IsVROfStringRepresentable(realVR) ) - newEntry = NewValEntryByNumber(group, elem,vr); + newEntry = NewValEntry(group, elem,vr); else - newEntry = NewBinEntryByNumber(group, elem,vr); + newEntry = NewBinEntry(group, elem,vr); if( vr == GDCM_UNKNOWN ) { @@ -2580,7 +2582,7 @@ bool Document::ReadTag(uint16_t testGroup, uint16_t testElement) << std::hex << testGroup << "," << testElement << ")" << std::endl << " but instead we encountered tag (" << std::hex << itemTagGroup << "," << itemTagElement << ")" - << std::endl + << std::dec << " at address: " << (unsigned int)currentPosition ); Fp->seekg(positionOnEntry, std::ios::beg); @@ -2897,8 +2899,8 @@ TagDocEntryHT *Document::BuildFlatHashTable() bool Document::operator<(Document &document) { // Patient Name - std::string s1 = GetEntryByNumber(0x0010,0x0010); - std::string s2 = document.GetEntryByNumber(0x0010,0x0010); + std::string s1 = GetEntry(0x0010,0x0010); + std::string s2 = document.GetEntry(0x0010,0x0010); if(s1 < s2) { return true; @@ -2910,8 +2912,8 @@ bool Document::operator<(Document &document) else { // Patient ID - s1 = GetEntryByNumber(0x0010,0x0020); - s2 = document.GetEntryByNumber(0x0010,0x0020); + s1 = GetEntry(0x0010,0x0020); + s2 = document.GetEntry(0x0010,0x0020); if ( s1 < s2 ) { return true; @@ -2923,8 +2925,8 @@ bool Document::operator<(Document &document) else { // Study Instance UID - s1 = GetEntryByNumber(0x0020,0x000d); - s2 = document.GetEntryByNumber(0x0020,0x000d); + s1 = GetEntry(0x0020,0x000d); + s2 = document.GetEntry(0x0020,0x000d); if ( s1 < s2 ) { return true; @@ -2936,8 +2938,8 @@ bool Document::operator<(Document &document) else { // Serie Instance UID - s1 = GetEntryByNumber(0x0020,0x000e); - s2 = document.GetEntryByNumber(0x0020,0x000e); + s1 = GetEntry(0x0020,0x000e); + s2 = document.GetEntry(0x0020,0x000e); if ( s1 < s2 ) { return true;