]> Creatis software - gdcm.git/blobdiff - src/gdcmParser.h
* src/gdcmCommon.h: FileType enum entry DICOMDIR removed (since
[gdcm.git] / src / gdcmParser.h
index 2ab4cce6eb2ab9339a89527729d2735e17807152..74ef05261d0ded042a8c532a2ca2dbad132e8578 100644 (file)
@@ -28,19 +28,12 @@ typedef std::string GroupKey;
 typedef std::map<GroupKey, int> GroupHT;
 
 //-----------------------------------------------------------------------------
-/*
- * \defgroup gdcmParser
+/**
  * \brief used by both gdcmHeader and gdcmDicomDir
  */
 class GDCM_EXPORT gdcmParser
 {
 public:
-   gdcmParser(bool exception_on_error  = false);
-   gdcmParser(const char *filename, 
-              bool  exception_on_error = false, 
-              bool  enable_sequences   = false,
-             bool  ignore_shadow      = false);
-   virtual ~gdcmParser(void);
 
 // Print
    /**
@@ -48,13 +41,26 @@ public:
     * \brief   Sets the print level for the Dicom Header 
     * \note    0 for Light Print; 1 for 'medium' Print, 2 for Heavy
     */
-   void SetPrintLevel(int level) { printLevel = level; };
+   void SetPrintLevel(int level) 
+      { printLevel = level; };
+   /**
+    * \ingroup gdcmParser
+    * \brief   canonical Printer 
+    * \sa    SetPrintLevel
+    */   
+   virtual void Print        (std::ostream &os = std::cout) 
+      {PrintEntry(os);};
    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
-   inline std::string GetFileName(void) {return filename;}
+   /**
+    * \ingroup gdcmParser
+    * \brief   Gets the external File Name 
+    */
+   inline std::string GetFileName(void) 
+      {return filename;}
 
 // Dictionnaries
    gdcmDict *GetPubDict(void);
@@ -85,21 +91,27 @@ public:
     */
    inline ListTag &GetListEntry(void) { return listEntries; };
 
-// Read (used in gdcmFile)
+// Read (used in gdcmFile, gdcmDicomDir)
    FILE *OpenFile(bool exception_on_error = false) throw(gdcmFileError);
    bool CloseFile(void);
 
-// Write (used in gdcmFile)
+// Write (used in gdcmFile, gdcmDicomDir)
    virtual bool Write(FILE *, FileType);
 
-   bool ReplaceOrCreateByNumber(std::string Value, guint16 Group, guint16 Elem);
-   bool ReplaceOrCreateByNumber(     char  *Value, guint16 Group, guint16 Elem);
+   gdcmHeaderEntry * ReplaceOrCreateByNumber(std::string Value, guint16 Group, guint16 Elem);
+   gdcmHeaderEntry * ReplaceOrCreateByNumber(     char  *Value, guint16 Group, guint16 Elem);
    bool ReplaceIfExistByNumber (     char  *Value, guint16 Group, guint16 Elem);
 
 // System access
+   /**
+    * \ingroup gdcmHeader
+    * \brief   returns the 'swap code' 
+    *          (Big Endian, Little Endian, 
+    *          Bad Big Endian, Bad Little Endian)
+    *          according to the processor Endianity and what's written on disc
+    * return 
+    */
    inline int GetSwapCode(void) { return sw; }
-   guint16 GetGrPixel(void) {return GrPixel;}
-   guint16 GetNumPixel(void) {return NumPixel;}
    
    guint16 SwapShort(guint16);   // needed by gdcmFile
    guint32 SwapLong(guint32);    // needed by gdcmFile
@@ -107,16 +119,26 @@ public:
    guint32 UnswapLong(guint32);  // needed by gdcmFile
 
 protected:
+// constructor and destructor are protected to forbid end user 
+// to instanciate class gdcmParser 
+// (only gdcmHeader and gdcmDicomDir are meaningfull)
+   gdcmParser(bool exception_on_error  = false);
+   gdcmParser(const char *inFilename, 
+              bool  exception_on_error = false, 
+              bool  enable_sequences   = false,
+             bool  ignore_shadow      = false);
+   virtual ~gdcmParser(void);
 // Entry
    int CheckIfEntryExistByNumber(guint16 Group, guint16 Elem ); // int !
    virtual std::string GetEntryByName    (std::string tagName);
    virtual std::string GetEntryVRByName  (std::string tagName);
    virtual std::string GetEntryByNumber  (guint16 group, guint16 element);
    virtual std::string GetEntryVRByNumber(guint16 group, guint16 element);
+   virtual int     GetEntryLengthByNumber(guint16 group, guint16 element);
 
    virtual bool SetEntryByName  (std::string content, std::string tagName);
-   virtual bool SetEntryByNumber(std::string content, guint16 group, guint16 element);
-   virtual bool SetEntryLengthByNumber(guint32 l, guint16 group, guint16 element);
+   virtual bool SetEntryByNumber(std::string content,  guint16 group, guint16 element);
+   virtual bool SetEntryLengthByNumber(guint32 length, guint16 group, guint16 element);
 
    virtual size_t GetEntryOffsetByNumber  (guint16 Group, guint16 Elem);
    virtual void  *GetEntryVoidAreaByNumber(guint16 Group, guint16 Elem);   
@@ -134,29 +156,75 @@ protected:
    void LoadHeaderEntrySafe(gdcmHeaderEntry *);
 
    void UpdateGroupLength(bool SkipSequence = false, FileType type = ImplicitVR);
-   void WriteEntries(FileType type, FILE *);
+   void WriteEntry(gdcmHeaderEntry *tag,FILE *_fp,FileType type);
+   void WriteEntries(FILE *_fp,FileType type);
+   void WriteEntriesDeprecated(FILE *_fp,FileType type); // JPR
 
+   void AddHeaderEntry       (gdcmHeaderEntry *);
+   
+   /**
+    * \ingroup gdcmParser
+    * \brief   Set the external File Name 
+    */
+   inline void SetFileName(char* fileName) 
+      {filename = fileName;}
+      
 // Variables
+   /**
+   * \brief File Pointer, open during Header parsing
+   */
    FILE *fp;
-   FileType filetype; // ACR, ACR_LIBIDO, ExplicitVR, ImplicitVR, Unknown
+   /**
+   * \brief 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; 
+/// Elements whose value is longer than MAX_SIZE_LOAD_ELEMENT_VALUE are NOT loaded
    static const unsigned int MAX_SIZE_LOAD_ELEMENT_VALUE;
+/// Elements whose value is longer than  MAX_SIZE_PRINT_ELEMENT_VALUE are NOT printed  
    static const unsigned int MAX_SIZE_PRINT_ELEMENT_VALUE;
 
 protected:
-   TagHeaderEntryHT tagHT; // H Table (multimap), to provide fast access
-   ListTag listEntries;    // chained list, to keep the 'spacial' ordering
-    
+   /**
+   * \brief H Table (multimap), to provide fast access
+   */
+   TagHeaderEntryHT tagHT; 
+   /**
+   * \brief chained list, to keep the 'spacial' ordering
+   */
+   ListTag listEntries; 
+   /**
+   * \brief will be set 1 if user asks to 'go inside' the 'sequences' (VR = "SQ")
+   */    
    int enableSequences;
+   /**
+   * \brief amount of printed details for each Header Entry (Dicom Element)
+   *  0 : the least 
+   */    
    int printLevel;
    
-   // For some ACR-NEMA images, it's *not* 7fe0, 0010 ...    
+   /** 
+   * \brief For some ACR-NEMA images, it's *not* 7fe0 ... 
+   */   
    guint16 GrPixel;
+   
+   /// In some cases (e.g. for some ACR-NEMA images) the Header Entry Element
+   /// Number of the 'Pixel Element' is *not* found at 0x0010. In order to
+   /// make things easier the parser shall store the proper value in
+   /// NumPixel to provide a unique access facility. See also
+   /// \ref gdcmHeader::gdcmHeader
    guint16 NumPixel;
-   // some files may contain icons; GrPixel,NumPixel appears several times
-   // Let's remember how many times!
+   /**
+   * \brief some files may contain icons; GrPixel,NumPixel appears several times
+   * Let's remember how many times!
+   */
    int countGrPixel;
+   /**
+   * \brief = true when the 'pixel Element' is reached during writting process
+   */   
+   bool itsTimeToWritePixels;
       
 private:
    // Read
@@ -164,7 +232,6 @@ private:
 
    void LoadHeaderEntries    (void);
    void LoadHeaderEntry      (gdcmHeaderEntry *);
-   void AddHeaderEntry       (gdcmHeaderEntry *);
    void FindHeaderEntryLength(gdcmHeaderEntry *);
    void FindHeaderEntryVR    (gdcmHeaderEntry *);
    bool CheckHeaderEntryVR   (gdcmHeaderEntry *, VRKey);
@@ -193,49 +260,67 @@ private:
    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 *);
+                                      std::string vr     = "unkn",
+                                      std::string fourth = "unkn",
+                                      std::string name   = "unkn");
+   //gdcmDictEntry *NewVirtualDictEntry(gdcmHeaderEntry *); // never defined
    
    // HeaderEntry related utilities
+   
    gdcmHeaderEntry *ReadNextHeaderEntry   (void);
    gdcmHeaderEntry *NewHeaderEntryByNumber(guint16 group, 
                                            guint16 element);
    gdcmHeaderEntry *NewHeaderEntryByName  (std::string Name);
-
-
+   
    // Deprecated (Not used) --> commented out
    //gdcmHeaderEntry *NewManualHeaderEntryToPubDict(std::string NewTagName,
    //                                               std::string VR);
+   
    guint32 GenerateFreeTagKeyInGroup(guint16 group);
 
-   // Refering underlying filename.
+   /**
+   * \brief Refering underlying filename.
+   */
    std::string filename; 
 
-   // Public dictionary used to parse this header
+   /**
+   * \brief Public dictionary used to parse this header
+   */
    gdcmDict *RefPubDict;
-   // Optional "shadow dictionary" (private elements) used to parse this header
+   
+   /**
+   * \brief Optional "shadow dictionary" (private elements) used to parse this header
+   */
    gdcmDict *RefShaDict;
 
-   // = 1 if a gdcmHeaderEntry was added post parsing 
+   /**
+   * \brief = 1 if a gdcmHeaderEntry was added post parsing 
+   */   
    int wasUpdated;
    
-   // =1 if user wants to skip shadow groups while parsing (to save space)
+   /**
+   * \brief =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.
+   
+   /**
+   * \brief Swap code e.g. little, big, bad-big, bad-little endian). 
+   * \warning : this code is not fixed during header parsing.      
+   */
    int sw;
-
-   // Size treshold 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).
+   /**
+   * \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).
+   */
    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.   
+   
+   /**
+   * \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.
+   */   
    guint32 MaxSizePrintEntry;
    
 };