1 /*
2  *
3  *  Copyright (C) 1998-2018, OFFIS e.V.
4  *  All rights reserved.  See COPYRIGHT file for details.
5  *
6  *  This software and supporting documentation were developed by
7  *
8  *    OFFIS e.V.
9  *    R&D Division Health
10  *    Escherweg 2
11  *    D-26121 Oldenburg, Germany
12  *
13  *
14  *  Module: dcmpstat
15  *
16  *  Author: Marco Eichelberg
17  *
18  *  Purpose:
19  *    classes: DVPSAnnotationContent
20  *
21  */
22 
23 #include "dcmtk/config/osconfig.h"    /* make sure OS specific configuration is included first */
24 #include "dcmtk/dcmdata/dcdeftag.h"
25 #include "dcmtk/dcmdata/dcitem.h"
26 #include "dcmtk/dcmpstat/dvpsab.h"
27 #include "dcmtk/dcmpstat/dvpsdef.h"     /* for constants and macros */
28 
29 
30 /* --------------- class DVPSAnnotationContent --------------- */
31 
DVPSAnnotationContent()32 DVPSAnnotationContent::DVPSAnnotationContent()
33 : sOPInstanceUID(DCM_SOPInstanceUID)
34 , annotationPosition(DCM_AnnotationPosition)
35 , textString(DCM_TextString)
36 {
37 }
38 
DVPSAnnotationContent(const DVPSAnnotationContent & copy)39 DVPSAnnotationContent::DVPSAnnotationContent(const DVPSAnnotationContent& copy)
40 : sOPInstanceUID(copy.sOPInstanceUID)
41 , annotationPosition(copy.annotationPosition)
42 , textString(copy.textString)
43 {
44 }
45 
~DVPSAnnotationContent()46 DVPSAnnotationContent::~DVPSAnnotationContent()
47 {
48 }
49 
clear()50 void DVPSAnnotationContent::clear()
51 {
52   sOPInstanceUID.clear();
53   annotationPosition.clear();
54   textString.clear();
55   return;
56 }
57 
setContent(const char * instanceuid,const char * text,Uint16 position)58 OFCondition DVPSAnnotationContent::setContent(
59     const char *instanceuid,
60     const char *text,
61     Uint16 position)
62 {
63   OFCondition result = EC_Normal;
64   if (instanceuid && text)
65   {
66     clear();
67     result = sOPInstanceUID.putString(instanceuid);
68     if (EC_Normal == result) result = textString.putString(text);
69     if (EC_Normal == result) result = annotationPosition.putUint16(position,0);
70   } else result = EC_IllegalCall;
71   return result;
72 }
73 
read(DcmItem & dset)74 OFCondition DVPSAnnotationContent::read(DcmItem &dset)
75 {
76   OFCondition result = EC_Normal;
77   DcmStack stack;
78 
79   READ_FROM_DATASET(DcmUniqueIdentifier, EVR_UI, sOPInstanceUID)
80   READ_FROM_DATASET(DcmUnsignedShort, EVR_US, annotationPosition)
81   READ_FROM_DATASET(DcmLongString, EVR_LO, textString)
82 
83   /* Now perform basic sanity checks */
84 
85   if (result==EC_Normal)
86   {
87     if ((sOPInstanceUID.getLength() == 0)||(sOPInstanceUID.getVM() != 1))
88     {
89         result=EC_TagNotFound;
90         DCMPSTAT_WARN("SOPInstanceUID missing or incorrect in Stored Print Annotation");
91     }
92     if ((annotationPosition.getLength() == 0)||(annotationPosition.getVM() != 1))
93     {
94         result=EC_TagNotFound;
95         DCMPSTAT_WARN("AnnotationPosition missing or incorrect in Stored Print Annotation");
96     }
97     if ((textString.getLength() == 0)||(textString.getVM() != 1))
98     {
99         result=EC_TagNotFound;
100         DCMPSTAT_WARN("TextString missing or incorrect in Stored Print Annotation");
101     }
102   }
103 
104   return result;
105 }
106 
write(DcmItem & dset)107 OFCondition DVPSAnnotationContent::write(DcmItem &dset)
108 {
109   OFCondition result = EC_Normal;
110   DcmElement *delem=NULL;
111 
112   /* before writing anything, check that we are able to write a correct item */
113   if (sOPInstanceUID.getLength() == 0)
114   {
115     result=EC_TagNotFound;
116     DCMPSTAT_WARN("cannot write Stored Print Annotation: SOPInstanceUID empty");
117   }
118   if (annotationPosition.getLength() == 0)
119   {
120     result=EC_TagNotFound;
121     DCMPSTAT_WARN("cannot write Stored Print Annotation: AnnotationPosition empty");
122   }
123   if (textString.getLength() == 0)
124   {
125     result=EC_TagNotFound;
126     DCMPSTAT_WARN("cannot write Stored Print Annotation: TextString empty");
127   }
128 
129   ADD_TO_DATASET(DcmUniqueIdentifier, sOPInstanceUID)
130   ADD_TO_DATASET(DcmUnsignedShort, annotationPosition)
131   ADD_TO_DATASET(DcmLongString, textString)
132 
133   return result;
134 }
135 
prepareBasicAnnotationBox(DcmItem & dset)136 OFCondition DVPSAnnotationContent::prepareBasicAnnotationBox(DcmItem &dset)
137 {
138   OFCondition result = EC_Normal;
139   DcmElement *delem=NULL;
140 
141   ADD_TO_DATASET(DcmUnsignedShort, annotationPosition)
142   ADD_TO_DATASET(DcmLongString, textString)
143   return result;
144 }
145 
setSOPInstanceUID(const char * value)146 OFCondition DVPSAnnotationContent::setSOPInstanceUID(const char *value)
147 {
148   if ((value==NULL)||(strlen(value)==0))
149   {
150   	sOPInstanceUID.clear();
151   	return EC_Normal;
152   }
153   return sOPInstanceUID.putString(value);
154 }
155 
getSOPInstanceUID()156 const char *DVPSAnnotationContent::getSOPInstanceUID()
157 {
158   char *c = NULL;
159   if (EC_Normal == sOPInstanceUID.getString(c)) return c; else return NULL;
160 }
161