]> Creatis software - gdcm.git/blobdiff - src/gdcm.h
2002-12-6 Eric Boix <Eric.Boix@creatis.insa-lyon.fr>
[gdcm.git] / src / gdcm.h
index c8806c7ccbe1919399167625a06dbf68074495fb..3b35c7629547c70a4e09e148e47e3138c052e399 100644 (file)
@@ -18,8 +18,7 @@
 #include <string>
 #include <iostream>
 #include <stddef.h>   // For size_t
-#include <glib.h>
-#include <stdio.h>    // CLEANME
+#include <stdio.h>    // FIXME For FILE on GCC only
 #include <map>        // The requirement for the hash table (or map) that
                       // we shall use:
                       // 1/ First, next, last (iterators)
                       //    which should be around 4500 entries which is the
                       //    average dictionary size (said JPR)
 
-#ifdef _MSC_VR
+#define g_malloc malloc
+#define g_free   free
+
+#ifdef __GNUC__
+#include <stdint.h>
+#define guint16 uint16_t
+#define guint32 uint32_t
+#endif
+#ifdef _MSC_VER 
+typedef  unsigned short guint16;
+typedef  unsigned int guint32;
+
+#endif
+
+#ifdef _MSC_VER
        using namespace std;  // string type lives in the std namespace on VC++
 #endif
-#ifdef _MSC_VR
+#ifdef _MSC_VER
 #define GDCM_EXPORT __declspec( dllexport )
 #else
 #define GDCM_EXPORT
@@ -79,12 +92,15 @@ private:
 public:
        //CLEANME gdcmDictEntry();
        gdcmDictEntry(guint16 group, guint16 element,
-                     string vr, string fourth, string name);
+                     string vr     = "Unknown",
+                                         string fourth = "Unknown",
+                                         string name   = "Unknown");
        static TagKey TranslateToKey(guint16 group, guint16 element);
        guint16 GetGroup(void)  { return group;};
        guint16 GetElement(void){return element;};
        string  GetVR(void)     {return vr; };
-       void    SetVR(string in){vr = in; };
+       void    SetVR(string);
+       bool    IsVrUnknown(void);
        string  GetFourth(void) {return fourth;};
        string  GetName(void)   {return name;};
        string  GetKey(void)    {return key;};
@@ -141,19 +157,28 @@ class GDCM_EXPORT ElValue {
 private:
        gdcmDictEntry *entry;
        guint32 LgrElem;
+       bool ImplicitVr;       // Even when reading explicit vr files, some
+                              // elements happen to be implicit. Flag them here
+                              // since we can't use the entry->vr without breaking
+                              // the underlying dictionary.
        // Might prove of some interest (see _ID_DCM_ELEM)
        // int Swap;
 public:
        string  value;     // used to be char * valeurElem
        size_t Offset;     // Offset from the begining of file for direct user access
        ElValue(gdcmDictEntry*);
-       void   SetVR(string);
-       string GetVR(void);
+       void SetDictEntry(gdcmDictEntry *NewEntry) { entry = NewEntry; };
+
+       bool   IsVrUnknown(void) { return entry->IsVrUnknown(); };
        void SetLength(guint32 l){LgrElem = l; };
        void SetValue(string val){ value = val; };
        void SetOffset(size_t of){ Offset = of; };
+       void SetImplicitVr(void) { ImplicitVr = true; };
+       bool  IsImplicitVr(void) { return ImplicitVr; };
+       void    SetVR(string);
+       string  GetVR(void);
        string  GetValue(void)   { return value; };
-       guint32 GetLength(void) { return LgrElem; };
+       guint32 GetLength(void)  { return LgrElem; };
        size_t  GetOffset(void)  { return Offset; };
        guint16 GetGroup(void)   { return entry->GetGroup(); };
        guint16 GetElement(void) { return entry->GetElement(); };
@@ -165,7 +190,7 @@ typedef map<TagKey, ElValue*> TagElValueHT;
 typedef map<string, ElValue*> TagElValueNameHT;
 // Container for a set of succefully parsed ElValues.
 class GDCM_EXPORT ElValSet {
-       // We need both accesses with a TagKey and the Dicentry.Name
+       // We need both accesses with a TagKey and the Dictentry.Name
        TagElValueHT tagHt;
        TagElValueNameHT NameHt;
 public:
@@ -192,7 +217,7 @@ typedef map<TagKey, VRAtr> VRHT;    // Value Representation Hash Table
 // Notes:
 // * the gdcmHeader::Set*Tag* family members cannot be defined as protected
 //   (Swig limitations for as Has_a dependency between gdcmFile and gdcmHeader)
-class GDCM_EXPORT gdcmHeader { 
+class GDCM_EXPORT gdcmHeader {
 //FIXME sw should be qn EndianType !!!
        //enum EndianType {
                //LittleEndian, 
@@ -200,13 +225,15 @@ class GDCM_EXPORT gdcmHeader {
                //BigEndian, 
                //BadBigEndian};
 private:
-       // All instances share the same value representation dictionary
+       // All instances share the same Value Representation dictionary
        static VRHT *dicom_vr;
+       // Dictionaries of data elements:
        static gdcmDictSet* Dicts;  // Global dictionary container
        gdcmDict* RefPubDict;       // Public Dictionary
        gdcmDict* RefShaDict;       // Shadow Dictionary (optional)
-       ElValSet PubElVals;     // Element Values parsed with Public Dictionary
-       ElValSet ShaElVals;     // Element Values parsed with Shadow Dictionary
+       // Parsed element values:
+       ElValSet PubElVals;         // parsed with Public Dictionary
+       ElValSet ShaElVals;         // parsed with Shadow Dictionary
        // In order to inspect/navigate through the file
        string filename;
        FILE * fp;
@@ -216,7 +243,13 @@ private:
        // outside of the elements:
        guint16 grPixel;
        guint16 numPixel;
+       // Swap code (little, big, big-bad endian): this code is not fixed
+       // during parsing.
        int sw;
+       // Only the elements whose size are below this bound shall be loaded.
+       // By default, this upper bound is limited to 1024 (which looks reasonable
+       // when one considers the definition of the various VR contents).
+       guint32 MaxSizeLoadElementValue;
 
        guint16 ReadInt16(void);
        guint32 ReadInt32(void);
@@ -227,10 +260,15 @@ private:
        void FindLength(ElValue *);
        void FindVR(ElValue *);
        void LoadElementValue(ElValue *);
+       void LoadElementValueSafe(ElValue *);
        void SkipElementValue(ElValue *);
        void InitVRDict(void);
-       bool IsAnInteger(guint16, guint16, string, guint32);
-       ElValue * ReadNextElement(void);
+       void SwitchSwapToBigEndian(void);
+       void FixFoundLength(ElValue*, guint32);
+       bool IsAnInteger(ElValue *);
+       bool IsBigEndianTransferSyntax(void);
+       void SetMaxSizeLoadElementValue(long);
+       ElValue       * ReadNextElement(void);
        gdcmDictEntry * IsInDicts(guint32, guint32);
        size_t GetPixelOffset(void);
 protected: