123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586 |
- /***************************************************************************
- * E-Com Technology Ltd.
- *
- * ECOMPACS DICOM Network Transport Libraries * Version 0.1 Beta
- ***************************************************************************/
- #ifndef _DICOM_VR
- #define _DICOM_VR
- class DString;
- class DICOMVRSet;
- class UID;
- #define VR_SHORT_DATA_LENGTH 64
- //////////////////////////////////////////////////////////////////////
- // class VR
- class DICOM_API VR
- {
- //public:
- protected:
- UINT16 Group;
- UINT16 Element;
- UINT32 Length;
- BYTE ShortData[VR_SHORT_DATA_LENGTH];
- void * LongData;
- UINT16 TypeCode;
- ArrayOfPtr <DICOMVRSet *> * SQVRSetArray;
- DICOMVRSet * Owner;
- protected:
- #ifdef _DEBUG
- char Description [255];
- #endif
- public:
- UINT16 GetGroup (void) const { return Group; }
- UINT16 GetElement (void) const { return Element; }
- UINT32 GetLength (void) const { return Length; }
- void * GetData (void) const { if (LongData) return LongData; else return (void *) ShortData; }
- UINT32 GetTag (void) const { return MakeTagFrom (Group, Element) ; }
- #ifdef _DEBUG
- void SetTag (UINT16 g, UINT16 e);
- #else
- void SetTag (UINT16 g, UINT16 e) { Group = g; Element = e; }
- #endif
- UINT16 GetTypeCode (void) const { return TypeCode; }
- void SetTypeCode (UINT32 theTypeCode) { TypeCode = theTypeCode; }
- void Attach (void * data, UINT32 length)
- {
- if (LongData) delete LongData;
- LongData = data;
- Length = length;
- }
- void * Detach (void)
- {
- if (LongData)
- {
- void * p = LongData;
- LongData = NULL;
- Length = 0;
- return p;
- }
- else
- {
- void * p = new BYTE[Length];
- memcpy (p, ShortData, Length);
- Length = 0;
- return p;
- }
- }
- void * GetDataSetLength (UINT32 length);
- ArrayOfPtr <DICOMVRSet *> * GetSQArray (void) const { return SQVRSetArray; }
- ArrayOfPtr <DICOMVRSet *> * DetachSQArray (void)
- {
- ArrayOfPtr <DICOMVRSet *> * pSQArray = SQVRSetArray;
- SQVRSetArray = NULL;
- return pSQArray;
- }
- void DeleteSQArray (void) { if (SQVRSetArray) delete SQVRSetArray; SQVRSetArray = NULL; }
- ArrayOfPtr <DICOMVRSet *> * AddSQArray (void)
- {
- if (! SQVRSetArray)
- SQVRSetArray = new ArrayOfPtr <DICOMVRSet *>;
- return SQVRSetArray;
- }
- DICOMVRSet * GetOwner (void) const { return Owner; }
- public:
- VR ()
- {
- Group = 0;
- Element = 0;
- LongData = NULL;
- Length = 0;
- TypeCode = 0;
- SQVRSetArray= NULL;
- Owner = NULL;
- #ifdef _DEBUG
- Description[0] = 0;
- #endif
- }
- VR (UINT16 g, UINT16 e, const UID & Uid);
- VR (UINT16 g, UINT16 e, const char * Str);
- VR (UINT16 g, UINT16 e, const DString & string);
- VR (UINT16 g, UINT16 e, UINT16 us)
- {
- Group = g;
- Element = e;
- Length = sizeof(UINT16);
- LongData = NULL;
- UINT16 *pus = (UINT16*)ShortData;
- *pus = us;
- TypeCode = 'US';
- SQVRSetArray= NULL;
- Owner = NULL;
- #ifdef _DEBUG
- DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
- #endif
- }
- VR (UINT16 g, UINT16 e, UINT32 ul)
- {
- Group = g;
- Element = e;
- Length = sizeof(UINT32);
- LongData = NULL;
- UINT32 *pul = (UINT32*)ShortData;
- *pul = ul;
- TypeCode = 'UL';
- SQVRSetArray= NULL;
- Owner = NULL;
- #ifdef _DEBUG
- DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
- #endif
- }
- VR (UINT16 g, UINT16 e, INT16 ss)
- {
- Group = g;
- Element = e;
- Length = sizeof(INT16);
- LongData = NULL;
- INT16 *pss = (INT16*)ShortData;
- *pss = ss;
- TypeCode = 'SS';
- SQVRSetArray= NULL;
- Owner = NULL;
- #ifdef _DEBUG
- DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
- #endif
- }
- VR (UINT16 g, UINT16 e, INT32 sl)
- {
- Group = g;
- Element = e;
- Length = sizeof(INT32);
- LongData = NULL;
- INT32 *psl = (INT32*)ShortData;
- *psl = sl;
- TypeCode = 'SL';
- SQVRSetArray= NULL;
- Owner = NULL;
- #ifdef _DEBUG
- DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
- #endif
- }
- VR (UINT16 g, UINT16 e, float fl)
- {
- Group = g;
- Element = e;
- Length = sizeof(float);
- LongData = NULL;
- float * pfl = (float*) ShortData;
- *pfl = fl;
- TypeCode = 'FL';
- SQVRSetArray= NULL;
- Owner = NULL;
- #ifdef _DEBUG
- DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
- #endif
- }
- VR (UINT16 g, UINT16 e, double dl)
- {
- Group = g;
- Element = e;
- Length = sizeof(double);
- LongData = NULL;
- double * pdl = (double*) ShortData;
- *pdl = dl;
- TypeCode = 'FD';
- SQVRSetArray= NULL;
- Owner = NULL;
- #ifdef _DEBUG
- DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
- #endif
- }
- VR (UINT16 g, UINT16 e, UINT16 * pus, int Count);
- VR (UINT16 g, UINT16 e, UINT32 * pul, int Count);
- VR (UINT16 g, UINT16 e, INT16 * pss, int Count);
- VR (UINT16 g, UINT16 e, INT32 * psl, int Count);
- VR (UINT16 g, UINT16 e)
- {
- Group = g;
- Element = e;
- Length = 0;
- LongData = NULL;
- TypeCode = 0;
- SQVRSetArray= NULL;
- Owner = NULL;
- #ifdef _DEBUG
- DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
- #endif
- }
- VR (UINT32 Tag)
- {
- Group = GroupOfTag32 (Tag);
- Element = ElementOfTag32 (Tag);
- Length = 0;
- LongData = NULL;
- TypeCode = 0;
- SQVRSetArray= NULL;
- Owner = NULL;
- #ifdef _DEBUG
- DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
- #endif
- }
- VR (const VR &);
- virtual ~VR () { Reset (); };
- // --------------- operator overload -----------
- operator UINT16 (void) const
- {
- if (Length < sizeof(UINT16)) return 0;
- UINT16 * pus = (UINT16 *) ShortData;
- return (* pus);
- }
- operator UINT32 (void) const
- {
- if (Length <= sizeof(UINT16)) return (this->operator UINT16 ());
- UINT32 * pul = (UINT32 *) ShortData;
- return (* pul);
- }
- operator INT16 (void) const
- {
- if (Length < sizeof(INT16)) return 0;
- INT16 * pss = (INT16 *) ShortData;
- return (* pss);
- }
- operator INT32 (void) const
- {
- if (Length <= sizeof(INT16)) return (this->operator INT16 ());
- INT32 * psl = (INT32 *) ShortData;
- return (*psl);
- }
- operator float (void) const
- {
- if (Length < sizeof(float)) return 0;
- float * pfl = (float*) ShortData;
- return (*pfl);
- }
- operator double (void) const
- {
- if (Length < sizeof(double)) return 0;
- double * pdl = (double*) ShortData;
- return (*pdl);
- }
- operator DString (void) const
- {
- DString str;
- Extract (str);
- return str;
- }
- // --------------- Assignment overload -----------
- VR & operator = (UINT16 us)
- {
- if (LongData)
- {
- delete LongData;
- LongData = NULL;
- }
- UINT16 * pus = (UINT16 *) ShortData;
- * pus = us;
- Length = sizeof(UINT16);
- return (*this);
- }
- VR & operator = (UINT32 ul)
- {
- if (LongData)
- {
- delete LongData;
- LongData = NULL;
- }
- UINT32 * pul = (UINT32 *) ShortData;
- * pul = ul;
- Length = sizeof(UINT32);
- return (*this);
- }
- VR & operator = (INT16 ss)
- {
- if (LongData)
- {
- delete LongData;
- LongData = NULL;
- }
- INT16 * pss = (INT16 *) ShortData;
- * pss = ss;
- Length = sizeof(INT16);
- return (*this);
- }
- VR & operator = (INT32 sl)
- {
- if (LongData)
- {
- delete LongData;
- LongData = NULL;
- }
- INT32 * psl = (INT32 *) ShortData;
- * psl = sl;
- Length = sizeof(INT32);
- return (*this);
- }
- VR & operator = (float f)
- {
- if (LongData)
- {
- delete LongData;
- LongData = NULL;
- }
- float * pf = (float *) ShortData;
- * pf = f;
- Length = sizeof (float);
- return (*this);
- }
- VR & operator = (double d)
- {
- if (LongData)
- {
- delete LongData;
- LongData = NULL;
- }
- double * pd = (double *) ShortData;
- * pd = d;
- Length = sizeof (double);
- return (*this);
- }
- VR & operator = (const char * str)
- {
- if (LongData)
- {
- delete LongData;
- LongData = NULL;
- }
- Length = strlen (str);
- if (! Length)
- {
- LongData = NULL;
- return (*this);
- }
- BYTE * Data;
- if (Length > sizeof (ShortData))
- {
- LongData = Data = new BYTE [Length+1];
- }
- else
- {
- Data = ShortData;
- LongData = NULL;
- }
- memcpy (Data, str, Length);
- if (Length & 0x01)
- {
- ((char *)Data)[Length] = ' ';
- Length ++;
- }
- return (*this);
- }
- VR & operator = (const DString & str)
- {
- if (LongData)
- {
- delete LongData;
- LongData = NULL;
- }
- Length = str.GetLength ();
- if (! Length)
- {
- LongData = NULL;
- return (*this);
- }
- BYTE * Data;
- if (Length > sizeof (ShortData))
- {
- LongData = Data = new BYTE [Length+1];
- }
- else
- {
- Data = ShortData;
- LongData = NULL;
- }
- memcpy (Data, str.constBuffer (), Length);
- if (Length & 0x01)
- {
- ((char *)Data)[Length] = ' ';
- Length ++;
- }
- return (*this);
- }
- VR & operator = (DICOMVRSet & fromVRS);
- // ------------------ Misc function --------------
- UINT32 Extract (char * Str, UINT32 size) const ;
- BOOL Extract (DString & s) const;
- DString ToStringOfData (void) const;
- virtual DString ToString (void) const;
- void Reset (void)
- {
- if (LongData) delete LongData;
- if (SQVRSetArray)
- {
- delete SQVRSetArray;
- SQVRSetArray = NULL;
- }
- Owner = NULL;
- Length = 0;
- LongData = NULL;
- }
- protected:
- BOOL SetIf (VR *);
- friend class DICOMVRSet;
- friend class VRGroup;
- friend class ImageProcess;
- friend class DICOMVRSet;
- friend class DICOMFile;
- friend class DICOMImage;
- friend class Decoder;
- friend class Encoder;
- friend class FixDecoder;
- friend class FixEncoder;
- friend class BigEndianDecoder;
- friend class BigEndianEncoder;
- friend class VRSeqFixDecoder;
- friend class VRSeqFixEncoder;
- friend class TableSet;
- friend DICOM_API BOOL operator == (const VR & vr, UINT32 Tag) ;
- friend DICOM_API BOOL operator == (const VR & vrA, const VR & vrB);
- friend void operator >> (class InBuffer & ib, VR * vr);
- friend void operator << (class OutBuffer & ob, const VR * vr);
- };
- // --------------- Comparision overload -----------
- inline BOOL operator == (const VR & vr, UINT32 Tag)
- {
- return (vr.GetTag () == Tag);
- }
- inline BOOL operator != (const VR & vr, UINT32 Tag)
- {
- return ! (vr == Tag);
- };
- inline BOOL operator > (const VR & vr, UINT32 Tag)
- {
- return (vr.GetTag () > Tag);
- }
- inline BOOL operator < (const VR & vr, UINT32 Tag)
- {
- return (vr.GetTag () < Tag);
- }
- DICOM_API BOOL operator == (const VR & vrA, const VR & vrB);
- DICOM_API inline BOOL operator != (const VR & vrA, const VR & vrB)
- {
- return ! (vrA == vrB);
- };
- #endif
|