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/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
* \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;
// 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.
/**
* \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() )
//gdcmWarningMacro( "Unable to open as an ACR/DICOM file: "
// << Filename.c_str() );
Filetype = Unknown;
- return;
+ return false;
}
Group0002Parsed = false;
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)
gdcmWarningMacro( "No tag in internal hash table for: "
<< Filename.c_str());
CloseFile();
- return ;
+ return false;
}
IsDocumentAlreadyLoaded = true;
SetValEntry(rows , 0x0028, 0x0011);
}
// --- End of ACR-LibIDO kludge ---
+
+ return true;
}
/**
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;
// 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 ----------------
// 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