X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=inline;f=src%2FgdcmDocument.cxx;h=778e9a3854189ba48174d14f91e87e3f0432157b;hb=53efc6e2d1d40336dafc5807d1a986b3a8c7cd2b;hp=284ea27e28f463d729f456e532f8abfd7a98c562;hpb=3f95c0f72b077bed808f8d70d3edff265d7403b5;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 284ea27e..778e9a38 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/26 16:18:23 $ - Version: $Revision: 1.237 $ + Date: $Date: 2005/05/18 10:12:07 $ + Version: $Revision: 1.240 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -69,7 +69,7 @@ Document::Document() * \brief Constructor (not to break the API) * @param filename 'Document' (File or DicomDir) to be opened for parsing */ -Document::Document( std::string const &filename ) +Document::Document( std::string const &fileName ) :ElementSet(-1) { Fp = 0; @@ -84,7 +84,7 @@ Document::Document( std::string const &filename ) // Load will set it to true if sucessfull IsDocumentAlreadyLoaded = false; - Load(filename); + Load(fileName); } /** * \brief Canonical destructor. @@ -101,22 +101,24 @@ 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 ); + << fileName ); // todo : clean out the 'Document' // We should call ClearEntry() on the parent object ?!? } - Filename = filename; + Filename = fileName; Fp = 0; if ( !OpenFile() ) @@ -125,7 +127,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 +146,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 +160,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 +226,8 @@ void Document::Load( std::string const &filename ) SetValEntry(rows , 0x0028, 0x0011); } // --- End of ACR-LibIDO kludge --- + + return true; } /** @@ -463,7 +467,11 @@ std::ifstream *Document::OpenFile() Fp = new std::ifstream(Filename.c_str(), std::ios::in | std::ios::binary); if( ! *Fp ) { - gdcmErrorMacro( "Cannot open file: " << Filename.c_str()); + // Don't user gdcmErrorMacro : + // a spurious message will appear when you use, for instance + // gdcm::FileHelper *fh = new gdcm::FileHelper( outputFileName ); + // to create outputFileName. + gdcmWarningMacro( "Cannot open file: " << Filename.c_str()); delete Fp; Fp = 0; return 0; @@ -1820,7 +1828,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 ---------------- @@ -1829,10 +1839,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