X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=src%2FgdcmDocument.cxx;h=95b8efec2fc3470081a5bc4c0df1da349f969901;hb=0fe2afcdd153ff2ee8f3ba2b4b02478e154a57df;hp=1a2bf961c7e5a3d2f4d1935053b6bd6f85e51b7c;hpb=547a1b8e2690b2b2feecde5dc88924c026f3c048;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 1a2bf961..95b8efec 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/05/25 12:54:17 $ + Version: $Revision: 1.241 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -84,7 +84,12 @@ Document::Document( std::string const &fileName ) // Load will set it to true if sucessfull IsDocumentAlreadyLoaded = false; - Load(fileName); + Load(fileName); + + // Normaly (?) Fp should be already deleted by CloseFile() + if ( Fp != 0 ) + delete Fp; + Fp = 0; } /** * \brief Canonical destructor. @@ -101,15 +106,17 @@ Document::~Document () /** * \brief Loader * @param filename 'Document' (File or DicomDir) to be opened 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: " + 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' @@ -125,7 +132,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 +151,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 +165,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 +231,8 @@ void Document::Load( std::string const &fileName ) SetValEntry(rows , 0x0028, 0x0011); } // --- End of ACR-LibIDO kludge --- + + return true; } /** @@ -1824,7 +1833,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 +1844,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