]> Creatis software - gdcm.git/blobdiff - src/gdcmDocument.h
2004-06-22 Jean-Pierre Roux
[gdcm.git] / src / gdcmDocument.h
index 96a9aea37f7b50843c3c5634756659addee4189d..3cf32f684040d2ee12387d3bfb4aef06a603e434 100644 (file)
@@ -1,5 +1,21 @@
-// gdcmDocument.h
-//-----------------------------------------------------------------------------
+/*=========================================================================
+  Program:   gdcm
+  Module:    $RCSfile: gdcmDocument.h,v $
+  Language:  C++
+  Date:      $Date: 2004/06/22 13:47:33 $
+  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
+  http://www.creatis.insa-lyon.fr/Public/Gdcm/License.htm for details.
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+=========================================================================*/
+
 #ifndef GDCMDOCUMENT_H
 #define GDCMDOCUMENT_H
 
@@ -10,6 +26,8 @@
 #include "gdcmDictSet.h"
 #include "gdcmDocEntry.h"
 
+class gdcmValEntry;
+class gdcmBinEntry;
 class gdcmSeqEntry;
 
 #include "gdcmDocEntrySet.h"
@@ -40,7 +58,7 @@ private:
    
    /// \brief Equals =1 if user wants to skip shadow groups while parsing
    /// (to save space)
-   int ignoreShadow;
+   int IgnoreShadow;
 
    /// \brief Size threshold above which an element value will NOT be loaded
    /// in memory (to avoid loading the image/volume itself). By default,
@@ -55,7 +73,7 @@ private:
 
 protected:
    /// Refering underlying filename.
-   std::string 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
@@ -66,7 +84,7 @@ protected:
    FILE *fp;
 
    /// ACR, ACR_LIBIDO, ExplicitVR, ImplicitVR, Unknown
-   FileType filetype;  
+   FileType Filetype;  
 
    /// After opening the file, we read HEADER_LENGTH_TO_READ bytes.
    static const unsigned int HEADER_LENGTH_TO_READ; 
@@ -102,6 +120,7 @@ public:
 
 // Informations contained in the parser
    virtual bool IsReadable(void);
+   bool IsGivenTransferSyntax(const std::string & SyntaxToCheck);
    bool IsImplicitVRLittleEndianTransferSyntax(void);
    bool IsExplicitVRLittleEndianTransferSyntax(void);
    bool IsDeflatedExplicitVRLittleEndianTransferSyntax(void);
@@ -122,21 +141,20 @@ public:
    bool CloseFile(void);
 
 // Write (used in gdcmFile, gdcmDicomDir)
-   virtual bool Write(FILE *, FileType);
-   virtual void WriteEntryTagVRLength(gdcmDocEntry *tag,
-                                       FILE *_fp, FileType type);
-   virtual void WriteEntryValue(gdcmDocEntry *tag,FILE *_fp,FileType type);
-   virtual bool WriteEntry(gdcmDocEntry *tag,FILE *_fp,FileType type);
-   virtual bool WriteEntries(FILE *_fp,FileType type);
-
-   gdcmDocEntry * ReplaceOrCreateByNumber(std::string Value,
+
+   virtual bool WriteF(FileType type); // New stuff, with recursive exploration
+
+   gdcmValEntry * ReplaceOrCreateByNumber(std::string Value,
+                                             guint16 Group, guint16 Elem);
+
+   gdcmBinEntry * ReplaceOrCreateByNumber(void *voidArea, int lgth,
                                              guint16 Group, guint16 Elem);
    bool ReplaceIfExistByNumber (char *Value, guint16 Group, guint16 Elem);
    
    virtual void  *LoadEntryVoidArea       (guint16 Group, guint16 Element);
    void           LoadVLEntry             (gdcmDocEntry *entry);
       
-// System access
+   // System access
    guint16 SwapShort(guint16);   // needed by gdcmFile
    guint32 SwapLong(guint32);    // needed by gdcmFile
    guint16 UnswapShort(guint16); // needed by gdcmFile
@@ -147,18 +165,18 @@ protected:
    // to instanciate from this class gdcmDocument (only gdcmHeader and
    // gdcmDicomDir are meaningfull).
    gdcmDocument(bool exception_on_error  = false);
-   gdcmDocument(const char *inFilename, 
+   gdcmDocument(std::string const & inFilename, 
                 bool  exception_on_error = false, 
                 bool  enable_sequences   = false,
                 bool  ignore_shadow      = false);
    virtual ~gdcmDocument(void);
    
    void gdcmDocument::Parse7FE0 (void);   
-// Entry
+   // Entry
    int CheckIfEntryExistByNumber(guint16 Group, guint16 Elem ); // int !
 public:
-   virtual std::string GetEntryByName    (std::string tagName);
-   virtual std::string GetEntryVRByName  (std::string tagName);
+   virtual std::string GetEntryByName    (TagName tagName);
+   virtual std::string GetEntryVRByName  (TagName tagName);
    virtual std::string GetEntryByNumber  (guint16 group, guint16 element);
    virtual std::string GetEntryVRByNumber(guint16 group, guint16 element);
    virtual int     GetEntryLengthByNumber(guint16 group, guint16 element);
@@ -166,6 +184,8 @@ protected:
    virtual bool SetEntryByName  (std::string content, std::string tagName);
    virtual bool SetEntryByNumber(std::string content,
                                  guint16 group, guint16 element);
+   virtual bool SetEntryByNumber(void *content, int lgth,
+                                 guint16 group, guint16 element);
    virtual bool SetEntryLengthByNumber(guint32 length,
                                  guint16 group, guint16 element);
 
@@ -173,16 +193,19 @@ protected:
    virtual void  *GetEntryVoidAreaByNumber(guint16 Group, guint16 Elem);   
    virtual bool   SetEntryVoidAreaByNumber(void *a, guint16 Group, guint16 Elem);
 
-   virtual void UpdateShaEntries(void);
+   virtual void UpdateShaEntries();
 
-// Header entry
+   // Header entry
    gdcmDocEntry *GetDocEntryByNumber  (guint16 group, guint16 element); 
    gdcmDocEntry *GetDocEntryByName    (std::string Name);
 
+   gdcmValEntry *GetValEntryByNumber  (guint16 group, guint16 element); 
+   gdcmBinEntry *GetBinEntryByNumber  (guint16 group, guint16 element); 
+
    void LoadDocEntrySafe(gdcmDocEntry *);
 
 private:
-// Read
+   // Read
    long ParseDES(gdcmDocEntrySet *set, long offset, long l_max,bool delim_mode);
    long ParseSQ(gdcmSeqEntry *seq, long offset, long l_max, bool delim_mode); 
    
@@ -200,54 +223,47 @@ private:
    void FixDocEntryFoundLength(gdcmDocEntry *, guint32);
    bool IsDocEntryAnInteger   (gdcmDocEntry *);
 
-   guint32 FindDocEntryLengthOB(void);
+   guint32 FindDocEntryLengthOB();
 
-   guint16 ReadInt16(void);
-   guint32 ReadInt32(void);
+   guint16 ReadInt16();
+   guint32 ReadInt32();
    void    SkipBytes(guint32);
+   guint32 ReadTagLength(guint16, guint16);
+   guint32 ReadItemTagLength();
+   guint32 ReadSequenceDelimiterTagLength();
 
-   void Initialise(void);
-   bool CheckSwap(void);
-   void SwitchSwapToBigEndian(void);
+   void Initialise();
+   bool CheckSwap();
+   void SwitchSwapToBigEndian();
    void SetMaxSizeLoadEntry(long);
    void SetMaxSizePrintEntry(long);
 
-  // DictEntry  related utilities
-   
-   gdcmDictEntry *GetDictEntryByName  (std::string Name);
-   gdcmDictEntry *GetDictEntryByNumber(guint16, guint16);
-   gdcmDictEntry *NewVirtualDictEntry(guint16 group, 
-                                      guint16 element,
-                                      std::string vr     = "unkn",
-                                      std::string fourth = "unkn",
-                                      std::string name   = "unkn");
+        
    // DocEntry related utilities
-   gdcmDocEntry *ReadNextDocEntry   (void);
-   gdcmDocEntry *NewDocEntryByNumber(guint16 group, 
-                                           guint16 element);
-   gdcmDocEntry *NewDocEntryByName  (std::string Name);
-   
+   gdcmDocEntry *ReadNextDocEntry   ();
+
+
    guint32 GenerateFreeTagKeyInGroup(guint16 group);
 
 public:
 // Accessors:
    /// Accessor to \ref printLevel
-   void SetPrintLevel(int level) { printLevel = level; };
+   inline void SetPrintLevel(int level) { printLevel = level; }
 
    /// Accessor to \ref filename
-   inline std::string GetFileName(void) {return filename;}
+   inline std::string &GetFileName() { return Filename; }
 
    /// Accessor to \ref filename
-   inline void SetFileName(char* fileName) {filename = fileName;}
+   inline void SetFileName(const char* fileName) { Filename = fileName; }
 
    /// Accessor to \ref gdcmElementSet::tagHT
-   inline TagDocEntryHT &GetEntry(void) { return tagHT; };
+   inline TagDocEntryHT &GetEntry() { return tagHT; };
 
    /// 'Swap code' accessor (see \ref sw )
-   inline int GetSwapCode(void) { return sw; }
+   inline int GetSwapCode() { return sw; }
    
    /// File pointer
-   inline FILE * GetFP(void) { return fp; }
+   inline FILE * GetFP() { return fp; }
 
    bool operator<(gdcmDocument &document);