]> Creatis software - gdcm.git/blobdiff - src/gdcmDocument.cxx
comment out deprecated method Load(filename), everywhere.
[gdcm.git] / src / gdcmDocument.cxx
index 489be6e66a311f6da09e77bb529ec16e6bd8d7ed..1a3f177c3525696ae6a6126d146b0625c3f84943 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocument.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/10/27 16:52:44 $
-  Version:   $Revision: 1.316 $
+  Date:      $Date: 2005/11/21 16:28:06 $
+  Version:   $Revision: 1.331 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -76,7 +76,6 @@ Document::~Document ()
 
 //-----------------------------------------------------------------------------
 // Public
-
 /**
  * \brief   Loader. use SetLoadMode(), SetFileName() before ! 
  * @return false if file cannot be open or no swap info was found,
@@ -90,18 +89,17 @@ bool Document::Load(  )
       return false;
    }
    return DoTheLoadingDocumentJob( );
-} 
-/**
- * \brief   Loader. (DEPRECATED : not to break the API)   
- * @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.
- */
+}
+
+/*
+//#ifndef GDCM_LEGACY_REMOVE 
 bool Document::Load( std::string const &fileName ) 
 {
    Filename = fileName;
    return DoTheLoadingDocumentJob( );
 }
+//#endif
+*/
 
 /**
  * \brief   Performs the Loading Job (internal use only)  
@@ -187,7 +185,7 @@ bool Document::DoTheLoadingDocumentJob(  )
       /// In order to fix things "Quick and Dirty" the dictionary was
       /// altered on PURPOSE but now contains a WRONG value.
       /// In order to fix things and restore the dictionary to its
-      /// correct value, one needs to decided of the semantics by deciding
+      /// correct value, one needs to decide of the semantics by deciding
       /// whether the following tags are either :
       /// - multivaluated US, and hence loaded as ValEntry, but afterwards
       ///   also used as BinEntry, which requires the proper conversion,
@@ -338,22 +336,33 @@ bool Document::SetShaDict(DictKey const &dictName)
  * @return false when we're 150 % sure it's NOT a Dicom/Acr file,
  *         true otherwise. 
  */
-bool Document::IsReadable()
+bool Document::IsParsable()
 {
    if ( Filetype == Unknown )
    {
-      gdcmErrorMacro( "Wrong filetype");
+      gdcmWarningMacro( "Wrong filetype for " << GetFileName());
       return false;
    }
 
    if ( IsEmpty() )
    { 
-      gdcmErrorMacro( "No tag in internal hash table.");
+      gdcmWarningMacro( "No tag in internal hash table.");
       return false;
    }
 
    return true;
 }
+/**
+ * \brief  This predicate tells us whether or not the current Document 
+ *         was properly parsed and contains at least *one* Dicom Element
+ *         (and nothing more, sorry).
+ * @return false when we're 150 % sure it's NOT a Dicom/Acr file,
+ *         true otherwise. 
+ */
+bool Document::IsReadable()
+{
+   return IsParsable();
+}
 
 /**
  * \brief   Predicate for dicom version 3 file.
@@ -531,6 +540,7 @@ double Document::SwapDouble(double a)
       case 1234 :
          break;
       case 4321 :
+         {
          char *beg = (char *)&a;
          char *end = beg + 7;
          char t;
@@ -542,6 +552,7 @@ double Document::SwapDouble(double a)
             beg++,
             end--;  
          }
+         }
          break;   
       default :
          gdcmErrorMacro( "Unexpected swap code:" << SwapCode );
@@ -598,7 +609,10 @@ std::ifstream *Document::OpenFile()
       return 0;
    }
  
-   //-- ACR or DICOM with no Preamble; may start with a Shadow Group --
+   //-- Broken ACR or DICOM with no Preamble; may start with a Shadow Group --
+   
+   // FIXME : We cannot be sure the preable is only zeroes..
+   //         (see ACUSON-24-YBR_FULL-RLE.dcm )
    if ( 
        zero == 0x0001 || zero == 0x0100 || zero == 0x0002 || zero == 0x0200 ||
        zero == 0x0003 || zero == 0x0300 || zero == 0x0004 || zero == 0x0400 ||
@@ -704,15 +718,15 @@ void Document::LoadEntryBinArea(uint16_t group, uint16_t elem)
    DocEntry *docEntry = GetDocEntry(group, elem);
    if ( !docEntry )
    {
-      gdcmWarningMacro(std::hex << group << "|" << elem 
-                       <<  "doesn't exist" );
+      gdcmDebugMacro(std::hex << group << "|" << elem 
+                       <<  " doesn't exist" );
       return;
    }
    DataEntry *dataEntry = dynamic_cast<DataEntry *>(docEntry);
    if ( !dataEntry )
    {
       gdcmWarningMacro(std::hex << group << "|" << elem 
-                       <<  "is NOT a DataEntry");
+                       <<  " is NOT a DataEntry");
       return;
    }
    LoadEntryBinArea(dataEntry);
@@ -760,14 +774,13 @@ void Document::LoadEntryBinArea(DataEntry *entry)
                         Global::GetVR()->GetAtomicElementLength(entry->GetVR());
 
 // FIXME : trouble expected if we read an ... OW Entry (LUT, etc ..)
-   if( entry->GetVR() == "OW" )
-      vrLgth = 1;
+//   if( entry->GetVR() == "OW" )
+//      vrLgth = 1;
 
    switch(vrLgth)
    {
       case 1:
       {
-  std::cout << "Atomic lgt = 1 ; NO swap at reading" << std::endl;
          break;
       }     
       case 2:
@@ -928,7 +941,6 @@ uint32_t Document::ReadInt32()
 
 /**
  * \brief skips bytes inside the source file 
- * \warning NOT end user intended method !
  * @return 
  */
 void Document::SkipBytes(uint32_t nBytes)
@@ -938,7 +950,7 @@ void Document::SkipBytes(uint32_t nBytes)
 }
 
 /**
- * \brief   Re-computes the length of a ACR-NEMA/Dicom group from a DcmHeader
+ * \brief   Re-computes the length of the Dicom group 0002.
  */
 int Document::ComputeGroup0002Length( ) 
 {
@@ -962,11 +974,6 @@ int Document::ComputeGroup0002Length( )
          {
             vr = entry->GetVR();
 
-            // FIXME : group 0x0002 is *always* Explicit VR!
-            // --> Except for Implicit VR Transfer Syntax (GE Private) !!
-   
-            //if ( filetype == ExplicitVR )
-            //{
             //if ( (vr == "OB")||(vr == "OW")||(vr == "UT")||(vr == "SQ"))
             // (no SQ, OW, UT in group 0x0002;)
                if ( vr == "OB" ) 
@@ -974,7 +981,7 @@ int Document::ComputeGroup0002Length( )
                   // explicit VR AND (OB, OW, SQ, UT) : 4 more bytes
                   groupLength +=  4;
                }
-            //}
             groupLength += 2 + 2 + 4 + entry->GetLength();   
          }
       }
@@ -990,7 +997,6 @@ int Document::ComputeGroup0002Length( )
 // Private
 /**
  * \brief Loads all the needed Dictionaries
- * \warning NOT end user intended method !   
  */
 void Document::Initialize() 
 {
@@ -1467,7 +1473,6 @@ void Document::FindDocEntryLength( DocEntry *entry )
 
 /**
  * \brief  Find the Length till the next sequence delimiter
- * \warning NOT end user intended method !
  * @return 
  */
 uint32_t Document::FindDocEntryLengthOBOrOW()
@@ -1547,7 +1552,10 @@ VRKey Document::FindDocEntryVR()
 
    if ( !CheckDocEntryVR(vr) )
    {
-      gdcmWarningMacro( "Unknown VR " << std::hex << "0x(" 
+      // Don't warn user with useless messages
+      // Often, delimiters (0xfffe), are not explicit VR ...
+      if ( CurrentGroup != 0xfffe )
+         gdcmWarningMacro( "Unknown VR " << std::hex << "0x(" 
                         << (unsigned int)vr[0] << "|" << (unsigned int)vr[1] 
                         << ") at offset :" << positionOnEntry );
       Fp->seekg(positionOnEntry, std::ios::beg);
@@ -1571,7 +1579,6 @@ bool Document::CheckDocEntryVR(const VRKey &vr)
 
 /**
  * \brief   Skip a given Header Entry 
- * \warning NOT end user intended method !
  * @param   entry entry to skip
  */
 void Document::SkipDocEntry(DocEntry *entry) 
@@ -1581,7 +1588,6 @@ void Document::SkipDocEntry(DocEntry *entry)
 
 /**
  * \brief   Skips to the beginning of the next Header Entry 
- * \warning NOT end user intended method !
  * @param   currentDocEntry entry to skip
  */
 void Document::SkipToNextDocEntry(DocEntry *currentDocEntry) 
@@ -1978,13 +1984,10 @@ void Document::SetMaxSizeLoadEntry(long newSize)
  */
 DocEntry *Document::ReadNextDocEntry()
 {
-   uint16_t group;
-   uint16_t elem;
-
    try
    {
-      group = ReadInt16();
-      elem  = ReadInt16();
+      CurrentGroup = ReadInt16();
+      CurrentElem  = ReadInt16();
    }
    catch ( FormatError )
    {
@@ -1994,11 +1997,11 @@ DocEntry *Document::ReadNextDocEntry()
    }
 
    // Sometimes file contains groups of tags with reversed endianess.
-   HandleBrokenEndian(group, elem);
+   HandleBrokenEndian(CurrentGroup, CurrentElem);
 
    // In 'true DICOM' files Group 0002 is always little endian
    if ( HasDCMPreamble )
-      HandleOutOfGroup0002(group, elem);
+      HandleOutOfGroup0002(CurrentGroup, CurrentElem);
  
    VRKey vr = FindDocEntryVR();
    
@@ -2006,11 +2009,12 @@ DocEntry *Document::ReadNextDocEntry()
 
    if ( vr == GDCM_VRUNKNOWN )
    {
-      if ( elem == 0x0000 ) // Group Length
+      if ( CurrentElem == 0x0000 ) // Group Length
       {
          realVR = "UL";     // must be UL
       }
-      else if (group%2 == 1 &&  (elem >= 0x0010 && elem <=0x00ff ))
+      else if (CurrentGroup%2 == 1 &&  
+                               (CurrentElem >= 0x0010 && CurrentElem <=0x00ff ))
       {  
       // DICOM PS 3-5 7.8.1 a) states that those 
       // (gggg-0010->00FF where gggg is odd) attributes have to be LO
@@ -2018,7 +2022,7 @@ DocEntry *Document::ReadNextDocEntry()
       }
       else
       {
-         DictEntry *dictEntry = GetDictEntry(group,elem);
+         DictEntry *dictEntry = GetDictEntry(CurrentGroup,CurrentElem);
          if ( dictEntry )
          {
             realVR = dictEntry->GetVR();
@@ -2030,10 +2034,10 @@ DocEntry *Document::ReadNextDocEntry()
 
    DocEntry *newEntry;
    if ( Global::GetVR()->IsVROfSequence(realVR) )
-      newEntry = NewSeqEntry(group, elem);
+      newEntry = NewSeqEntry(CurrentGroup, CurrentElem);
    else 
    {
-      newEntry = NewDataEntry(group, elem, realVR);
+      newEntry = NewDataEntry(CurrentGroup, CurrentElem, realVR);
       static_cast<DataEntry *>(newEntry)->SetState(DataEntry::STATE_NOTLOADED);
    }
 
@@ -2087,6 +2091,7 @@ void Document::HandleBrokenEndian(uint16_t &group, uint16_t &elem)
    if ((group == 0xfeff) && (elem == 0x00e0))
    {
      // start endian swap mark for group found
+     gdcmDebugMacro( "Start endian swap mark found." );
      reversedEndian++;
      SwitchByteSwapCode();
      // fix the tag
@@ -2096,6 +2101,7 @@ void Document::HandleBrokenEndian(uint16_t &group, uint16_t &elem)
    else if (group == 0xfffe && elem == 0xe00d && reversedEndian) 
    {
      // end of reversed endian group
+     gdcmDebugMacro( "End of reversed endian." );
      reversedEndian--;
      SwitchByteSwapCode();
    }