]> Creatis software - gdcm.git/commitdiff
* src/gdcmDictEntry.h : now, the IsVRUnknown is correct
authorregrain <regrain>
Thu, 6 Jan 2005 13:35:37 +0000 (13:35 +0000)
committerregrain <regrain>
Thu, 6 Jan 2005 13:35:37 +0000 (13:35 +0000)
   * src/gdcmDocument.[h|cxx] : simplify the search of VR value when parsing
     a file
   * src/gdcmDocEntrySet.cxx : now the created DocEntry without values is good
     when specifying the VR
   * src/gdcmVR.[h|cxx] : add usefull method to test the validity of a VR
   * src/gdcmDocEntry.cxx : amelioration of print
   -- BeNours

ChangeLog
src/gdcmDictEntry.h
src/gdcmDocEntry.cxx
src/gdcmDocEntrySet.cxx
src/gdcmDocument.cxx
src/gdcmDocument.h
src/gdcmPixelReadConvert.cxx
src/gdcmVR.cxx
src/gdcmVR.h

index 3ac73bb2df18bb282c7d57e813634d64c9825cdd..363d3a26eaf254d80ff4f15b16169002052e3f8e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2005-01-06 Benoit Regrain <Benoit.Regrain@creatis.insa-lyon.fr>
+   * src/gdcmDictEntry.h : now, the IsVRUnknown is correct
+   * src/gdcmDocument.[h|cxx] : simplify the search of VR value when parsing
+     a file
+   * src/gdcmDocEntrySet.cxx : now the created DocEntry without values is good
+     when specifying the VR
+   * src/gdcmVR.[h|cxx] : add usefull method to test the validity of a VR
+   * src/gdcmDocEntry.cxx : amelioration of print
+
 2005-01-05 Jean-Pierre Roux <jpr@creatis.univ-lyon1.fr
    * ADD : Add the method Util::IsCurrentProcessorBigEndian
           (we'll need it for 'Explicit VR Big Endian' Transfert Syntax)
@@ -5,7 +14,7 @@
        * ENH : now  parsing creates a Vitual DictEntry for Pixels Element,
            in order to allow further VR modification by user
    * REM : removal of once-called method File::WriteBase       
-               integration of its code in formerly one-line method File::Write           
+               integration of its code in formerly one-line method File::Write
 
 2005-01-05 Benoit Regrain <Benoit.Regrain@creatis.insa-lyon.fr>
    * src/gdcmCommon.h : add the GDCM_UNKNOWN constant. This constant is to
index 3448e495afc11b62055e41d38c4efeb0a9f26188..b8dffd1d74b77142afe3b491f8bfc30c2c617753 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDictEntry.h,v $
   Language:  C++
-  Date:      $Date: 2005/01/05 15:38:28 $
-  Version:   $Revision: 1.22 $
+  Date:      $Date: 2005/01/06 13:35:38 $
+  Version:   $Revision: 1.23 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -50,7 +50,7 @@ public:
 
    /// \brief tells if the V(alue) R(epresentation) is known (?!)
    /// @return 
-   bool IsVRUnknown() { return VR == "??"; }
+   bool IsVRUnknown() { return VR == GDCM_UNKNOWN; }
 
    /// \brief  Returns the Dicom Group Number of the current DictEntry
    /// @return the Dicom Group Number
index 6ada3fad82bedaa863be4935606edd7ae17947ae..f954dfc242c22c3701d42509c78d03f44e2f0fe9 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocEntry.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/05 15:38:28 $
-  Version:   $Revision: 1.36 $
+  Date:      $Date: 2005/01/06 13:35:38 $
+  Version:   $Revision: 1.37 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -68,6 +68,8 @@ void DocEntry::Print(std::ostream& os)
 
    o  = GetOffset();
    vr = GetVR();
+   if(vr==GDCM_UNKNOWN)
+      vr="  ";
 
    s << DictEntry::TranslateToKey(GetGroup(),GetElement()); 
 
index 0d69d0253fd8a7932748e05ffb005a3e3cc56ad4..b73bb8f1933dbd78aabec36fae992b0fa8540853 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocEntrySet.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/05 15:38:28 $
-  Version:   $Revision: 1.28 $
+  Date:      $Date: 2005/01/06 13:35:38 $
+  Version:   $Revision: 1.29 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -212,12 +212,29 @@ DocEntry* DocEntrySet::NewDocEntryByNumber(uint16_t group, uint16_t elem,
    // Find out if the tag we encountered is in the dictionaries:
    Dict *pubDict = Global::GetDicts()->GetDefaultPubDict();
    DictEntry *dictEntry = pubDict->GetDictEntryByNumber(group, elem);
-   if (!dictEntry)
+   std::string goodVR = vr;
+   DictEntry *goodDict = dictEntry;
+
+   // Check if the would VR is good
+   if (elem==0x0000)
+      goodVR="UL";
+
+   // Check if the DictEntry VR corresponds with the would VR
+   if (goodDict)
+      if (goodDict->GetVR() != goodVR && goodVR!=GDCM_UNKNOWN)
+         goodDict=NULL;
+
+   // Create a new virtual DictEntry if necessary
+   if (!goodDict)
    {
-      dictEntry = NewVirtualDictEntry(group, elem, vr);
+      if (dictEntry)
+         goodDict = NewVirtualDictEntry(group, elem, goodVR,"FIXME",dictEntry->GetName());
+      else
+         goodDict = NewVirtualDictEntry(group, elem, goodVR);
    }
 
-   DocEntry *newEntry = new DocEntry(dictEntry);
+   // Create the DocEntry
+   DocEntry *newEntry = new DocEntry(goodDict);
    if (!newEntry) 
    {
       dbg.Verbose(1, "SQItem::NewDocEntryByNumber",
@@ -226,6 +243,7 @@ DocEntry* DocEntrySet::NewDocEntryByNumber(uint16_t group, uint16_t elem,
    }
    return newEntry;
 }
+
 /* \brief
  * Probabely move, as is, to DocEntrySet, as a non virtual method
  * and remove Document::NewDocEntryByName
index 417fc90a3cc4489c9cddd8836586e392a491080e..f1322ac53c5c0966d8d179b82eeff6ac9fe7dccc 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocument.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/06 09:51:52 $
-  Version:   $Revision: 1.154 $
+  Date:      $Date: 2005/01/06 13:35:38 $
+  Version:   $Revision: 1.155 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -1070,54 +1070,6 @@ void Document::LoadEntryBinArea(BinEntry* element)
    return false;
 }*/
 
-/**
- * \brief   Update the entries with the shadow dictionary. 
- *          Only non even entries are analyzed       
- */
-void Document::UpdateShaEntries()
-{
-   //DictEntry *entry;
-   std::string vr;
-   
-   /// \todo TODO : still any use to explore recursively the whole structure?
-/*
-   for(ListTag::iterator it=listEntries.begin();
-       it!=listEntries.end();
-       ++it)
-   {
-      // Odd group => from public dictionary
-      if((*it)->GetGroup()%2==0)
-         continue;
-
-      // Peer group => search the corresponding dict entry
-      if(RefShaDict)
-         entry=RefShaDict->GetDictEntryByNumber((*it)->GetGroup(),(*it)->GetElement());
-      else
-         entry=NULL;
-
-      if((*it)->IsImplicitVR())
-         vr="Implicit";
-      else
-         vr=(*it)->GetVR();
-
-      (*it)->SetValue(GetDocEntryUnvalue(*it));  // to go on compiling
-      if(entry){
-         // Set the new entry and the new value
-         (*it)->SetDictEntry(entry);
-         CheckDocEntryVR(*it,vr);
-
-         (*it)->SetValue(GetDocEntryValue(*it));    // to go on compiling
-      }
-      else
-      {
-         // Remove precedent value transformation
-         (*it)->SetDictEntry(NewVirtualDictEntry((*it)->GetGroup(),(*it)->GetElement(),vr));
-      }
-   }
-*/   
-}
-
 /**
  * \brief   Searches within the Header Entries for a Dicom Element of
  *          a given tag.
@@ -1818,14 +1770,10 @@ void Document::FindDocEntryLength( DocEntry *entry )
  * \brief     Find the Value Representation of the current Dicom Element.
  * @param     entry
  */
-void Document::FindDocEntryVR( DocEntry *entry )
+std::string Document::FindDocEntryVR()
 {
    if ( Filetype != ExplicitVR )
-   {
-      return;
-   }
-
-   char vr[3];
+      return(GDCM_UNKNOWN);
 
    long positionOnEntry = Fp->tellg();
    // Warning: we believe this is explicit VR (Value Representation) because
@@ -1835,23 +1783,17 @@ void Document::FindDocEntryVR( DocEntry *entry )
    // within an explicit VR file. Hence we make sure the present tag
    // is in explicit VR and try to fix things if it happens not to be
    // the case.
+
+   char vr[3];
    Fp->read (vr, (size_t)2);
    vr[2] = 0;
 
-   if( !CheckDocEntryVR(entry, vr) )
+   if( !CheckDocEntryVR(vr) )
    {
       Fp->seekg(positionOnEntry, std::ios::beg);
-      // When this element is known in the dictionary we shall use, e.g. for
-      // the semantics (see the usage of IsAnInteger), the VR proposed by the
-      // dictionary entry. Still we have to flag the element as implicit since
-      // we know now our assumption on expliciteness is not furfilled.
-      // avoid  .
-      if ( entry->IsVRUnknown() )
-      {
-         entry->SetVR("Implicit");
-      }
-      entry->SetImplicitVR();
+      return(GDCM_UNKNOWN);
    }
+   return(vr);
 }
 
 /**
@@ -1863,76 +1805,13 @@ void Document::FindDocEntryVR( DocEntry *entry )
  * @return    false if the VR is incorrect of if the VR isn't referenced
  *            otherwise, it returns true
 */
-bool Document::CheckDocEntryVR(DocEntry *entry, VRKey vr)
+bool Document::CheckDocEntryVR(VRKey vr)
 {
-   std::string msg;
-   bool realExplicit = true;
-
-   // Assume we are reading a falsely explicit VR file i.e. we reached
-   // a tag where we expect reading a VR but are in fact we read the
-   // first to bytes of the length. Then we will interogate (through find)
-   // the dicom_vr dictionary with oddities like "\004\0" which crashes
-   // both GCC and VC++ implementations of the STL map. Hence when the
-   // expected VR read happens to be non-ascii characters we consider
-   // we hit falsely explicit VR tag.
-
-   if ( !isalpha((unsigned char)vr[0]) && !isalpha((unsigned char)vr[1]) )
-   {
-      realExplicit = false;
-   }
-
    // CLEANME searching the dicom_vr at each occurence is expensive.
    // PostPone this test in an optional integrity check at the end
    // of parsing or only in debug mode.
-   if ( realExplicit && !Global::GetVR()->Count(vr) )
-   {
-      realExplicit = false;
-   }
-
-   if ( !realExplicit ) 
-   {
-      // We thought this was explicit VR, but we end up with an
-      // implicit VR tag. Let's backtrack.   
-      msg = Util::Format("Falsely explicit vr file (%04x,%04x)\n", 
-                    entry->GetGroup(), entry->GetElement());
-      dbg.Verbose(1, "Document::FindVR: ", msg.c_str());
-
-      if( entry->GetGroup() % 2 && entry->GetElement() == 0x0000)
-      {
-         // Group length is UL !
-         DictEntry* newEntry = NewVirtualDictEntry(
-                                   entry->GetGroup(), entry->GetElement(),
-                                   "UL", "FIXME", "Group Length");
-         entry->SetDictEntry( newEntry );
-      }
+   if ( !Global::GetVR()->IsValidVR(vr) )
       return false;
-   }
-
-   if ( entry->IsVRUnknown() )
-   {
-      // When not a dictionary entry, we can safely overwrite the VR.
-      if( entry->GetElement() == 0x0000 )
-      {
-         // Group length is UL !
-         entry->SetVR("UL");
-      }
-      else
-      {
-         entry->SetVR(vr);
-      }
-   }
-   else if ( entry->GetVR() != vr )
-   {
-      // The VR present in the file and the dictionary disagree. We assume
-      // the file writer knew best and use the VR of the file. Since it would
-      // be unwise to overwrite the VR of a dictionary (since it would
-      // compromise it's next user), we need to clone the actual DictEntry
-      // and change the VR for the read one.
-      DictEntry* newEntry = NewVirtualDictEntry(
-                                entry->GetGroup(), entry->GetElement(),
-                                vr, "FIXME", entry->GetName());
-      entry->SetDictEntry(newEntry);
-   }
 
    return true; 
 }
@@ -2665,8 +2544,22 @@ DocEntry* Document::ReadNextDocEntry()
    }
 
    HandleBrokenEndian(group, elem);
-   DocEntry *newEntry = NewDocEntryByNumber(group, elem);
-   FindDocEntryVR(newEntry);
+   std::string vr=FindDocEntryVR();
+
+   DocEntry *newEntry = NewDocEntryByNumber(group, elem, vr);
+   if( vr == GDCM_UNKNOWN )
+   {
+      if( Filetype == ExplicitVR )
+      {
+         // We thought this was explicit VR, but we end up with an
+         // implicit VR tag. Let's backtrack.   
+         std::string msg;
+         msg = Util::Format("Falsely explicit vr file (%04x,%04x)\n", 
+                       newEntry->GetGroup(), newEntry->GetElement());
+         dbg.Verbose(1, "Document::FindVR: ", msg.c_str());
+      }
+      newEntry->SetImplicitVR();
+   }
 
    try
    {
index ad5d48b1094b8005a2609ccf171c062e2baeefce..4bbc26688b62e0118de196cb59462258b819893c 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocument.h,v $
   Language:  C++
-  Date:      $Date: 2005/01/05 16:53:23 $
-  Version:   $Revision: 1.71 $
+  Date:      $Date: 2005/01/06 13:35:38 $
+  Version:   $Revision: 1.72 $
  
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -61,96 +61,80 @@ enum TransferSyntaxType {
  */
 class GDCM_EXPORT Document : public ElementSet
 {
-friend class File;
-private:
-   /// Public dictionary used to parse this header
-   Dict* RefPubDict;
-   
-   /// \brief Optional "shadow dictionary" (private elements) used to parse
-   /// this header
-   Dict* RefShaDict;
-
-   /// \brief Size threshold above which an element value will NOT be loaded
-   /// in memory (to avoid loading the image/volume itself). By default,
-   /// this upper bound is fixed to 1024 bytes (which might look reasonable
-   /// when one considers the definition of the various VR contents).
-   uint32_t MaxSizeLoadEntry;
-   
-   /// \brief Size threshold above which an element value will NOT be *printed*
-   /// in order no to polute the screen output. By default, this upper bound
-   /// is fixed to 64 bytes.
-   uint32_t MaxSizePrintEntry;   
-
-protected:
-   /// Refering underlying filename.
-   std::string Filename;
-
-   /// \brief SWap code (e.g. Big Endian, Little Endian, Bad Big Endian,
-   /// Bad Little Endian) according to the processor Endianity and
-   /// what is written on disc.
-   int SwapCode;
-
-   /// File Pointer, opened during Header parsing.
-   std::ifstream* Fp;
-
-   /// ACR, ACR_LIBIDO, ExplicitVR, ImplicitVR, Unknown
-   FileType Filetype;  
-
-   /// After opening the file, we read HEADER_LENGTH_TO_READ bytes.
-   static const unsigned int HEADER_LENGTH_TO_READ; 
-
-   /// \brief Elements whose value is longer than MAX_SIZE_LOAD_ELEMENT_VALUE
-   /// are NOT loaded.
-   static const unsigned int MAX_SIZE_LOAD_ELEMENT_VALUE;
+public:
+// Informations contained in the parser
+   virtual bool IsReadable();
+   FileType GetFileType();
 
-   /// \brief Elements whose value is longer than  MAX_SIZE_PRINT_ELEMENT_VALUE
-   /// are NOT printed.
-   /// \todo Currently not used since collides with #define in
-   ///       class DocEntry . See also
-   ///       method ref Document::SetMaxSizePrintEntry()
-   static const unsigned int MAX_SIZE_PRINT_ELEMENT_VALUE;
+   TransferSyntaxType GetTransferSyntax();
 
-   /// Store the RLE frames info obtained during parsing of pixels.
-   RLEFramesInfo* RLEInfo;
+   bool IsJPEGLossless();
+   bool IsJPEG2000();
+   bool IsJPEG();
+   bool IsEncapsulate();
+   bool IsDicomV3();
 
-   /// Store the JPEG fragments info obtained during parsing of pixels.
-   JPEGFragmentsInfo* JPEGInfo;
+   RLEFramesInfo* GetRLEInfo() { return RLEInfo; }
+   JPEGFragmentsInfo* GetJPEGInfo() { return JPEGInfo; }
 
-public:
-// the 2 following will be merged
+// Dictionnaries
    virtual void PrintPubDict (std::ostream &os = std::cout);
    virtual void PrintShaDict (std::ostream &os = std::cout);
 
-// Dictionnaries
    Dict* GetPubDict();
    Dict* GetShaDict();
    bool SetShaDict(Dict* dict);
    bool SetShaDict(DictKey const & dictName);
 
-// Informations contained in the parser
-   virtual bool IsReadable();
-   TransferSyntaxType GetTransferSyntax();
-   bool IsJPEGLossless();
-   bool IsJPEG2000();
-   bool IsJPEG();
-   bool IsEncapsulate();
-   bool IsDicomV3();
+// Swap code
+   /// 'Swap code' accessor (see \ref SwapCode )
+   int GetSwapCode() { return SwapCode; }
+   // System access (meaning endian related !?)
+   uint16_t SwapShort(uint16_t);   // needed by File
+   uint32_t SwapLong(uint32_t);    // needed by File
+   uint16_t UnswapShort(uint16_t); // needed by File
+   uint32_t UnswapLong(uint32_t);  // needed by File
+   
+// Ordering of Documents
+   bool operator<(Document &document);
 
-   FileType GetFileType();
+public:
+// File I/O
+   /// Accessor to \ref Filename
+   const std::string &GetFileName() const { return Filename; }
+   /// Accessor to \ref Filename
+   void SetFileName(std::string const & fileName) { Filename = fileName; }
 
-   std::ifstream * OpenFile();
+   std::ifstream* OpenFile();
    bool CloseFile();
-
    void WriteContent( std::ofstream* fp, FileType type );
 
+// Content entries
+   virtual bool SetEntryByName  (std::string const & content, 
+                                 TagName const & tagName );
+   virtual bool SetEntryByNumber(std::string const & content,
+                                 uint16_t group, uint16_t element);
+   virtual bool SetEntryByNumber(uint8_t* content, int lgth,
+                                 uint16_t group, uint16_t element);
+   virtual void* GetEntryBinAreaByNumber(uint16_t group, uint16_t elem);   
+
+   virtual std::string GetEntryByName    (TagName const & tagName);
+   virtual std::string GetEntryVRByName  (TagName const & tagName);
+   virtual std::string GetEntryByNumber  (uint16_t group, uint16_t elem);
+   virtual std::string GetEntryVRByNumber(uint16_t group, uint16_t elem);
+   virtual int GetEntryLengthByNumber(uint16_t group, uint16_t elem);
+
+   DocEntry* GetDocEntryByNumber(uint16_t group, uint16_t element); 
+   DocEntry* GetDocEntryByName  (TagName const & tagName);
+   ValEntry* GetValEntryByNumber(uint16_t group, uint16_t element); 
+   //BinEntry* GetBinEntryByNumber(uint16_t group, uint16_t element); 
+
    ValEntry* ReplaceOrCreateByNumber(std::string const & value,
                                      uint16_t group, uint16_t elem,
                                      TagName const & vr = GDCM_UNKNOWN);
-   
    BinEntry* ReplaceOrCreateByNumber(uint8_t* binArea, int lgth,
                                      uint16_t group, uint16_t elem,
                                      TagName const & vr = GDCM_UNKNOWN);
-
    SeqEntry* ReplaceOrCreateByNumber(uint16_t group, uint16_t elem);
 
    bool ReplaceIfExistByNumber ( std::string const & value,
@@ -158,16 +142,15 @@ public:
    
    virtual void LoadEntryBinArea(uint16_t group, uint16_t elem);
    virtual void LoadEntryBinArea(BinEntry* entry);
-      
-   // System access (meaning endian related !?)
-   uint16_t SwapShort(uint16_t);   // needed by File
-   uint32_t SwapLong(uint32_t);    // needed by File
-   uint16_t UnswapShort(uint16_t); // needed by File
-   uint32_t UnswapLong(uint32_t);  // needed by File
 
+   void LoadDocEntrySafe(DocEntry* entry);
+   TagDocEntryHT* BuildFlatHashTable();
+      
+// Divers
    static std::string GetTransferSyntaxValue(TransferSyntaxType type);
 
 protected:
+// Methods
    // Constructor and destructor are protected to forbid end user 
    // to instanciate from this class Document (only Header and
    // DicomDir are meaningfull).
@@ -180,49 +163,54 @@ protected:
    void ComputeJPEGFragmentInfo();
    // Entry
    bool CheckIfEntryExistByNumber(uint16_t group, uint16_t elem );
-public:
-   virtual std::string GetEntryByName    (TagName const & tagName);
-   virtual std::string GetEntryVRByName  (TagName const & tagName);
-   virtual std::string GetEntryByNumber  (uint16_t group, uint16_t elem);
-   virtual std::string GetEntryVRByNumber(uint16_t group, uint16_t elem);
-   virtual int     GetEntryLengthByNumber(uint16_t group, uint16_t elem);
-//protected:
-   virtual bool SetEntryByName  (std::string const & content, 
-                                 TagName const & tagName );
-   virtual bool SetEntryByNumber(std::string const & content,
-                                 uint16_t group, uint16_t element);
-   virtual bool SetEntryByNumber(uint8_t* content, int lgth,
-                                 uint16_t group, uint16_t element);
-   virtual void* GetEntryBinAreaByNumber(uint16_t group, uint16_t elem);   
-   // FIXME
-   // Verify the usefull of this method... otherwise remove it
-   // It's body is commented in the .xx
-   //virtual bool  SetEntryBinAreaByNumber(uint8_t* a, uint16_t group,
-   //                                                uint16_t elem);
 
-   virtual void UpdateShaEntries();
+   int ComputeGroup0002Length( FileType filetype );
 
-   // Header entry
-   DocEntry* GetDocEntryByNumber(uint16_t group, uint16_t element); 
-   DocEntry* GetDocEntryByName  (TagName const & tagName);
+// Variables
+   /// Refering underlying filename.
+   std::string Filename;
 
-   ValEntry* GetValEntryByNumber(uint16_t group, uint16_t element); 
-   //BinEntry* GetBinEntryByNumber(uint16_t group, uint16_t element); 
-   RLEFramesInfo* GetRLEInfo() { return RLEInfo; }
-   JPEGFragmentsInfo* GetJPEGInfo() { return JPEGInfo; }
+   /// \brief SWap code (e.g. Big Endian, Little Endian, Bad Big Endian,
+   /// Bad Little Endian) according to the processor Endianity and
+   /// what is written on disc.
+   int SwapCode;
 
-   void LoadDocEntrySafe(DocEntry* entry);
-   TagDocEntryHT* BuildFlatHashTable();
+   /// File Pointer, opened during Header parsing.
+   std::ifstream* Fp;
+
+   /// ACR, ACR_LIBIDO, ExplicitVR, ImplicitVR, Unknown
+   FileType Filetype;  
+
+   /// After opening the file, we read HEADER_LENGTH_TO_READ bytes.
+   static const unsigned int HEADER_LENGTH_TO_READ; 
+
+   /// \brief Elements whose value is longer than MAX_SIZE_LOAD_ELEMENT_VALUE
+   /// are NOT loaded.
+   static const unsigned int MAX_SIZE_LOAD_ELEMENT_VALUE;
+
+   /// \brief Elements whose value is longer than  MAX_SIZE_PRINT_ELEMENT_VALUE
+   /// are NOT printed.
+   /// \todo Currently not used since collides with #define in
+   ///       class DocEntry . See also
+   ///       method ref Document::SetMaxSizePrintEntry()
+   static const unsigned int MAX_SIZE_PRINT_ELEMENT_VALUE;
+
+   /// Store the RLE frames info obtained during parsing of pixels.
+   RLEFramesInfo* RLEInfo;
+
+   /// Store the JPEG fragments info obtained during parsing of pixels.
+   JPEGFragmentsInfo* JPEGInfo;
 
 private:
+// Methods
    // Read
    void ParseDES(DocEntrySet *set,long offset, long l_max, bool delim_mode);
    void ParseSQ (SeqEntry *seq,   long offset, long l_max, bool delim_mode);
 
-   void LoadDocEntry      (DocEntry *);
-   void FindDocEntryLength(DocEntry *) throw ( FormatError );
-   void FindDocEntryVR    (DocEntry *);
-   bool CheckDocEntryVR   (DocEntry *, VRKey);
+   void LoadDocEntry         (DocEntry *);
+   void FindDocEntryLength   (DocEntry *) throw ( FormatError );
+   std::string FindDocEntryVR();
+   bool CheckDocEntryVR      (VRKey);
 
    std::string GetDocEntryValue  (DocEntry *);
    std::string GetDocEntryUnvalue(DocEntry *);
@@ -255,21 +243,28 @@ private:
                                    DocEntrySet* set );
 
    void HandleBrokenEndian(uint16_t  group, uint16_t  elem);
-public:
-// Accessors:
-   /// Accessor to \ref Filename
-   const std::string &GetFileName() const { return Filename; }
-
-   /// Accessor to \ref Filename
-   void SetFileName(std::string const & fileName) { Filename = fileName; }
 
-   /// 'Swap code' accessor (see \ref SwapCode )
-   int GetSwapCode() { return SwapCode; }
+// Variables
+   /// Public dictionary used to parse this header
+   Dict* RefPubDict;
    
-   bool operator<(Document &document);
+   /// \brief Optional "shadow dictionary" (private elements) used to parse
+   /// this header
+   Dict* RefShaDict;
 
-   int ComputeGroup0002Length( FileType filetype );
+   /// \brief Size threshold above which an element value will NOT be loaded
+   /// in memory (to avoid loading the image/volume itself). By default,
+   /// this upper bound is fixed to 1024 bytes (which might look reasonable
+   /// when one considers the definition of the various VR contents).
+   uint32_t MaxSizeLoadEntry;
+   
+   /// \brief Size threshold above which an element value will NOT be *printed*
+   /// in order no to polute the screen output. By default, this upper bound
+   /// is fixed to 64 bytes.
+   uint32_t MaxSizePrintEntry;   
 
+private:
+   friend class File;
 };
 } // end namespace gdcm
 
index 2d6e0545343db63c889fafd913593a574c68624c..ef4d814ec939e506c7457e400b65ccacddccdc1c 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmPixelReadConvert.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/12/16 11:37:03 $
-  Version:   $Revision: 1.12 $
+  Date:      $Date: 2005/01/06 13:35:38 $
+  Version:   $Revision: 1.13 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -1081,7 +1081,6 @@ void PixelReadConvert::GrabInformationsFromHeader( Header* header )
    if ( HasLUT )
    {
       // Just in case some access to a Header element requires disk access.
-      // Note: gdcmDocument::Fp is leaved open after OpenFile.
       LutRedDescriptor   = header->GetEntryByNumber( 0x0028, 0x1101 );
       LutGreenDescriptor = header->GetEntryByNumber( 0x0028, 0x1102 );
       LutBlueDescriptor  = header->GetEntryByNumber( 0x0028, 0x1103 );
index 65fefdb3ecff0bf59284dbc6995b2a94863a7126..66006a86f1971b9749ee32dfbca6a8e7b4f31169 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmVR.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/05 15:38:28 $
-  Version:   $Revision: 1.24 $
+  Date:      $Date: 2005/01/06 13:35:38 $
+  Version:   $Revision: 1.25 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -120,7 +120,7 @@ bool VR::IsVROfGdcmBinaryRepresentable(VRKey const & tested)
    if ( tested == GDCM_UNKNOWN)
       return true;
 
-   if ( ! Count(tested) )
+   if ( ! IsValidVR(tested) )
    {
       dbg.Verbose(0, "VR::IsVROfGdcmBinaryRepresentable: tested not a VR!");
       return false;
@@ -145,7 +145,7 @@ bool VR::IsVROfGdcmBinaryRepresentable(VRKey const & tested)
 bool VR::IsVROfGdcmStringRepresentable(VRKey const & tested)
 {
 
-   if ( ! Count(tested) )
+   if ( ! IsValidVR(tested) )
    {
       dbg.Verbose(0, "VR::IsVROfGdcmStringRepresentable: tested not a VR!");
       return false;
@@ -175,6 +175,11 @@ bool VR::IsVROfGdcmStringRepresentable(VRKey const & tested)
    return false;
 }
 
+bool VR::IsValidVR(VRKey const & key)
+{
+   return(vr.find(key)!=vr.end());
+}
+
 //-----------------------------------------------------------------------------
 // Protected
 
index 933e7f0f8bce82dac03c644b100439a492cb4321..bef9882b2d307df3e6bfc764d7a6d87e06127152 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmVR.h,v $
   Language:  C++
-  Date:      $Date: 2004/10/28 03:10:58 $
-  Version:   $Revision: 1.14 $
+  Date:      $Date: 2005/01/06 13:35:38 $
+  Version:   $Revision: 1.15 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -49,6 +49,8 @@ public:
    bool IsVROfGdcmBinaryRepresentable(VRKey const & tested);
    bool IsVROfGdcmStringRepresentable(VRKey const & tested);
 
+   bool IsValidVR(VRKey const & key);
+
 private:
    VRHT vr;
 };