1 /*
2  *
3  *  Copyright (C) 2008-2012, OFFIS e.V. and ICSMED AG, Oldenburg, Germany
4  *  Copyright (C) 2013-2017, J. Riesmeier, Oldenburg, Germany
5  *  All rights reserved.  See COPYRIGHT file for details.
6  *
7  *  Source file for class DRTMeasuredDoseReferenceSequence
8  *
9  *  Generated automatically from DICOM PS 3.3-2017e
10  *  File created on 2017-12-05 09:30:54
11  *
12  */
13 
14 
15 #include "dcmtk/config/osconfig.h"     // make sure OS specific configuration is included first
16 
17 #include "dcmtk/dcmrt/seq/drtmdrs.h"
18 
19 
20 // --- item class ---
21 
Item(const OFBool emptyDefaultItem)22 DRTMeasuredDoseReferenceSequence::Item::Item(const OFBool emptyDefaultItem)
23   : EmptyDefaultItem(emptyDefaultItem),
24     DoseUnits(DCM_DoseUnits),
25     MeasuredDoseDescription(DCM_MeasuredDoseDescription),
26     MeasuredDoseReferenceNumber(DCM_MeasuredDoseReferenceNumber),
27     MeasuredDoseType(DCM_MeasuredDoseType),
28     MeasuredDoseValue(DCM_MeasuredDoseValue),
29     ReferencedDoseReferenceNumber(DCM_ReferencedDoseReferenceNumber)
30 {
31 }
32 
33 
Item(const Item & copy)34 DRTMeasuredDoseReferenceSequence::Item::Item(const Item &copy)
35   : EmptyDefaultItem(copy.EmptyDefaultItem),
36     DoseUnits(copy.DoseUnits),
37     MeasuredDoseDescription(copy.MeasuredDoseDescription),
38     MeasuredDoseReferenceNumber(copy.MeasuredDoseReferenceNumber),
39     MeasuredDoseType(copy.MeasuredDoseType),
40     MeasuredDoseValue(copy.MeasuredDoseValue),
41     ReferencedDoseReferenceNumber(copy.ReferencedDoseReferenceNumber)
42 {
43 }
44 
45 
~Item()46 DRTMeasuredDoseReferenceSequence::Item::~Item()
47 {
48 }
49 
50 
operator =(const Item & copy)51 DRTMeasuredDoseReferenceSequence::Item &DRTMeasuredDoseReferenceSequence::Item::operator=(const Item &copy)
52 {
53     if (this != &copy)
54     {
55         EmptyDefaultItem = copy.EmptyDefaultItem;
56         DoseUnits = copy.DoseUnits;
57         MeasuredDoseDescription = copy.MeasuredDoseDescription;
58         MeasuredDoseReferenceNumber = copy.MeasuredDoseReferenceNumber;
59         MeasuredDoseType = copy.MeasuredDoseType;
60         MeasuredDoseValue = copy.MeasuredDoseValue;
61         ReferencedDoseReferenceNumber = copy.ReferencedDoseReferenceNumber;
62     }
63     return *this;
64 }
65 
66 
clear()67 void DRTMeasuredDoseReferenceSequence::Item::clear()
68 {
69     if (!EmptyDefaultItem)
70     {
71         /* clear all DICOM attributes */
72         ReferencedDoseReferenceNumber.clear();
73         MeasuredDoseReferenceNumber.clear();
74         DoseUnits.clear();
75         MeasuredDoseValue.clear();
76         MeasuredDoseType.clear();
77         MeasuredDoseDescription.clear();
78     }
79 }
80 
81 
isEmpty()82 OFBool DRTMeasuredDoseReferenceSequence::Item::isEmpty()
83 {
84     return ReferencedDoseReferenceNumber.isEmpty() &&
85            MeasuredDoseReferenceNumber.isEmpty() &&
86            DoseUnits.isEmpty() &&
87            MeasuredDoseValue.isEmpty() &&
88            MeasuredDoseType.isEmpty() &&
89            MeasuredDoseDescription.isEmpty();
90 }
91 
92 
isValid() const93 OFBool DRTMeasuredDoseReferenceSequence::Item::isValid() const
94 {
95     return !EmptyDefaultItem;
96 }
97 
98 
read(DcmItem & item)99 OFCondition DRTMeasuredDoseReferenceSequence::Item::read(DcmItem &item)
100 {
101     OFCondition result = EC_IllegalCall;
102     if (!EmptyDefaultItem)
103     {
104         /* re-initialize object */
105         clear();
106         getAndCheckElementFromDataset(item, ReferencedDoseReferenceNumber, "1", "1C", "MeasuredDoseReferenceSequence");
107         getAndCheckElementFromDataset(item, MeasuredDoseReferenceNumber, "1", "1C", "MeasuredDoseReferenceSequence");
108         getAndCheckElementFromDataset(item, DoseUnits, "1", "1", "MeasuredDoseReferenceSequence");
109         getAndCheckElementFromDataset(item, MeasuredDoseValue, "1", "2", "MeasuredDoseReferenceSequence");
110         getAndCheckElementFromDataset(item, MeasuredDoseType, "1", "2", "MeasuredDoseReferenceSequence");
111         getAndCheckElementFromDataset(item, MeasuredDoseDescription, "1", "3", "MeasuredDoseReferenceSequence");
112         result = EC_Normal;
113     }
114     return result;
115 }
116 
117 
write(DcmItem & item)118 OFCondition DRTMeasuredDoseReferenceSequence::Item::write(DcmItem &item)
119 {
120     OFCondition result = EC_IllegalCall;
121     if (!EmptyDefaultItem)
122     {
123         result = EC_Normal;
124         addElementToDataset(result, item, new DcmIntegerString(ReferencedDoseReferenceNumber), "1", "1C", "MeasuredDoseReferenceSequence");
125         addElementToDataset(result, item, new DcmIntegerString(MeasuredDoseReferenceNumber), "1", "1C", "MeasuredDoseReferenceSequence");
126         addElementToDataset(result, item, new DcmCodeString(DoseUnits), "1", "1", "MeasuredDoseReferenceSequence");
127         addElementToDataset(result, item, new DcmDecimalString(MeasuredDoseValue), "1", "2", "MeasuredDoseReferenceSequence");
128         addElementToDataset(result, item, new DcmCodeString(MeasuredDoseType), "1", "2", "MeasuredDoseReferenceSequence");
129         addElementToDataset(result, item, new DcmShortText(MeasuredDoseDescription), "1", "3", "MeasuredDoseReferenceSequence");
130     }
131     return result;
132 }
133 
134 
getDoseUnits(OFString & value,const signed long pos) const135 OFCondition DRTMeasuredDoseReferenceSequence::Item::getDoseUnits(OFString &value, const signed long pos) const
136 {
137     if (EmptyDefaultItem)
138         return EC_IllegalCall;
139     else
140         return getStringValueFromElement(DoseUnits, value, pos);
141 }
142 
143 
getMeasuredDoseDescription(OFString & value,const signed long pos) const144 OFCondition DRTMeasuredDoseReferenceSequence::Item::getMeasuredDoseDescription(OFString &value, const signed long pos) const
145 {
146     if (EmptyDefaultItem)
147         return EC_IllegalCall;
148     else
149         return getStringValueFromElement(MeasuredDoseDescription, value, pos);
150 }
151 
152 
getMeasuredDoseReferenceNumber(OFString & value,const signed long pos) const153 OFCondition DRTMeasuredDoseReferenceSequence::Item::getMeasuredDoseReferenceNumber(OFString &value, const signed long pos) const
154 {
155     if (EmptyDefaultItem)
156         return EC_IllegalCall;
157     else
158         return getStringValueFromElement(MeasuredDoseReferenceNumber, value, pos);
159 }
160 
161 
getMeasuredDoseReferenceNumber(Sint32 & value,const unsigned long pos) const162 OFCondition DRTMeasuredDoseReferenceSequence::Item::getMeasuredDoseReferenceNumber(Sint32 &value, const unsigned long pos) const
163 {
164     if (EmptyDefaultItem)
165         return EC_IllegalCall;
166     else
167         return OFconst_cast(DcmIntegerString &, MeasuredDoseReferenceNumber).getSint32(value, pos);
168 }
169 
170 
getMeasuredDoseType(OFString & value,const signed long pos) const171 OFCondition DRTMeasuredDoseReferenceSequence::Item::getMeasuredDoseType(OFString &value, const signed long pos) const
172 {
173     if (EmptyDefaultItem)
174         return EC_IllegalCall;
175     else
176         return getStringValueFromElement(MeasuredDoseType, value, pos);
177 }
178 
179 
getMeasuredDoseValue(OFString & value,const signed long pos) const180 OFCondition DRTMeasuredDoseReferenceSequence::Item::getMeasuredDoseValue(OFString &value, const signed long pos) const
181 {
182     if (EmptyDefaultItem)
183         return EC_IllegalCall;
184     else
185         return getStringValueFromElement(MeasuredDoseValue, value, pos);
186 }
187 
188 
getMeasuredDoseValue(Float64 & value,const unsigned long pos) const189 OFCondition DRTMeasuredDoseReferenceSequence::Item::getMeasuredDoseValue(Float64 &value, const unsigned long pos) const
190 {
191     if (EmptyDefaultItem)
192         return EC_IllegalCall;
193     else
194         return OFconst_cast(DcmDecimalString &, MeasuredDoseValue).getFloat64(value, pos);
195 }
196 
197 
getReferencedDoseReferenceNumber(OFString & value,const signed long pos) const198 OFCondition DRTMeasuredDoseReferenceSequence::Item::getReferencedDoseReferenceNumber(OFString &value, const signed long pos) const
199 {
200     if (EmptyDefaultItem)
201         return EC_IllegalCall;
202     else
203         return getStringValueFromElement(ReferencedDoseReferenceNumber, value, pos);
204 }
205 
206 
getReferencedDoseReferenceNumber(Sint32 & value,const unsigned long pos) const207 OFCondition DRTMeasuredDoseReferenceSequence::Item::getReferencedDoseReferenceNumber(Sint32 &value, const unsigned long pos) const
208 {
209     if (EmptyDefaultItem)
210         return EC_IllegalCall;
211     else
212         return OFconst_cast(DcmIntegerString &, ReferencedDoseReferenceNumber).getSint32(value, pos);
213 }
214 
215 
setDoseUnits(const OFString & value,const OFBool check)216 OFCondition DRTMeasuredDoseReferenceSequence::Item::setDoseUnits(const OFString &value, const OFBool check)
217 {
218     OFCondition result = EC_IllegalCall;
219     if (!EmptyDefaultItem)
220     {
221         result = (check) ? DcmCodeString::checkStringValue(value, "1") : EC_Normal;
222         if (result.good())
223             result = DoseUnits.putOFStringArray(value);
224     }
225     return result;
226 }
227 
228 
setMeasuredDoseDescription(const OFString & value,const OFBool check)229 OFCondition DRTMeasuredDoseReferenceSequence::Item::setMeasuredDoseDescription(const OFString &value, const OFBool check)
230 {
231     OFCondition result = EC_IllegalCall;
232     if (!EmptyDefaultItem)
233     {
234         result = (check) ? DcmShortText::checkStringValue(value) : EC_Normal;
235         if (result.good())
236             result = MeasuredDoseDescription.putOFStringArray(value);
237     }
238     return result;
239 }
240 
241 
setMeasuredDoseReferenceNumber(const OFString & value,const OFBool check)242 OFCondition DRTMeasuredDoseReferenceSequence::Item::setMeasuredDoseReferenceNumber(const OFString &value, const OFBool check)
243 {
244     OFCondition result = EC_IllegalCall;
245     if (!EmptyDefaultItem)
246     {
247         result = (check) ? DcmIntegerString::checkStringValue(value, "1") : EC_Normal;
248         if (result.good())
249             result = MeasuredDoseReferenceNumber.putOFStringArray(value);
250     }
251     return result;
252 }
253 
254 
setMeasuredDoseType(const OFString & value,const OFBool check)255 OFCondition DRTMeasuredDoseReferenceSequence::Item::setMeasuredDoseType(const OFString &value, const OFBool check)
256 {
257     OFCondition result = EC_IllegalCall;
258     if (!EmptyDefaultItem)
259     {
260         result = (check) ? DcmCodeString::checkStringValue(value, "1") : EC_Normal;
261         if (result.good())
262             result = MeasuredDoseType.putOFStringArray(value);
263     }
264     return result;
265 }
266 
267 
setMeasuredDoseValue(const OFString & value,const OFBool check)268 OFCondition DRTMeasuredDoseReferenceSequence::Item::setMeasuredDoseValue(const OFString &value, const OFBool check)
269 {
270     OFCondition result = EC_IllegalCall;
271     if (!EmptyDefaultItem)
272     {
273         result = (check) ? DcmDecimalString::checkStringValue(value, "1") : EC_Normal;
274         if (result.good())
275             result = MeasuredDoseValue.putOFStringArray(value);
276     }
277     return result;
278 }
279 
280 
setReferencedDoseReferenceNumber(const OFString & value,const OFBool check)281 OFCondition DRTMeasuredDoseReferenceSequence::Item::setReferencedDoseReferenceNumber(const OFString &value, const OFBool check)
282 {
283     OFCondition result = EC_IllegalCall;
284     if (!EmptyDefaultItem)
285     {
286         result = (check) ? DcmIntegerString::checkStringValue(value, "1") : EC_Normal;
287         if (result.good())
288             result = ReferencedDoseReferenceNumber.putOFStringArray(value);
289     }
290     return result;
291 }
292 
293 
294 // --- sequence class ---
295 
DRTMeasuredDoseReferenceSequence(const OFBool emptyDefaultSequence)296 DRTMeasuredDoseReferenceSequence::DRTMeasuredDoseReferenceSequence(const OFBool emptyDefaultSequence)
297   : EmptyDefaultSequence(emptyDefaultSequence),
298     SequenceOfItems(),
299     CurrentItem(),
300     EmptyItem(OFTrue /*emptyDefaultItem*/)
301 {
302     CurrentItem = SequenceOfItems.end();
303 }
304 
305 
DRTMeasuredDoseReferenceSequence(const DRTMeasuredDoseReferenceSequence & copy)306 DRTMeasuredDoseReferenceSequence::DRTMeasuredDoseReferenceSequence(const DRTMeasuredDoseReferenceSequence &copy)
307   : EmptyDefaultSequence(copy.EmptyDefaultSequence),
308     SequenceOfItems(),
309     CurrentItem(),
310     EmptyItem(OFTrue /*emptyDefaultItem*/)
311 {
312     /* create a copy of the internal sequence of items */
313     Item *item = NULL;
314     OFListConstIterator(Item *) current = copy.SequenceOfItems.begin();
315     const OFListConstIterator(Item *) last = copy.SequenceOfItems.end();
316     while (current != last)
317     {
318         item = new Item(**current);
319         if (item != NULL)
320         {
321             SequenceOfItems.push_back(item);
322         } else {
323             /* memory exhausted, there is nothing we can do about it */
324             break;
325         }
326         ++current;
327     }
328     CurrentItem = SequenceOfItems.begin();
329 }
330 
331 
operator =(const DRTMeasuredDoseReferenceSequence & copy)332 DRTMeasuredDoseReferenceSequence &DRTMeasuredDoseReferenceSequence::operator=(const DRTMeasuredDoseReferenceSequence &copy)
333 {
334     if (this != &copy)
335     {
336         clear();
337         EmptyDefaultSequence = copy.EmptyDefaultSequence;
338         /* create a copy of the internal sequence of items */
339         Item *item = NULL;
340         OFListConstIterator(Item *) current = copy.SequenceOfItems.begin();
341         const OFListConstIterator(Item *) last = copy.SequenceOfItems.end();
342         while (current != last)
343         {
344             item = new Item(**current);
345             if (item != NULL)
346             {
347                 SequenceOfItems.push_back(item);
348             } else {
349                 /* memory exhausted, there is nothing we can do about it */
350                 break;
351             }
352             ++current;
353         }
354         CurrentItem = SequenceOfItems.begin();
355     }
356     return *this;
357 }
358 
359 
~DRTMeasuredDoseReferenceSequence()360 DRTMeasuredDoseReferenceSequence::~DRTMeasuredDoseReferenceSequence()
361 {
362     clear();
363 }
364 
365 
clear()366 void DRTMeasuredDoseReferenceSequence::clear()
367 {
368     if (!EmptyDefaultSequence)
369     {
370         CurrentItem = SequenceOfItems.begin();
371         const OFListConstIterator(Item *) last = SequenceOfItems.end();
372         /* delete all items and free memory */
373         while (CurrentItem != last)
374         {
375             delete (*CurrentItem);
376             CurrentItem = SequenceOfItems.erase(CurrentItem);
377         }
378         /* make sure that the list is empty */
379         SequenceOfItems.clear();
380         CurrentItem = SequenceOfItems.end();
381     }
382 }
383 
384 
isEmpty()385 OFBool DRTMeasuredDoseReferenceSequence::isEmpty()
386 {
387     return SequenceOfItems.empty();
388 }
389 
390 
isValid() const391 OFBool DRTMeasuredDoseReferenceSequence::isValid() const
392 {
393     return !EmptyDefaultSequence;
394 }
395 
396 
getNumberOfItems() const397 size_t DRTMeasuredDoseReferenceSequence::getNumberOfItems() const
398 {
399     return SequenceOfItems.size();
400 }
401 
402 
gotoFirstItem()403 OFCondition DRTMeasuredDoseReferenceSequence::gotoFirstItem()
404 {
405     OFCondition result = EC_IllegalCall;
406     if (!SequenceOfItems.empty())
407     {
408         CurrentItem = SequenceOfItems.begin();
409         result = EC_Normal;
410     }
411     return result;
412 }
413 
414 
gotoNextItem()415 OFCondition DRTMeasuredDoseReferenceSequence::gotoNextItem()
416 {
417     OFCondition result = EC_IllegalCall;
418     if (CurrentItem != SequenceOfItems.end())
419     {
420         ++CurrentItem;
421         result = EC_Normal;
422     }
423     return result;
424 }
425 
426 
gotoItem(const size_t num,OFListIterator (Item *)& iterator)427 OFCondition DRTMeasuredDoseReferenceSequence::gotoItem(const size_t num, OFListIterator(Item *) &iterator)
428 {
429     OFCondition result = EC_IllegalCall;
430     if (!SequenceOfItems.empty())
431     {
432         size_t idx = num + 1;
433         iterator = SequenceOfItems.begin();
434         const OFListConstIterator(Item *) last = SequenceOfItems.end();
435         while ((--idx > 0) && (iterator != last))
436             ++iterator;
437         /* specified list item found? */
438         if ((idx == 0) && (iterator != last))
439             result = EC_Normal;
440         else
441             result = EC_IllegalParameter;
442     }
443     return result;
444 }
445 
446 
gotoItem(const size_t num,OFListConstIterator (Item *)& iterator) const447 OFCondition DRTMeasuredDoseReferenceSequence::gotoItem(const size_t num, OFListConstIterator(Item *) &iterator) const
448 {
449     OFCondition result = EC_IllegalCall;
450     if (!SequenceOfItems.empty())
451     {
452         size_t idx = num + 1;
453         iterator = SequenceOfItems.begin();
454         const OFListConstIterator(Item *) last = SequenceOfItems.end();
455         while ((--idx > 0) && (iterator != last))
456             ++iterator;
457         /* specified list item found? */
458         if ((idx == 0) && (iterator != last))
459             result = EC_Normal;
460         else
461             result = EC_IllegalParameter;
462     }
463     return result;
464 }
465 
466 
gotoItem(const size_t num)467 OFCondition DRTMeasuredDoseReferenceSequence::gotoItem(const size_t num)
468 {
469     return gotoItem(num, CurrentItem);
470 }
471 
472 
getCurrentItem(Item * & item) const473 OFCondition DRTMeasuredDoseReferenceSequence::getCurrentItem(Item *&item) const
474 {
475     OFCondition result = EC_IllegalCall;
476     if (CurrentItem != SequenceOfItems.end())
477     {
478         item = *CurrentItem;
479         result = EC_Normal;
480     }
481     return result;
482 }
483 
484 
getCurrentItem()485 DRTMeasuredDoseReferenceSequence::Item &DRTMeasuredDoseReferenceSequence::getCurrentItem()
486 {
487     if (CurrentItem != SequenceOfItems.end())
488         return **CurrentItem;
489     else
490         return EmptyItem;
491 }
492 
493 
getCurrentItem() const494 const DRTMeasuredDoseReferenceSequence::Item &DRTMeasuredDoseReferenceSequence::getCurrentItem() const
495 {
496     if (CurrentItem != SequenceOfItems.end())
497         return **CurrentItem;
498     else
499         return EmptyItem;
500 }
501 
502 
getItem(const size_t num,Item * & item)503 OFCondition DRTMeasuredDoseReferenceSequence::getItem(const size_t num, Item *&item)
504 {
505     OFListIterator(Item *) iterator;
506     OFCondition result = gotoItem(num, iterator);
507     if (result.good())
508         item = *iterator;
509     return result;
510 }
511 
512 
getItem(const size_t num)513 DRTMeasuredDoseReferenceSequence::Item &DRTMeasuredDoseReferenceSequence::getItem(const size_t num)
514 {
515     OFListIterator(Item *) iterator;
516     if (gotoItem(num, iterator).good())
517         return **iterator;
518     else
519         return EmptyItem;
520 }
521 
522 
getItem(const size_t num) const523 const DRTMeasuredDoseReferenceSequence::Item &DRTMeasuredDoseReferenceSequence::getItem(const size_t num) const
524 {
525     OFListConstIterator(Item *) iterator;
526     if (gotoItem(num, iterator).good())
527         return **iterator;
528     else
529         return EmptyItem;
530 }
531 
532 
operator [](const size_t num)533 DRTMeasuredDoseReferenceSequence::Item &DRTMeasuredDoseReferenceSequence::operator[](const size_t num)
534 {
535     return getItem(num);
536 }
537 
538 
operator [](const size_t num) const539 const DRTMeasuredDoseReferenceSequence::Item &DRTMeasuredDoseReferenceSequence::operator[](const size_t num) const
540 {
541     return getItem(num);
542 }
543 
544 
addItem(Item * & item)545 OFCondition DRTMeasuredDoseReferenceSequence::addItem(Item *&item)
546 {
547     OFCondition result = EC_IllegalCall;
548     if (!EmptyDefaultSequence)
549     {
550         item = new Item();
551         if (item != NULL)
552         {
553             SequenceOfItems.push_back(item);
554             result = EC_Normal;
555         } else
556             result = EC_MemoryExhausted;
557     }
558     return result;
559 }
560 
561 
insertItem(const size_t pos,Item * & item)562 OFCondition DRTMeasuredDoseReferenceSequence::insertItem(const size_t pos, Item *&item)
563 {
564     OFCondition result = EC_IllegalCall;
565     if (!EmptyDefaultSequence)
566     {
567         OFListIterator(Item *) iterator;
568         result = gotoItem(pos, iterator);
569         if (result.good())
570         {
571             item = new Item();
572             if (item != NULL)
573             {
574                 SequenceOfItems.insert(iterator, 1, item);
575                 result = EC_Normal;
576             } else
577                 result = EC_MemoryExhausted;
578         } else
579             result = addItem(item);
580     }
581     return result;
582 }
583 
584 
removeItem(const size_t pos)585 OFCondition DRTMeasuredDoseReferenceSequence::removeItem(const size_t pos)
586 {
587     OFCondition result = EC_IllegalCall;
588     if (!EmptyDefaultSequence)
589     {
590         OFListIterator(Item *) iterator;
591         if (gotoItem(pos, iterator).good())
592         {
593             delete *iterator;
594             iterator = SequenceOfItems.erase(iterator);
595             result = EC_Normal;
596         } else
597             result = EC_IllegalParameter;
598     }
599     return result;
600 }
601 
602 
read(DcmItem & dataset,const OFString & card,const OFString & type,const char * moduleName)603 OFCondition DRTMeasuredDoseReferenceSequence::read(DcmItem &dataset,
604                                                    const OFString &card,
605                                                    const OFString &type,
606                                                    const char *moduleName)
607 {
608     OFCondition result = EC_IllegalCall;
609     if (!EmptyDefaultSequence)
610     {
611         /* re-initialize object */
612         clear();
613         /* retrieve sequence element from dataset */
614         DcmSequenceOfItems *sequence;
615         result = dataset.findAndGetSequence(DCM_MeasuredDoseReferenceSequence, sequence);
616         if (sequence != NULL)
617         {
618             if (checkElementValue(*sequence, card, type, result, moduleName))
619             {
620                 DcmStack stack;
621                 OFBool first = OFTrue;
622                 /* iterate over all sequence items */
623                 while (result.good() && sequence->nextObject(stack, first /*intoSub*/).good())
624                 {
625                     DcmItem *ditem = OFstatic_cast(DcmItem *, stack.top());
626                     if (ditem != NULL)
627                     {
628                         Item *item = new Item();
629                         if (item != NULL)
630                         {
631                             result = item->read(*ditem);
632                             if (result.good())
633                             {
634                                 /* append new item to the end of the list */
635                                 SequenceOfItems.push_back(item);
636                                 first = OFFalse;
637                             }
638                         } else
639                             result = EC_MemoryExhausted;
640                     } else
641                         result = EC_CorruptedData;
642                 }
643             }
644         } else {
645             DcmSequenceOfItems element(DCM_MeasuredDoseReferenceSequence);
646             checkElementValue(element, card, type, result, moduleName);
647         }
648     }
649     return result;
650 }
651 
652 
write(DcmItem & dataset,const OFString & card,const OFString & type,const char * moduleName)653 OFCondition DRTMeasuredDoseReferenceSequence::write(DcmItem &dataset,
654                                                     const OFString &card,
655                                                     const OFString &type,
656                                                     const char *moduleName)
657 {
658     OFCondition result = EC_IllegalCall;
659     if (!EmptyDefaultSequence)
660     {
661         result = EC_MemoryExhausted;
662         DcmSequenceOfItems *sequence = new DcmSequenceOfItems(DCM_MeasuredDoseReferenceSequence);
663         if (sequence != NULL)
664         {
665             result = EC_Normal;
666             /* an empty optional sequence is not written */
667             if ((type == "2") || !SequenceOfItems.empty())
668             {
669                 OFListIterator(Item *) iterator = SequenceOfItems.begin();
670                 const OFListConstIterator(Item *) last = SequenceOfItems.end();
671                 /* iterate over all sequence items */
672                 while (result.good() && (iterator != last))
673                 {
674                     DcmItem *item = new DcmItem();
675                     if (item != NULL)
676                     {
677                         /* append new item to the end of the sequence */
678                         result = sequence->append(item);
679                         if (result.good())
680                         {
681                             result = (*iterator)->write(*item);
682                             ++iterator;
683                         } else
684                             delete item;
685                     } else
686                         result = EC_MemoryExhausted;
687                 }
688                 if (result.good())
689                 {
690                     /* insert sequence element into the dataset */
691                     result = dataset.insert(sequence, OFTrue /*replaceOld*/);
692                 }
693                 if (DCM_dcmrtLogger.isEnabledFor(OFLogger::WARN_LOG_LEVEL))
694                     checkElementValue(*sequence, card, type, result, moduleName);
695                 if (result.good())
696                 {
697                     /* forget reference to sequence object (avoid deletion below) */
698                     sequence = NULL;
699                 }
700             }
701             else if (type == "1")
702             {
703                 /* empty type 1 sequence not allowed */
704                 result = RT_EC_InvalidValue;
705                 if (DCM_dcmrtLogger.isEnabledFor(OFLogger::WARN_LOG_LEVEL))
706                     checkElementValue(*sequence, card, type, result, moduleName);
707             }
708             /* delete sequence (if not inserted into the dataset) */
709             delete sequence;
710         }
711     }
712     return result;
713 }
714 
715 
716 // end of source file
717