DicomVR.hpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. /***************************************************************************
  2. * E-Com Technology Ltd.
  3. *
  4. * ECOMPACS DICOM Network Transport Libraries * Version 0.1 Beta
  5. ***************************************************************************/
  6. #ifndef _DICOM_VR
  7. #define _DICOM_VR
  8. class DString;
  9. class DICOMVRSet;
  10. class UID;
  11. #define VR_SHORT_DATA_LENGTH 64
  12. //////////////////////////////////////////////////////////////////////
  13. // class VR
  14. class DICOM_API VR
  15. {
  16. //public:
  17. protected:
  18. UINT16 Group;
  19. UINT16 Element;
  20. UINT32 Length;
  21. BYTE ShortData[VR_SHORT_DATA_LENGTH];
  22. void * LongData;
  23. UINT16 TypeCode;
  24. ArrayOfPtr <DICOMVRSet *> * SQVRSetArray;
  25. DICOMVRSet * Owner;
  26. protected:
  27. #ifdef _DEBUG
  28. char Description [255];
  29. #endif
  30. public:
  31. UINT16 GetGroup (void) const { return Group; }
  32. UINT16 GetElement (void) const { return Element; }
  33. UINT32 GetLength (void) const { return Length; }
  34. void * GetData (void) const { if (LongData) return LongData; else return (void *) ShortData; }
  35. UINT32 GetTag (void) const { return MakeTagFrom (Group, Element) ; }
  36. #ifdef _DEBUG
  37. void SetTag (UINT16 g, UINT16 e);
  38. #else
  39. void SetTag (UINT16 g, UINT16 e) { Group = g; Element = e; }
  40. #endif
  41. UINT16 GetTypeCode (void) const { return TypeCode; }
  42. void SetTypeCode (UINT32 theTypeCode) { TypeCode = theTypeCode; }
  43. void Attach (void * data, UINT32 length)
  44. {
  45. if (LongData) delete LongData;
  46. LongData = data;
  47. Length = length;
  48. }
  49. void * Detach (void)
  50. {
  51. if (LongData)
  52. {
  53. void * p = LongData;
  54. LongData = NULL;
  55. Length = 0;
  56. return p;
  57. }
  58. else
  59. {
  60. void * p = new BYTE[Length];
  61. memcpy (p, ShortData, Length);
  62. Length = 0;
  63. return p;
  64. }
  65. }
  66. void * GetDataSetLength (UINT32 length);
  67. ArrayOfPtr <DICOMVRSet *> * GetSQArray (void) const { return SQVRSetArray; }
  68. ArrayOfPtr <DICOMVRSet *> * DetachSQArray (void)
  69. {
  70. ArrayOfPtr <DICOMVRSet *> * pSQArray = SQVRSetArray;
  71. SQVRSetArray = NULL;
  72. return pSQArray;
  73. }
  74. void DeleteSQArray (void) { if (SQVRSetArray) delete SQVRSetArray; SQVRSetArray = NULL; }
  75. ArrayOfPtr <DICOMVRSet *> * AddSQArray (void)
  76. {
  77. if (! SQVRSetArray)
  78. SQVRSetArray = new ArrayOfPtr <DICOMVRSet *>;
  79. return SQVRSetArray;
  80. }
  81. DICOMVRSet * GetOwner (void) const { return Owner; }
  82. public:
  83. VR ()
  84. {
  85. Group = 0;
  86. Element = 0;
  87. LongData = NULL;
  88. Length = 0;
  89. TypeCode = 0;
  90. SQVRSetArray= NULL;
  91. Owner = NULL;
  92. #ifdef _DEBUG
  93. Description[0] = 0;
  94. #endif
  95. }
  96. VR (UINT16 g, UINT16 e, const UID & Uid);
  97. VR (UINT16 g, UINT16 e, const char * Str);
  98. VR (UINT16 g, UINT16 e, const DString & string);
  99. VR (UINT16 g, UINT16 e, UINT16 us)
  100. {
  101. Group = g;
  102. Element = e;
  103. Length = sizeof(UINT16);
  104. LongData = NULL;
  105. UINT16 *pus = (UINT16*)ShortData;
  106. *pus = us;
  107. TypeCode = 'US';
  108. SQVRSetArray= NULL;
  109. Owner = NULL;
  110. #ifdef _DEBUG
  111. DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
  112. #endif
  113. }
  114. VR (UINT16 g, UINT16 e, UINT32 ul)
  115. {
  116. Group = g;
  117. Element = e;
  118. Length = sizeof(UINT32);
  119. LongData = NULL;
  120. UINT32 *pul = (UINT32*)ShortData;
  121. *pul = ul;
  122. TypeCode = 'UL';
  123. SQVRSetArray= NULL;
  124. Owner = NULL;
  125. #ifdef _DEBUG
  126. DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
  127. #endif
  128. }
  129. VR (UINT16 g, UINT16 e, INT16 ss)
  130. {
  131. Group = g;
  132. Element = e;
  133. Length = sizeof(INT16);
  134. LongData = NULL;
  135. INT16 *pss = (INT16*)ShortData;
  136. *pss = ss;
  137. TypeCode = 'SS';
  138. SQVRSetArray= NULL;
  139. Owner = NULL;
  140. #ifdef _DEBUG
  141. DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
  142. #endif
  143. }
  144. VR (UINT16 g, UINT16 e, INT32 sl)
  145. {
  146. Group = g;
  147. Element = e;
  148. Length = sizeof(INT32);
  149. LongData = NULL;
  150. INT32 *psl = (INT32*)ShortData;
  151. *psl = sl;
  152. TypeCode = 'SL';
  153. SQVRSetArray= NULL;
  154. Owner = NULL;
  155. #ifdef _DEBUG
  156. DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
  157. #endif
  158. }
  159. VR (UINT16 g, UINT16 e, float fl)
  160. {
  161. Group = g;
  162. Element = e;
  163. Length = sizeof(float);
  164. LongData = NULL;
  165. float * pfl = (float*) ShortData;
  166. *pfl = fl;
  167. TypeCode = 'FL';
  168. SQVRSetArray= NULL;
  169. Owner = NULL;
  170. #ifdef _DEBUG
  171. DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
  172. #endif
  173. }
  174. VR (UINT16 g, UINT16 e, double dl)
  175. {
  176. Group = g;
  177. Element = e;
  178. Length = sizeof(double);
  179. LongData = NULL;
  180. double * pdl = (double*) ShortData;
  181. *pdl = dl;
  182. TypeCode = 'FD';
  183. SQVRSetArray= NULL;
  184. Owner = NULL;
  185. #ifdef _DEBUG
  186. DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
  187. #endif
  188. }
  189. VR (UINT16 g, UINT16 e, UINT16 * pus, int Count);
  190. VR (UINT16 g, UINT16 e, UINT32 * pul, int Count);
  191. VR (UINT16 g, UINT16 e, INT16 * pss, int Count);
  192. VR (UINT16 g, UINT16 e, INT32 * psl, int Count);
  193. VR (UINT16 g, UINT16 e)
  194. {
  195. Group = g;
  196. Element = e;
  197. Length = 0;
  198. LongData = NULL;
  199. TypeCode = 0;
  200. SQVRSetArray= NULL;
  201. Owner = NULL;
  202. #ifdef _DEBUG
  203. DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
  204. #endif
  205. }
  206. VR (UINT32 Tag)
  207. {
  208. Group = GroupOfTag32 (Tag);
  209. Element = ElementOfTag32 (Tag);
  210. Length = 0;
  211. LongData = NULL;
  212. TypeCode = 0;
  213. SQVRSetArray= NULL;
  214. Owner = NULL;
  215. #ifdef _DEBUG
  216. DicomDictionary::Lookup (Group, Element, Description, sizeof(Description));
  217. #endif
  218. }
  219. VR (const VR &);
  220. virtual ~VR () { Reset (); };
  221. // --------------- operator overload -----------
  222. operator UINT16 (void) const
  223. {
  224. if (Length < sizeof(UINT16)) return 0;
  225. UINT16 * pus = (UINT16 *) ShortData;
  226. return (* pus);
  227. }
  228. operator UINT32 (void) const
  229. {
  230. if (Length <= sizeof(UINT16)) return (this->operator UINT16 ());
  231. UINT32 * pul = (UINT32 *) ShortData;
  232. return (* pul);
  233. }
  234. operator INT16 (void) const
  235. {
  236. if (Length < sizeof(INT16)) return 0;
  237. INT16 * pss = (INT16 *) ShortData;
  238. return (* pss);
  239. }
  240. operator INT32 (void) const
  241. {
  242. if (Length <= sizeof(INT16)) return (this->operator INT16 ());
  243. INT32 * psl = (INT32 *) ShortData;
  244. return (*psl);
  245. }
  246. operator float (void) const
  247. {
  248. if (Length < sizeof(float)) return 0;
  249. float * pfl = (float*) ShortData;
  250. return (*pfl);
  251. }
  252. operator double (void) const
  253. {
  254. if (Length < sizeof(double)) return 0;
  255. double * pdl = (double*) ShortData;
  256. return (*pdl);
  257. }
  258. operator DString (void) const
  259. {
  260. DString str;
  261. Extract (str);
  262. return str;
  263. }
  264. // --------------- Assignment overload -----------
  265. VR & operator = (UINT16 us)
  266. {
  267. if (LongData)
  268. {
  269. delete LongData;
  270. LongData = NULL;
  271. }
  272. UINT16 * pus = (UINT16 *) ShortData;
  273. * pus = us;
  274. Length = sizeof(UINT16);
  275. return (*this);
  276. }
  277. VR & operator = (UINT32 ul)
  278. {
  279. if (LongData)
  280. {
  281. delete LongData;
  282. LongData = NULL;
  283. }
  284. UINT32 * pul = (UINT32 *) ShortData;
  285. * pul = ul;
  286. Length = sizeof(UINT32);
  287. return (*this);
  288. }
  289. VR & operator = (INT16 ss)
  290. {
  291. if (LongData)
  292. {
  293. delete LongData;
  294. LongData = NULL;
  295. }
  296. INT16 * pss = (INT16 *) ShortData;
  297. * pss = ss;
  298. Length = sizeof(INT16);
  299. return (*this);
  300. }
  301. VR & operator = (INT32 sl)
  302. {
  303. if (LongData)
  304. {
  305. delete LongData;
  306. LongData = NULL;
  307. }
  308. INT32 * psl = (INT32 *) ShortData;
  309. * psl = sl;
  310. Length = sizeof(INT32);
  311. return (*this);
  312. }
  313. VR & operator = (float f)
  314. {
  315. if (LongData)
  316. {
  317. delete LongData;
  318. LongData = NULL;
  319. }
  320. float * pf = (float *) ShortData;
  321. * pf = f;
  322. Length = sizeof (float);
  323. return (*this);
  324. }
  325. VR & operator = (double d)
  326. {
  327. if (LongData)
  328. {
  329. delete LongData;
  330. LongData = NULL;
  331. }
  332. double * pd = (double *) ShortData;
  333. * pd = d;
  334. Length = sizeof (double);
  335. return (*this);
  336. }
  337. VR & operator = (const char * str)
  338. {
  339. if (LongData)
  340. {
  341. delete LongData;
  342. LongData = NULL;
  343. }
  344. Length = strlen (str);
  345. if (! Length)
  346. {
  347. LongData = NULL;
  348. return (*this);
  349. }
  350. BYTE * Data;
  351. if (Length > sizeof (ShortData))
  352. {
  353. LongData = Data = new BYTE [Length+1];
  354. }
  355. else
  356. {
  357. Data = ShortData;
  358. LongData = NULL;
  359. }
  360. memcpy (Data, str, Length);
  361. if (Length & 0x01)
  362. {
  363. ((char *)Data)[Length] = ' ';
  364. Length ++;
  365. }
  366. return (*this);
  367. }
  368. VR & operator = (const DString & str)
  369. {
  370. if (LongData)
  371. {
  372. delete LongData;
  373. LongData = NULL;
  374. }
  375. Length = str.GetLength ();
  376. if (! Length)
  377. {
  378. LongData = NULL;
  379. return (*this);
  380. }
  381. BYTE * Data;
  382. if (Length > sizeof (ShortData))
  383. {
  384. LongData = Data = new BYTE [Length+1];
  385. }
  386. else
  387. {
  388. Data = ShortData;
  389. LongData = NULL;
  390. }
  391. memcpy (Data, str.constBuffer (), Length);
  392. if (Length & 0x01)
  393. {
  394. ((char *)Data)[Length] = ' ';
  395. Length ++;
  396. }
  397. return (*this);
  398. }
  399. VR & operator = (DICOMVRSet & fromVRS);
  400. // ------------------ Misc function --------------
  401. UINT32 Extract (char * Str, UINT32 size) const ;
  402. BOOL Extract (DString & s) const;
  403. DString ToStringOfData (void) const;
  404. virtual DString ToString (void) const;
  405. void Reset (void)
  406. {
  407. if (LongData) delete LongData;
  408. if (SQVRSetArray)
  409. {
  410. delete SQVRSetArray;
  411. SQVRSetArray = NULL;
  412. }
  413. Owner = NULL;
  414. Length = 0;
  415. LongData = NULL;
  416. }
  417. protected:
  418. BOOL SetIf (VR *);
  419. friend class DICOMVRSet;
  420. friend class VRGroup;
  421. friend class ImageProcess;
  422. friend class DICOMVRSet;
  423. friend class DICOMFile;
  424. friend class DICOMImage;
  425. friend class Decoder;
  426. friend class Encoder;
  427. friend class FixDecoder;
  428. friend class FixEncoder;
  429. friend class BigEndianDecoder;
  430. friend class BigEndianEncoder;
  431. friend class VRSeqFixDecoder;
  432. friend class VRSeqFixEncoder;
  433. friend class TableSet;
  434. friend DICOM_API BOOL operator == (const VR & vr, UINT32 Tag) ;
  435. friend DICOM_API BOOL operator == (const VR & vrA, const VR & vrB);
  436. friend void operator >> (class InBuffer & ib, VR * vr);
  437. friend void operator << (class OutBuffer & ob, const VR * vr);
  438. };
  439. // --------------- Comparision overload -----------
  440. inline BOOL operator == (const VR & vr, UINT32 Tag)
  441. {
  442. return (vr.GetTag () == Tag);
  443. }
  444. inline BOOL operator != (const VR & vr, UINT32 Tag)
  445. {
  446. return ! (vr == Tag);
  447. };
  448. inline BOOL operator > (const VR & vr, UINT32 Tag)
  449. {
  450. return (vr.GetTag () > Tag);
  451. }
  452. inline BOOL operator < (const VR & vr, UINT32 Tag)
  453. {
  454. return (vr.GetTag () < Tag);
  455. }
  456. DICOM_API BOOL operator == (const VR & vrA, const VR & vrB);
  457. DICOM_API inline BOOL operator != (const VR & vrA, const VR & vrB)
  458. {
  459. return ! (vrA == vrB);
  460. };
  461. #endif