X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocument.cxx;h=17a7cdfee552a9fcaab071edc4a9cad1b1285169;hb=33ea8275362b9654ecd921e55367af7008e28fdc;hp=1a2bf961c7e5a3d2f4d1935053b6bd6f85e51b7c;hpb=547a1b8e2690b2b2feecde5dc88924c026f3c048;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 1a2bf961..17a7cdfe 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/04/29 15:10:55 $ - Version: $Revision: 1.238 $ + Date: $Date: 2005/06/10 14:05:38 $ + Version: $Revision: 1.245 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -35,8 +35,6 @@ namespace gdcm { //----------------------------------------------------------------------------- -// Refer to Document::CheckSwap() -//const unsigned int Document::HEADER_LENGTH_TO_READ = 256; // Refer to Document::SetMaxSizeLoadEntry() const unsigned int Document::MAX_SIZE_LOAD_ELEMENT_VALUE = 0xfff; // 4096 @@ -67,7 +65,7 @@ Document::Document() /** * \brief Constructor (not to break the API) - * @param filename 'Document' (File or DicomDir) to be opened for parsing + * @param fileName 'Document' (File or DicomDir) to be open for parsing */ Document::Document( std::string const &fileName ) :ElementSet(-1) @@ -84,7 +82,7 @@ Document::Document( std::string const &fileName ) // Load will set it to true if sucessfull IsDocumentAlreadyLoaded = false; - Load(fileName); + Load(fileName); } /** * \brief Canonical destructor. @@ -100,20 +98,22 @@ Document::~Document () /** * \brief Loader - * @param filename 'Document' (File or DicomDir) to be opened for parsing + * @param fileName 'Document' (File or DicomDir) to be open for parsing + * @return false if file cannot be open or no swap info was found, + * or no tag was found. */ -void Document::Load( std::string const &fileName ) +bool Document::Load( std::string const &fileName ) { // We should clean out anything that already exists. // Check IsDocumentAlreadyLoaded to be sure. if( IsDocumentAlreadyLoaded ) { - gdcmWarningMacro( "A file was already parsed inside this " << - "gdcm::Document (previous name was: " - << Filename.c_str() << ". New name is :" - << fileName ); + gdcmWarningMacro( "A file was already parsed inside this " + << "gdcm::Document (previous name was: " + << Filename.c_str() << ". New name is :" + << fileName ); // todo : clean out the 'Document' - // We should call ClearEntry() on the parent object ?!? + // Should we call ClearEntry() on the parent object ?!? } Filename = fileName; @@ -125,7 +125,7 @@ void Document::Load( std::string const &fileName ) //gdcmWarningMacro( "Unable to open as an ACR/DICOM file: " // << Filename.c_str() ); Filetype = Unknown; - return; + return false; } Group0002Parsed = false; @@ -144,7 +144,7 @@ void Document::Load( std::string const &fileName ) gdcmWarningMacro( "Neither a DICOM V3 nor an ACR-NEMA file: " << Filename.c_str()); CloseFile(); - return ; + return false; } long beg = Fp->tellg(); // just after DICOM preamble (if any) @@ -158,7 +158,7 @@ void Document::Load( std::string const &fileName ) gdcmWarningMacro( "No tag in internal hash table for: " << Filename.c_str()); CloseFile(); - return ; + return false; } IsDocumentAlreadyLoaded = true; @@ -224,6 +224,8 @@ void Document::Load( std::string const &fileName ) SetValEntry(rows , 0x0028, 0x0011); } // --- End of ACR-LibIDO kludge --- + + return true; } /** @@ -798,9 +800,9 @@ int Document::ComputeGroup0002Length( FileType filetype ) if( filetype == ExplicitVR ) { - if ( (vr == "OB") || (vr == "OW") || (vr == "SQ") ) + if ( (vr == "OB") || (vr == "OW") || (vr == "SQ") || (vr == "UT") ) { - // explicit VR AND OB, OW, SQ : 4 more bytes + // explicit VR AND OB, OW, SQ, UT : 4 more bytes groupLength += 4; } } @@ -938,7 +940,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, if ( strLgrGroup != GDCM_UNFOUND) { lgrGroup = atoi(strLgrGroup.c_str()); - Fp->seekg(lgrGroup , std::ios::cur); + Fp->seekg(lgrGroup, std::ios::cur); used = false; continue; } @@ -1149,7 +1151,6 @@ void Document::LoadDocEntry(DocEntry *entry) { if (BinEntry *binEntryPtr = dynamic_cast< BinEntry* >(entry) ) { - //s << "gdcm::NotLoaded (BinEntry)"; s << GDCM_NOTLOADED; s << " Ad.:" << (long)entry->GetOffset(); s << " x(" << std::hex << entry->GetOffset() << ")"; @@ -1158,10 +1159,8 @@ void Document::LoadDocEntry(DocEntry *entry) s << " x(" << std::hex << entry->GetLength() << ")"; binEntryPtr->SetValue(s.str()); } - // Be carefull : a BinEntry IS_A ValEntry ... else if (ValEntry *valEntryPtr = dynamic_cast< ValEntry* >(entry) ) { - // s << "gdcm::NotLoaded. (ValEntry)"; s << GDCM_NOTLOADED; s << " Address:" << (long)entry->GetOffset(); s << " Length:" << entry->GetLength(); @@ -1195,7 +1194,7 @@ void Document::LoadDocEntry(DocEntry *entry) uint32_t NewInt; int nbInt; // When short integer(s) are expected, read and convert the following - // n *two characters properly i.e. consider them as short integers as + // (n * 2) characters properly i.e. consider them as short integers as // opposed to strings. // Elements with Value Multiplicity > 1 // contain a set of integers (not a single one) @@ -1248,7 +1247,7 @@ void Document::LoadDocEntry(DocEntry *entry) { newValue = Util::DicomString(str, length+1); gdcmWarningMacro("Warning: bad length: " << length << - ",For string :" << newValue.c_str()); + " ,For string :" << newValue.c_str()); // Since we change the length of string update it length //entry->SetReadLength(length+1); } @@ -1295,7 +1294,7 @@ void Document::FindDocEntryLength( DocEntry *entry ) if ( Filetype == ExplicitVR && !entry->IsImplicitVR() ) { - if ( vr == "OB" || vr == "OW" || vr == "SQ" || vr == "UN" ) + if ( vr == "OB" || vr == "OW" || vr == "SQ" || vr == "UT" || vr == "UN" ) { // The following reserved two bytes (see PS 3.5-2003, section // "7.1.2 Data element structure with explicit vr", p 27) must be @@ -1650,7 +1649,7 @@ void Document::FixDocEntryFoundLength(DocEntry *entry, // Allthough not recent many such GE corrupted images are still present // on Creatis hard disks. Hence this fix shall remain when such images // are no longer in use (we are talking a few years, here)... - // Note: XMedCom probably uses such a trick since it is able to read + // Note: XMedCon probably uses such a trick since it is able to read // those pesky GE images ... if ( foundLength == 13) { @@ -1824,7 +1823,9 @@ bool Document::CheckSwap() // Position the file position indicator at first tag // (i.e. after the file preamble and the "DICM" string). - Fp->seekg(0, std::ios::beg); + + Fp->seekg(0, std::ios::beg); // FIXME : Is it usefull? + Fp->seekg ( 132L, std::ios::beg); return true; } // ------------------------------- End of DicomV3 ---------------- @@ -1833,10 +1834,43 @@ bool Document::CheckSwap() // preamble. We can reset the file position indicator to where the data // is (i.e. the beginning of the file). - gdcmWarningMacro( "Not a DICOM Version3 file"); + gdcmWarningMacro( "Not a Kosher DICOM Version3 file (no preamble)"); Fp->seekg(0, std::ios::beg); + // Let's check 'No Preamble Dicom File' : + // Should start with group 0x0002 + // and be Explicit Value Representation + + s16 = *((uint16_t *)(deb)); + SwapCode = 0; + switch ( s16 ) + { + case 0x0002 : + SwapCode = 1234; + entCur = deb + 4; + break; + case 0x0200 : + SwapCode = 4321; + entCur = deb + 6; + } + + if ( SwapCode != 0 ) + { + if( memcmp(entCur, "UL", (size_t)2) == 0 || + memcmp(entCur, "OB", (size_t)2) == 0 || + memcmp(entCur, "UI", (size_t)2) == 0 || + memcmp(entCur, "SH", (size_t)2) == 0 || + memcmp(entCur, "AE", (size_t)2) == 0 || + memcmp(entCur, "OB", (size_t)2) == 0 ) + { + Filetype = ExplicitVR; + gdcmWarningMacro( "Group 0002 : Explicit Value Representation"); + return true; + } + } +// ------------------------------- End of 'No Preamble' DicomV3 ------------- + // Our next best chance would be to be considering a 'clean' ACR/NEMA file. // By clean we mean that the length of the first group is written down. // If this is the case and since the length of the first group HAS to be