]> Creatis software - gdcm.git/blobdiff - src/gdcmParser.h
2004-01-31 Jean-Pierre Roux
[gdcm.git] / src / gdcmParser.h
index 054c158a6d5ce80f7da0680e77d90aa48eab9c70..74db3d233c6fd53d53f5360a01ef42217fbdb442 100644 (file)
@@ -18,27 +18,28 @@ typedef std::string VRKey;
 typedef std::string VRAtr;
 typedef std::map<VRKey, VRAtr> VRHT;    // Value Representation Hash Table
 
-typedef std::multimap<TagKey, gdcmHeaderEntry*> TagHeaderEntryHT;
-typedef std::pair<TagKey, gdcmHeaderEntry*> PairHT;
+typedef std::multimap<TagKey, gdcmHeaderEntry *> TagHeaderEntryHT;
+typedef std::pair<TagKey, gdcmHeaderEntry *> PairHT;
 typedef std::pair<TagHeaderEntryHT::iterator,TagHeaderEntryHT::iterator> IterHT; 
 
-typedef std::list<gdcmHeaderEntry*> ListTag; // for linking together the Elements
+typedef std::list<gdcmHeaderEntry *> ListTag; // for linking together the Elements
 
 typedef std::string GroupKey;
 typedef std::map<GroupKey, int> GroupHT;
 
 //-----------------------------------------------------------------------------
 /*
- * \defgroup gdcmHeader
- * \brief
+ * \defgroup gdcmParser
+ * \brief used by both gdcmHeader and gdcmDicomDir
  */
 class GDCM_EXPORT gdcmParser
 {
 public:
-   gdcmParser(bool exception_on_error = false);
+   gdcmParser(bool exception_on_error  = false);
    gdcmParser(const char *filename, 
               bool  exception_on_error = false, 
-              bool  enable_sequences   = false);
+              bool  enable_sequences   = false,
+             bool  ignore_shadow      = false);
    virtual ~gdcmParser(void);
 
 // Print
@@ -48,14 +49,21 @@ public:
     * \note    0 for Light Print; 1 for 'medium' Print, 2 for Heavy
     */
    void SetPrintLevel(int level) { printLevel = level; };
-   virtual void PrintPubEntry(std::ostream & os = std::cout);
-   virtual void PrintPubDict (std::ostream & os = std::cout);
-   virtual void PrintShaDict (std::ostream & os = std::cout);
+   virtual void PrintEntry   (std::ostream &os = std::cout);
+   virtual void PrintPubDict (std::ostream &os = std::cout);
+   virtual void PrintShaDict (std::ostream &os = std::cout);
 
-// Standard values and informations contained in the header
+// Standard values
    inline std::string GetFileName(void) {return filename;}
 
-   bool IsReadable(void);
+// Dictionnaries
+   gdcmDict *GetPubDict(void);
+   gdcmDict *GetShaDict(void);
+   bool SetShaDict(gdcmDict *dict);
+   bool SetShaDict(DictKey dictName);
+
+// Informations contained in the parser
+   virtual bool IsReadable(void);
    bool IsImplicitVRLittleEndianTransferSyntax(void);
    bool IsExplicitVRLittleEndianTransferSyntax(void);
    bool IsDeflatedExplicitVRLittleEndianTransferSyntax(void);
@@ -68,19 +76,18 @@ public:
     * \brief   returns a ref to the Dicom Header H table (multimap)
     * return the Dicom Header H table
     */
-   inline TagHeaderEntryHT &GetPubEntry(void) { return tagHT; };
+   inline TagHeaderEntryHT &GetEntry(void) { return tagHT; };
 
    /**
     * \ingroup gdcmHeader
     * \brief   returns a ref to the Dicom Header chained list
     * return the Dicom Header chained list
     */
-   inline ListTag &GetPubListEntry(void) { return listEntries; };
+   inline ListTag &GetListEntry(void) { return listEntries; };
 
 // Read (used in gdcmFile)
    FILE *OpenFile(bool exception_on_error = false) throw(gdcmFileError);
    bool CloseFile(void);
-   virtual void Parse(bool exception_on_error = false) throw(gdcmFormatError);
 
 // Write (used in gdcmFile)
    virtual bool Write(FILE *, FileType);
@@ -91,8 +98,10 @@ public:
 
 // System access
    inline int GetSwapCode(void) { return sw; }
-   guint16 SwapShort(guint16); // needed by gdcmFile
-   guint32 SwapLong(guint32);  // for JPEG Files
+   guint16 SwapShort(guint16);   // needed by gdcmFile
+   guint32 SwapLong(guint32);    // needed by gdcmFile
+   guint16 UnswapShort(guint16); // needed by gdcmFile
+   guint32 UnswapLong(guint32);  // needed by gdcmFile
 
 protected:
 // Entry
@@ -111,11 +120,15 @@ protected:
    virtual void  *LoadEntryVoidArea       (guint16 Group, guint16 Element);
    virtual bool   SetEntryVoidAreaByNumber(void *a, guint16 Group, guint16 Elem);
 
+   virtual void UpdateShaEntries(void);
+
 // Header entry
-   gdcmHeaderEntry *GetHeaderEntryByName  (std::string Name);
-   gdcmHeaderEntry *GetHeaderEntryByNumber(guint16 group, guint16 element); 
+   gdcmHeaderEntry *GetHeaderEntryByNumber  (guint16 group, guint16 element); 
+   gdcmHeaderEntry *GetHeaderEntryByName    (std::string Name);
+   IterHT           GetHeaderEntrySameNumber(guint16 group, guint16 element); 
+// IterHT           GetHeaderEntrySameName  (std::string Name); 
 
-   void LoadHeaderEntrySafe  (gdcmHeaderEntry *);
+   void LoadHeaderEntrySafe(gdcmHeaderEntry *);
 
    void UpdateGroupLength(bool SkipSequence = false, FileType type = ImplicitVR);
    void WriteEntries(FileType type, FILE *);
@@ -126,14 +139,28 @@ protected:
 
    static const unsigned int HEADER_LENGTH_TO_READ; 
    static const unsigned int MAX_SIZE_LOAD_ELEMENT_VALUE;
+   static const unsigned int MAX_SIZE_PRINT_ELEMENT_VALUE;
 
+protected:
+   int enableSequences;
+   int printLevel;
+   
+   TagHeaderEntryHT tagHT; // H Table (multimap), to provide fast access
+   ListTag listEntries;    // chained list, to keep the 'spacial' ordering 
+   
 private:
    // Read
+   bool ParseHeader(bool exception_on_error = false) throw(gdcmFormatError);
+
    void LoadHeaderEntries    (void);
    void LoadHeaderEntry      (gdcmHeaderEntry *);
    void AddHeaderEntry       (gdcmHeaderEntry *);
    void FindHeaderEntryLength(gdcmHeaderEntry *);
    void FindHeaderEntryVR    (gdcmHeaderEntry *);
+   bool CheckHeaderEntryVR   (gdcmHeaderEntry *, VRKey);
+
+   std::string GetHeaderEntryValue  (gdcmHeaderEntry *);
+   std::string GetHeaderEntryUnvalue(gdcmHeaderEntry *);
 
    void SkipHeaderEntry          (gdcmHeaderEntry *);
    void FixHeaderEntryFoundLength(gdcmHeaderEntry *, guint32);
@@ -146,54 +173,46 @@ private:
    void    SkipBytes(guint32);
 
    void Initialise(void);
-   void CheckSwap(void);
+   bool CheckSwap(void);
    void SwitchSwapToBigEndian(void);
    void SetMaxSizeLoadEntry(long);
+   void SetMaxSizePrintEntry(long);
 
-   // Dict
+   // DictEntry  related utilities
    gdcmDictEntry *GetDictEntryByName  (std::string Name);
    gdcmDictEntry *GetDictEntryByNumber(guint16, guint16);
-
+   gdcmDictEntry *NewVirtualDictEntry(guint16 group, 
+                                      guint16 element,
+                                      std::string vr     = "Unknown",
+                                      std::string fourth = "Unknown",
+                                      std::string name   = "Unknown");
+   gdcmDictEntry *NewVirtualDictEntry(gdcmHeaderEntry *);
+   
    // HeaderEntry related utilities
    gdcmHeaderEntry *ReadNextHeaderEntry   (void);
-   gdcmHeaderEntry *NewHeaderEntryByNumber(guint16 group, guint16 element);
+   gdcmHeaderEntry *NewHeaderEntryByNumber(guint16 group, 
+                                           guint16 element);
    gdcmHeaderEntry *NewHeaderEntryByName  (std::string Name);
 
-   // Deprecated (Not used)
-   gdcmHeaderEntry *NewManualHeaderEntryToPubDict(std::string NewTagName,
-                                                  std::string VR);
+
+   // Deprecated (Not used) --> commented out
+   //gdcmHeaderEntry *NewManualHeaderEntryToPubDict(std::string NewTagName,
+   //                                               std::string VR);
    guint32 GenerateFreeTagKeyInGroup(guint16 group);
 
    // Refering underlying filename.
    std::string filename; 
 
-   // Pointer to the Value Representation Hash Table which contains all
-   // the VR of the DICOM version3 public dictionary. 
-   gdcmVR *dicom_vr;     // Not a class member for thread-safety reasons
-   
-   // Pointer to the Transfert Syntax Hash Table which contains all
-   // the TS of the DICOM version3 public dictionary. 
-   gdcmTS *dicom_ts;     // Not a class member for thread-safety reasons 
-     
-   // Pointer to global dictionary container
-   gdcmDictSet *Dicts;   // Not a class member for thread-safety reasons
-   
    // Public dictionary used to parse this header
    gdcmDict *RefPubDict;
-   
-   // Optional "shadow dictionary" (private elements) used to parse this
-   // header
+   // Optional "shadow dictionary" (private elements) used to parse this header
    gdcmDict *RefShaDict;
 
-   TagHeaderEntryHT tagHT; // H Table (multimap), to provide fast access
-   ListTag listEntries;    // chained list, to keep the 'spacial' ordering 
-
-   // true if a gdcmHeaderEntry was added post parsing 
+   // = 1 if a gdcmHeaderEntry was added post parsing 
    int wasUpdated;
-   // for PrintHeader
-   int printLevel;
-
-   int enableSequences;
+   
+   // =1 if user wants to skip shadow groups while parsing (to save space)
+   int ignoreShadow;
 
    // Swap code e.g. little, big, bad-big, bad-little endian). Warning:
    // this code is not fixed during header parsing.
@@ -204,6 +223,11 @@ private:
    // this upper bound is fixed to 1024 bytes (which might look reasonable
    // when one considers the definition of the various VR contents).
    guint32 MaxSizeLoadEntry;
+   // Size treshold 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.   
+   guint32 MaxSizePrintEntry;
+
 };
 
 //-----------------------------------------------------------------------------