]> Creatis software - gdcm.git/blobdiff - src/gdcmDocument.cxx
Remove some useless seekg, tellg.
[gdcm.git] / src / gdcmDocument.cxx
index 08c874a7a0a4fd4f7c51832d03ad787aedf71e1d..68f1b5bac2d7e1d03ad8a4b99f1be69d3607e6d9 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocument.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/11/14 14:23:44 $
-  Version:   $Revision: 1.327 $
+  Date:      $Date: 2006/02/07 12:37:19 $
+  Version:   $Revision: 1.338 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
 #include <ctype.h>  // for isdigit
 #include <stdlib.h> // for atoi
 
+#if defined(__BORLANDC__)
+   #include <mem.h> // for memset
+#endif 
+
 namespace gdcm 
 {
 //-----------------------------------------------------------------------------
@@ -89,17 +93,6 @@ 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.
- */
-bool Document::Load( std::string const &fileName ) 
-{
-   Filename = fileName;
-   return DoTheLoadingDocumentJob( );
 }
 
 /**
@@ -125,11 +118,11 @@ bool Document::DoTheLoadingDocumentJob(  )
    Group0002Parsed = false;
 
    gdcmDebugMacro( "Starting parsing of file: " << Filename.c_str());
-
-   Fp->seekg(0, std::ios::end);
-   long lgt = Fp->tellg();       // total length of the file
-
-   Fp->seekg(0, std::ios::beg);
+   
+   // Computes the total length of the file
+   Fp->seekg(0, std::ios::end);  // Once for a given Document !
+   long lgt = Fp->tellg();       // Once for a given Document !   
+   Fp->seekg(0, std::ios::beg);  // Once for a given Document !
 
    // CheckSwap returns a boolean 
    // (false if no swap info of any kind was found)
@@ -158,7 +151,7 @@ bool Document::DoTheLoadingDocumentJob(  )
    }
    IsDocumentAlreadyLoaded = true;
 
-   Fp->seekg( 0, std::ios::beg);
+   Fp->seekg( 0, std::ios::beg);  // Once per Document
    
    // Load 'non string' values
       
@@ -337,22 +330,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 for " << GetFileName());
+      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.
@@ -411,7 +415,10 @@ std::string Document::GetTransferSyntax()
 
    // The entry might be present but not loaded (parsing and loading
    // happen at different stages): try loading and proceed with check...
-   LoadDocEntrySafe(entry);
+   
+   // Well ...
+   // (parsing and loading happen at the very same stage!) 
+   //LoadDocEntrySafe(entry); //JPRx
    if (DataEntry *dataEntry = dynamic_cast<DataEntry *>(entry) )
    {
       std::string transfer = dataEntry->GetString();
@@ -617,7 +624,7 @@ std::ifstream *Document::OpenFile()
    }
  
    //-- DICOM --
-   Fp->seekg(126L, std::ios::cur);
+   Fp->seekg(126L, std::ios::cur);  // Once for a given Document
    char dicm[4]; // = {' ',' ',' ',' '};
    Fp->read(dicm,  (size_t)4);
    if ( Fp->eof() )
@@ -731,13 +738,17 @@ void Document::LoadEntryBinArea(DataEntry *entry)
 {
    if( entry->GetBinArea() )
       return;
+// to be coherent with LoadEntryBinArea(uint16_t group, uint16_t elem)
+// (and save time !)
+// :-(
+// TestAllReadCompareDicom hangs on rle16sti.dcm
 
    bool openFile = !Fp;
    if ( openFile )
       OpenFile();
-
+// -------
    size_t o =(size_t)entry->GetOffset();
-   Fp->seekg(o, std::ios::beg);
+   Fp->seekg(o, std::ios::beg);  // FIXME : for each BinEntry LoadEntryBinArea
 
    size_t l = entry->GetLength();
    uint8_t *data = new uint8_t[l];
@@ -797,24 +808,29 @@ void Document::LoadEntryBinArea(DataEntry *entry)
    }
    
    entry->SetBinArea(data);
+   
+// to be coherent with LoadEntryBinArea(uint16_t group, uint16_t elem)
+// (and save time !)
 
    if ( openFile )
       CloseFile();
+// ---------------
 }
 
 /**
  * \brief  Loads the element while preserving the current
  *         underlying file position indicator as opposed to
- *        LoadDocEntry that modifies it.
+ *        LoadDocEntry that modifies it
+ * \note seems to be unused!.
  * @param entry   DocEntry whose value will be loaded. 
  */
 void Document::LoadDocEntrySafe(DocEntry *entry)
 {
    if ( Fp )
    {
-      long PositionOnEntry = Fp->tellg();
+      long PositionOnEntry = Fp->tellg();        // LoadDocEntrySafe is not used
       LoadDocEntry(entry);
-      Fp->seekg(PositionOnEntry, std::ios::beg);
+      Fp->seekg(PositionOnEntry, std::ios::beg); // LoadDocEntrySafe is not used
    }
 }
 
@@ -929,16 +945,6 @@ uint32_t Document::ReadInt32()
    return g;
 }
 
-/**
- * \brief skips bytes inside the source file 
- * @return 
- */
-void Document::SkipBytes(uint32_t nBytes)
-{
-   //FIXME don't dump the returned value
-   Fp->seekg((long)nBytes, std::ios::cur);
-}
-
 /**
  * \brief   Re-computes the length of the Dicom group 0002.
  */
@@ -983,6 +989,33 @@ int Document::ComputeGroup0002Length( )
    return groupLength; 
 }
 
+/**
+ * \brief   CallStartMethod
+ */
+void Document::CallStartMethod()
+{
+   Progress = 0.0f;
+   Abort    = false;
+   CommandManager::ExecuteCommand(this,CMD_STARTPROGRESS);
+}
+
+/**
+ * \brief   CallProgressMethod
+ */
+void Document::CallProgressMethod()
+{
+   CommandManager::ExecuteCommand(this,CMD_PROGRESS);
+}
+
+/**
+ * \brief   CallEndMethod
+ */
+void Document::CallEndMethod()
+{
+   Progress = 1.0f;
+   CommandManager::ExecuteCommand(this,CMD_ENDPROGRESS);
+}
+
 //-----------------------------------------------------------------------------
 // Private
 /**
@@ -1014,10 +1047,10 @@ void Document::ParseDES(DocEntrySet *set, long offset,
    bool delim_mode_intern = delim_mode;
    bool first = true;
    gdcmDebugMacro( "Enter in ParseDES, delim-mode " <<  delim_mode
-                     << " at offset " << std::hex << offset ); 
+                     << " at offset " << std::hex << "0x(" << offset << ")" ); 
    while (true)
    {
-      if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max)
+      if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) // Once per DocEntry
       {
          break;
       }
@@ -1061,8 +1094,8 @@ void Document::ParseDES(DocEntrySet *set, long offset,
          {
             gdcmDebugMacro( "in ParseDES : cannot add a DataEntry "
                                  << newDataEntry->GetKey()  
-                                 << " (at offset : " 
-                                 << newDataEntry->GetOffset() << " )" );
+                                 << " (at offset : 0x(
+                                 << newDataEntry->GetOffset() << ") )" );
             used=false;
          }
          else
@@ -1071,7 +1104,6 @@ void Document::ParseDES(DocEntrySet *set, long offset,
             // Load only if we can add (not a duplicate key)
             LoadDocEntry( newDataEntry );
          }
-
          if ( newDataEntry->GetElement() == 0x0000 ) // if on group length
          {
             if ( newDataEntry->GetGroup()%2 != 0 )   // if Shadow Group
@@ -1079,11 +1111,12 @@ void Document::ParseDES(DocEntrySet *set, long offset,
                if ( LoadMode & LD_NOSHADOW ) // if user asked to skip shad.gr
                {
                   std::string strLgrGroup = newDataEntry->GetString();
+
                   int lgrGroup;
-                  if ( newDataEntry->IsUnfound() )
+                  //if ( newDataEntry->IsUnfound() ) /?!? JPR
                   {
                      lgrGroup = atoi(strLgrGroup.c_str());
-                     Fp->seekg(lgrGroup, std::ios::cur);
+                     Fp->seekg(lgrGroup, std::ios::cur); // Only when NOSHADOW
                      //used = false;  // never used
                      RemoveEntry( newDocEntry );  // Remove and delete
                      // bcc 5.5 is right "assigned a value that's never used"
@@ -1097,7 +1130,7 @@ void Document::ParseDES(DocEntrySet *set, long offset,
          bool delimitor = newDataEntry->IsItemDelimitor();
 
          if ( (delimitor) || 
-               (!delim_mode && ((long)(Fp->tellg())-offset) >= l_max) )
+              (!delim_mode && ((long)(Fp->tellg())-offset) >= l_max) ) // Once per DataEntry
          {
             if ( !used )
                newDocEntry->Delete();
@@ -1129,7 +1162,7 @@ void Document::ParseDES(DocEntrySet *set, long offset,
            // User asked to skip SeQuences *only* if they belong to Shadow Group
             if ( newDocEntry->GetGroup()%2 != 0 )
             {
-                Fp->seekg( l, std::ios::cur);
+                Fp->seekg( l, std::ios::cur);  // once per SQITEM, when NOSHADOWSEQ
                 newDocEntry->Delete();  // Delete, not in the set 
                 continue;  
             } 
@@ -1137,7 +1170,7 @@ void Document::ParseDES(DocEntrySet *set, long offset,
          if ( (LoadMode & LD_NOSEQ) && ! delim_mode_intern ) 
          {
            // User asked to skip *any* SeQuence
-            Fp->seekg( l, std::ios::cur);
+            Fp->seekg( l, std::ios::cur); // Once per SQ, when NOSEQ
             newDocEntry->Delete(); // Delete, not in the set
             continue;
          }
@@ -1169,8 +1202,8 @@ void Document::ParseDES(DocEntrySet *set, long offset,
          {  // Don't try to parse zero-length sequences
 
             gdcmDebugMacro( "Entry in ParseSQ, delim " << delim_mode_intern
-                               << " at offset " << std::hex
-                               << newDocEntry->GetOffset() );
+                               << " at offset 0x(" << std::hex
+                               << newDocEntry->GetOffset() << ")");
 
             ParseSQ( newSeqEntry, 
                      newDocEntry->GetOffset(),
@@ -1183,8 +1216,8 @@ void Document::ParseDES(DocEntrySet *set, long offset,
          {
             gdcmWarningMacro( "in ParseDES : cannot add a SeqEntry "
                                 << newSeqEntry->GetKey()
-                                << " (at offset : " 
-                                << newSeqEntry->GetOffset() << " )" ); 
+                                << " (at offset : 0x(
+                                << newSeqEntry->GetOffset() << ") )" ); 
             used = false;
          }
          else
@@ -1192,7 +1225,7 @@ void Document::ParseDES(DocEntrySet *set, long offset,
             newDocEntry->Delete();
          }
  
-         if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max)
+         if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) // Once per SeqEntry
          {
             if ( !used )
                newDocEntry->Delete();
@@ -1239,7 +1272,7 @@ void Document::ParseSQ( SeqEntry *seqEntry,
             break;
          }
       }
-      if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max)
+      if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) // Once per SQItem
       {
          newDocEntry->Delete();
          break;
@@ -1258,18 +1291,21 @@ void Document::ParseSQ( SeqEntry *seqEntry,
       }
 
       // remove fff0,e000, created out of the SQItem
-      Fp->seekg(offsetStartCurrentSQItem, std::ios::beg);
+      
+      //Fp->seekg(offsetStartCurrentSQItem, std::ios::beg); //JPRx
+      
       // fill up the current SQItem, starting at the beginning of fff0,e000
 
       ParseDES(itemSQ, offsetStartCurrentSQItem, l+8, dlm_mod);
 
-      offsetStartCurrentSQItem = Fp->tellg();
+      offsetStartCurrentSQItem = Fp->tellg();  // Once per SQItem
  
       seqEntry->AddSQItem( itemSQ, SQItemNumber ); 
       itemSQ->Delete();
       newDocEntry->Delete();
       SQItemNumber++;
-      if ( !delim_mode && ((long)(Fp->tellg())-offset ) >= l_max )
+      //if ( !delim_mode && ((long)(Fp->tellg())-offset ) >= l_max ) //JPRx
+      if ( !delim_mode && (offsetStartCurrentSQItem-offset ) >= l_max )
       {
          break;
       }
@@ -1295,8 +1331,8 @@ DocEntry *Document::Backtrack(DocEntry *docEntry)
    long offset    = PreviousDocEntry->GetOffset();
 
    gdcmDebugMacro( "Backtrack :" << std::hex << group 
-                                   << "|" << elem
-                                   << " at offset " << offset );
+                                 << "|" << elem
+                                 << " at offset 0x(" <<offset << ")" );
    RemoveEntry( PreviousDocEntry );
 
    // forge the Seq Entry
@@ -1305,8 +1341,8 @@ DocEntry *Document::Backtrack(DocEntry *docEntry)
    newEntry->SetOffset(offset);
 
    // Move back to the beginning of the Sequence
-   Fp->seekg( 0, std::ios::beg);
-   Fp->seekg(offset, std::ios::cur);
+   Fp->seekg( 0, std::ios::beg);      // Only for Shadow Implicit VR SQ
+   Fp->seekg(offset, std::ios::cur);  // Only for Shadow Implicit VR SQ
 
    return newEntry;
 }
@@ -1324,7 +1360,7 @@ void Document::LoadDocEntry(DocEntry *entry, bool forceLoad)
    const VRKey  &vr = entry->GetVR();
    uint32_t length = entry->GetLength();
 
-   Fp->seekg((long)entry->GetOffset(), std::ios::beg);
+ //  Fp->seekg((long)entry->GetOffset(), std::ios::beg); // JPRx
 
    // A SeQuence "contains" a set of Elements.  
    //          (fffe e000) tells us an Element is beginning
@@ -1366,8 +1402,8 @@ void Document::LoadDocEntry(DocEntry *entry, bool forceLoad)
          dataEntryPtr->SetState(DataEntry::STATE_NOTLOADED);
 
          // to be sure we are at the end of the value ...
-         Fp->seekg((long)entry->GetOffset()+(long)entry->GetLength(),
-                   std::ios::beg);
+       //  Fp->seekg((long)entry->GetOffset()+(long)entry->GetLength(),
+       //           std::ios::beg);  //JPRx
          return;
       }
    }
@@ -1393,7 +1429,8 @@ void Document::FindDocEntryLength( DocEntry *entry )
          // The following reserved two bytes (see PS 3.5-2003, section
          // "7.1.2 Data element structure with explicit vr", p 27) must be
          // skipped before proceeding on reading the length on 4 bytes.
-         Fp->seekg( 2L, std::ios::cur);
+         Fp->seekg( 2L, std::ios::cur); // Once per OW,OB,SQ DocEntry
          uint32_t length32 = ReadInt32();
 
          if ( (vr == "OB" || vr == "OW") && length32 == 0xffffffff ) 
@@ -1401,7 +1438,7 @@ void Document::FindDocEntryLength( DocEntry *entry )
             uint32_t lengthOB;
             try 
             {
-               lengthOB = FindDocEntryLengthOBOrOW();
+               lengthOB = FindDocEntryLengthOBOrOW();// for encapsulation of encoded pixel 
             }
             catch ( FormatUnexpected )
             {
@@ -1413,11 +1450,11 @@ void Document::FindDocEntryLength( DocEntry *entry )
                gdcmWarningMacro( " Computing the length failed for " << 
                                    entry->GetKey() <<" in " <<GetFileName());
 
-               long currentPosition = Fp->tellg();
-               Fp->seekg(0L,std::ios::end);
+               long currentPosition = Fp->tellg(); // Only for gdcm-JPEG-LossLess3a.dcm-like
+               Fp->seekg(0L,std::ios::end);        // Only for gdcm-JPEG-LossLess3a.dcm-like
 
-               long lengthUntilEOF = (long)(Fp->tellg())-currentPosition;
-               Fp->seekg(currentPosition, std::ios::beg);
+               long lengthUntilEOF = (long)(Fp->tellg())-currentPosition; // Only for gdcm-JPEG-LossLess3a.dcm-like
+               Fp->seekg(currentPosition, std::ios::beg);                 // Only for gdcm-JPEG-LossLess3a.dcm-like
 
                entry->SetReadLength(lengthUntilEOF);
                entry->SetLength(lengthUntilEOF);
@@ -1469,7 +1506,8 @@ uint32_t Document::FindDocEntryLengthOBOrOW()
    throw( FormatUnexpected )
 {
    // See PS 3.5-2001, section A.4 p. 49 on encapsulation of encoded pixel data.
-   long positionOnEntry = Fp->tellg();
+   long positionOnEntry = Fp->tellg(); // Only for OB,OW DataElements
+   
    bool foundSequenceDelimiter = false;
    uint32_t totalLength = 0;
 
@@ -1491,13 +1529,14 @@ uint32_t Document::FindDocEntryLengthOBOrOW()
       totalLength += 4;     
       if ( group != 0xfffe || ( ( elem != 0xe0dd ) && ( elem != 0xe000 ) ) )
       {
-         long filePosition = Fp->tellg();
+         // long filePosition = Fp->tellg(); JPRx
          gdcmWarningMacro( 
               "Neither an Item tag nor a Sequence delimiter tag on :" 
            << std::hex << group << " , " << elem 
-           << ") -before- position x(" << filePosition << ")" );
+           //<< ") -before- position x(" << filePosition // JPRx
+           << ")" );
   
-         Fp->seekg(positionOnEntry, std::ios::beg);
+         Fp->seekg(positionOnEntry, std::ios::beg); // Oncd per fragment (if any) of OB,OW DataElements
          throw FormatUnexpected( 
                "Neither an Item tag nor a Sequence delimiter tag.");
       }
@@ -1515,7 +1554,7 @@ uint32_t Document::FindDocEntryLengthOBOrOW()
          break;
       }
    }
-   Fp->seekg( positionOnEntry, std::ios::beg);
+   Fp->seekg( positionOnEntry, std::ios::beg); // Only for OB,OW DataElements
    return totalLength;
 }
 
@@ -1528,12 +1567,15 @@ VRKey Document::FindDocEntryVR()
    if ( Filetype != ExplicitVR )
       return GDCM_VRUNKNOWN;
 
-   long positionOnEntry = Fp->tellg();
+   long positionOnEntry = Fp->tellg(); // FIXME : for each VR !
    // Warning: we believe this is explicit VR (Value Representation) because
    // we used a heuristic that found "UL" in the first tag and/or
    // 'Transfer Syntax' told us it is.
    // Alas this doesn't guarantee that all the tags will be in explicit VR. 
-   // In some cases one finds implicit VR tags mixed within an explicit VR file.
+   // In some cases one finds implicit VR tags mixed within an explicit VR file
+   // Well...
+   // 'Normaly' the only case is : group 0002 Explicit, and other groups Implicit
+   //
    // Hence we make sure the present tag is in explicit VR and try to fix things
    // if it happens not to be the case.
 
@@ -1547,8 +1589,8 @@ VRKey Document::FindDocEntryVR()
       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);
+                        << ") at offset : 0x(" << positionOnEntry<< ")" );
+      Fp->seekg(positionOnEntry, std::ios::beg); // FIXME : for each VR !
       return GDCM_VRUNKNOWN;
    }
    return vr;
@@ -1700,7 +1742,7 @@ bool Document::IsDocEntryAnInteger(DocEntry *entry)
          // test is useless (and might even look a bit paranoid), when we
          // encounter such an ill-formed image, we simply display a warning
          // message and proceed on parsing (while crossing fingers).
-         long filePosition = Fp->tellg();
+         long filePosition = Fp->tellg(); // Only when elem 0x0000 length is not 0 (?!?)
          gdcmWarningMacro( "Erroneous Group Length element length  on : (" 
            << std::hex << group << " , " << elem
            << ") -before- position x(" << filePosition << ")"
@@ -1796,9 +1838,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); // FIXME : Is it usefull?
+      //Fp->seekg(0, std::ios::beg); // FIXME : Is it usefull?
 
-      Fp->seekg ( 132L, std::ios::beg);
+      Fp->seekg ( 132L, std::ios::beg); // Once per Document
       return true;
    } // ------------------------------- End of DicomV3 ----------------
 
@@ -1808,7 +1850,7 @@ bool Document::CheckSwap()
 
    gdcmWarningMacro( "Not a Kosher DICOM Version3 file (no preamble)");
 
-   Fp->seekg(0, std::ios::beg);
+   Fp->seekg(0, std::ios::beg); // Once per ACR-NEMA Document
 
    // Let's check 'No Preamble Dicom File' :
    // Should start with group 0x0002
@@ -1927,7 +1969,7 @@ bool Document::CheckSwap()
 void Document::SwitchByteSwapCode() 
 {
    gdcmDebugMacro( "Switching Byte Swap code from "<< SwapCode
-                     << " at: 0x" << std::hex << Fp->tellg() );
+                     << " at: 0x" << std::hex << Fp->tellg() );  // Only when DEBUG
    if ( SwapCode == 1234 ) 
    {
       SwapCode = 4321;
@@ -2003,6 +2045,10 @@ DocEntry *Document::ReadNextDocEntry()
       {
          realVR = "UL";     // must be UL
       }
+      // Commented out in order not to generate 'Shadow Groups' where some 
+      // Data Elements are Explicit VR and some other ones Implicit VR
+      // (Stupid MatLab DICOM Reader couln't read gdcm-written images)
+      /*
       else if (CurrentGroup%2 == 1 &&  
                                (CurrentElem >= 0x0010 && CurrentElem <=0x00ff ))
       {  
@@ -2010,6 +2056,7 @@ DocEntry *Document::ReadNextDocEntry()
       // (gggg-0010->00FF where gggg is odd) attributes have to be LO
          realVR = "LO";
       }
+      */
       else
       {
          DictEntry *dictEntry = GetDictEntry(CurrentGroup,CurrentElem);
@@ -2040,7 +2087,7 @@ DocEntry *Document::ReadNextDocEntry()
          if ( newEntry->GetGroup() != 0xfffe )
          { 
             std::string msg;
-            int offset = Fp->tellg();
+            int offset = Fp->tellg(); // FIXME : Only when heuristic for Explicit/Implicit was wrong
             msg = Util::Format(
                         "Entry (%04x,%04x) at x(%x) should be Explicit VR\n", 
                         newEntry->GetGroup(), newEntry->GetElement(), offset );
@@ -2061,7 +2108,7 @@ DocEntry *Document::ReadNextDocEntry()
       return 0;
    }
 
-   newEntry->SetOffset(Fp->tellg());  
+   newEntry->SetOffset(Fp->tellg());  // for each DocEntry
    
    return newEntry;
 }
@@ -2129,17 +2176,6 @@ void Document::HandleOutOfGroup0002(uint16_t &group, uint16_t &elem)
       // if Transfer Syntax is Big Endian we have to change CheckSwap
 
       std::string ts = GetTransferSyntax();
-      if ( ts == GDCM_UNKNOWN )
-      {
-         gdcmDebugMacro("True DICOM File, with NO Transfer Syntax (?!) " );
-         return;      
-      }
-      if ( !Global::GetTS()->IsTransferSyntax(ts) )
-      {
-         gdcmWarningMacro("True DICOM File, with illegal Transfer Syntax: [" 
-                          << ts << "]");
-         return;
-      }
 
       // Group 0002 is always 'Explicit ...' 
       // even when Transfer Syntax says 'Implicit ..." 
@@ -2151,7 +2187,7 @@ void Document::HandleOutOfGroup0002(uint16_t &group, uint16_t &elem)
       }
        
       // FIXME Strangely, this works with 
-      //'Implicit VR BigEndian Transfer Syntax (GE Private)
+      //'Implicit VR BigEndian Transfer Syntax' (GE Private)
       //
       // --> Probabely normal, since we considered we never have 
       // to trust manufacturers.
@@ -2166,6 +2202,33 @@ void Document::HandleOutOfGroup0002(uint16_t &group, uint16_t &elem)
          group = SwapShort(group);
          elem  = SwapShort(elem);
       }
+      
+      /// \todo  find a trick to warn user and stop processing
+            
+      if ( Global::GetTS()->GetSpecialTransferSyntax(ts) == 
+                                             TS::DeflatedExplicitVRLittleEndian)
+      {
+           gdcmWarningMacro("Transfer Syntax [" 
+                        << GetTransferSyntaxName() << "] :"
+                        << " not yet dealt with ");
+           return;       
+      }
+      
+      // The following shouldn't occur very often
+      // Let's check at the very end.
+
+      if ( ts == GDCM_UNKNOWN )
+      {
+         gdcmDebugMacro("True DICOM File, with NO Transfer Syntax (?!) " );
+         return;      
+      }
+      
+      if ( !Global::GetTS()->IsTransferSyntax(ts) )
+      {
+         gdcmWarningMacro("True DICOM File, with illegal Transfer Syntax: [" 
+                          << ts << "]");
+         return;
+      }      
    }
 }