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 DRTStructureSetROISequence
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/drtssrs.h"
18 
19 
20 // --- item class ---
21 
Item(const OFBool emptyDefaultItem)22 DRTStructureSetROISequence::Item::Item(const OFBool emptyDefaultItem)
23   : EmptyDefaultItem(emptyDefaultItem),
24     DerivationCodeSequence(emptyDefaultItem /*emptyDefaultSequence*/),
25     ROIDescription(DCM_ROIDescription),
26     ROIGenerationAlgorithm(DCM_ROIGenerationAlgorithm),
27     ROIGenerationDescription(DCM_ROIGenerationDescription),
28     ROIName(DCM_ROIName),
29     ROINumber(DCM_ROINumber),
30     ROIVolume(DCM_ROIVolume),
31     ReferencedFrameOfReferenceUID(DCM_ReferencedFrameOfReferenceUID)
32 {
33 }
34 
35 
Item(const Item & copy)36 DRTStructureSetROISequence::Item::Item(const Item &copy)
37   : EmptyDefaultItem(copy.EmptyDefaultItem),
38     DerivationCodeSequence(copy.DerivationCodeSequence),
39     ROIDescription(copy.ROIDescription),
40     ROIGenerationAlgorithm(copy.ROIGenerationAlgorithm),
41     ROIGenerationDescription(copy.ROIGenerationDescription),
42     ROIName(copy.ROIName),
43     ROINumber(copy.ROINumber),
44     ROIVolume(copy.ROIVolume),
45     ReferencedFrameOfReferenceUID(copy.ReferencedFrameOfReferenceUID)
46 {
47 }
48 
49 
~Item()50 DRTStructureSetROISequence::Item::~Item()
51 {
52 }
53 
54 
operator =(const Item & copy)55 DRTStructureSetROISequence::Item &DRTStructureSetROISequence::Item::operator=(const Item &copy)
56 {
57     if (this != &copy)
58     {
59         EmptyDefaultItem = copy.EmptyDefaultItem;
60         DerivationCodeSequence = copy.DerivationCodeSequence;
61         ROIDescription = copy.ROIDescription;
62         ROIGenerationAlgorithm = copy.ROIGenerationAlgorithm;
63         ROIGenerationDescription = copy.ROIGenerationDescription;
64         ROIName = copy.ROIName;
65         ROINumber = copy.ROINumber;
66         ROIVolume = copy.ROIVolume;
67         ReferencedFrameOfReferenceUID = copy.ReferencedFrameOfReferenceUID;
68     }
69     return *this;
70 }
71 
72 
clear()73 void DRTStructureSetROISequence::Item::clear()
74 {
75     if (!EmptyDefaultItem)
76     {
77         /* clear all DICOM attributes */
78         ROINumber.clear();
79         ReferencedFrameOfReferenceUID.clear();
80         ROIName.clear();
81         ROIDescription.clear();
82         ROIVolume.clear();
83         ROIGenerationAlgorithm.clear();
84         ROIGenerationDescription.clear();
85         DerivationCodeSequence.clear();
86     }
87 }
88 
89 
isEmpty()90 OFBool DRTStructureSetROISequence::Item::isEmpty()
91 {
92     return ROINumber.isEmpty() &&
93            ReferencedFrameOfReferenceUID.isEmpty() &&
94            ROIName.isEmpty() &&
95            ROIDescription.isEmpty() &&
96            ROIVolume.isEmpty() &&
97            ROIGenerationAlgorithm.isEmpty() &&
98            ROIGenerationDescription.isEmpty() &&
99            DerivationCodeSequence.isEmpty();
100 }
101 
102 
isValid() const103 OFBool DRTStructureSetROISequence::Item::isValid() const
104 {
105     return !EmptyDefaultItem;
106 }
107 
108 
read(DcmItem & item)109 OFCondition DRTStructureSetROISequence::Item::read(DcmItem &item)
110 {
111     OFCondition result = EC_IllegalCall;
112     if (!EmptyDefaultItem)
113     {
114         /* re-initialize object */
115         clear();
116         getAndCheckElementFromDataset(item, ROINumber, "1", "1", "StructureSetROISequence");
117         getAndCheckElementFromDataset(item, ReferencedFrameOfReferenceUID, "1", "1", "StructureSetROISequence");
118         getAndCheckElementFromDataset(item, ROIName, "1", "2", "StructureSetROISequence");
119         getAndCheckElementFromDataset(item, ROIDescription, "1", "3", "StructureSetROISequence");
120         getAndCheckElementFromDataset(item, ROIVolume, "1", "3", "StructureSetROISequence");
121         getAndCheckElementFromDataset(item, ROIGenerationAlgorithm, "1", "2", "StructureSetROISequence");
122         getAndCheckElementFromDataset(item, ROIGenerationDescription, "1", "3", "StructureSetROISequence");
123         DerivationCodeSequence.read(item, "1-n", "3", "StructureSetROISequence");
124         result = EC_Normal;
125     }
126     return result;
127 }
128 
129 
write(DcmItem & item)130 OFCondition DRTStructureSetROISequence::Item::write(DcmItem &item)
131 {
132     OFCondition result = EC_IllegalCall;
133     if (!EmptyDefaultItem)
134     {
135         result = EC_Normal;
136         addElementToDataset(result, item, new DcmIntegerString(ROINumber), "1", "1", "StructureSetROISequence");
137         addElementToDataset(result, item, new DcmUniqueIdentifier(ReferencedFrameOfReferenceUID), "1", "1", "StructureSetROISequence");
138         addElementToDataset(result, item, new DcmLongString(ROIName), "1", "2", "StructureSetROISequence");
139         addElementToDataset(result, item, new DcmShortText(ROIDescription), "1", "3", "StructureSetROISequence");
140         addElementToDataset(result, item, new DcmDecimalString(ROIVolume), "1", "3", "StructureSetROISequence");
141         addElementToDataset(result, item, new DcmCodeString(ROIGenerationAlgorithm), "1", "2", "StructureSetROISequence");
142         addElementToDataset(result, item, new DcmLongString(ROIGenerationDescription), "1", "3", "StructureSetROISequence");
143         if (result.good()) result = DerivationCodeSequence.write(item, "1-n", "3", "StructureSetROISequence");
144     }
145     return result;
146 }
147 
148 
getROIDescription(OFString & value,const signed long pos) const149 OFCondition DRTStructureSetROISequence::Item::getROIDescription(OFString &value, const signed long pos) const
150 {
151     if (EmptyDefaultItem)
152         return EC_IllegalCall;
153     else
154         return getStringValueFromElement(ROIDescription, value, pos);
155 }
156 
157 
getROIGenerationAlgorithm(OFString & value,const signed long pos) const158 OFCondition DRTStructureSetROISequence::Item::getROIGenerationAlgorithm(OFString &value, const signed long pos) const
159 {
160     if (EmptyDefaultItem)
161         return EC_IllegalCall;
162     else
163         return getStringValueFromElement(ROIGenerationAlgorithm, value, pos);
164 }
165 
166 
getROIGenerationDescription(OFString & value,const signed long pos) const167 OFCondition DRTStructureSetROISequence::Item::getROIGenerationDescription(OFString &value, const signed long pos) const
168 {
169     if (EmptyDefaultItem)
170         return EC_IllegalCall;
171     else
172         return getStringValueFromElement(ROIGenerationDescription, value, pos);
173 }
174 
175 
getROIName(OFString & value,const signed long pos) const176 OFCondition DRTStructureSetROISequence::Item::getROIName(OFString &value, const signed long pos) const
177 {
178     if (EmptyDefaultItem)
179         return EC_IllegalCall;
180     else
181         return getStringValueFromElement(ROIName, value, pos);
182 }
183 
184 
getROINumber(OFString & value,const signed long pos) const185 OFCondition DRTStructureSetROISequence::Item::getROINumber(OFString &value, const signed long pos) const
186 {
187     if (EmptyDefaultItem)
188         return EC_IllegalCall;
189     else
190         return getStringValueFromElement(ROINumber, value, pos);
191 }
192 
193 
getROINumber(Sint32 & value,const unsigned long pos) const194 OFCondition DRTStructureSetROISequence::Item::getROINumber(Sint32 &value, const unsigned long pos) const
195 {
196     if (EmptyDefaultItem)
197         return EC_IllegalCall;
198     else
199         return OFconst_cast(DcmIntegerString &, ROINumber).getSint32(value, pos);
200 }
201 
202 
getROIVolume(OFString & value,const signed long pos) const203 OFCondition DRTStructureSetROISequence::Item::getROIVolume(OFString &value, const signed long pos) const
204 {
205     if (EmptyDefaultItem)
206         return EC_IllegalCall;
207     else
208         return getStringValueFromElement(ROIVolume, value, pos);
209 }
210 
211 
getROIVolume(Float64 & value,const unsigned long pos) const212 OFCondition DRTStructureSetROISequence::Item::getROIVolume(Float64 &value, const unsigned long pos) const
213 {
214     if (EmptyDefaultItem)
215         return EC_IllegalCall;
216     else
217         return OFconst_cast(DcmDecimalString &, ROIVolume).getFloat64(value, pos);
218 }
219 
220 
getReferencedFrameOfReferenceUID(OFString & value,const signed long pos) const221 OFCondition DRTStructureSetROISequence::Item::getReferencedFrameOfReferenceUID(OFString &value, const signed long pos) const
222 {
223     if (EmptyDefaultItem)
224         return EC_IllegalCall;
225     else
226         return getStringValueFromElement(ReferencedFrameOfReferenceUID, value, pos);
227 }
228 
229 
setROIDescription(const OFString & value,const OFBool check)230 OFCondition DRTStructureSetROISequence::Item::setROIDescription(const OFString &value, const OFBool check)
231 {
232     OFCondition result = EC_IllegalCall;
233     if (!EmptyDefaultItem)
234     {
235         result = (check) ? DcmShortText::checkStringValue(value) : EC_Normal;
236         if (result.good())
237             result = ROIDescription.putOFStringArray(value);
238     }
239     return result;
240 }
241 
242 
setROIGenerationAlgorithm(const OFString & value,const OFBool check)243 OFCondition DRTStructureSetROISequence::Item::setROIGenerationAlgorithm(const OFString &value, const OFBool check)
244 {
245     OFCondition result = EC_IllegalCall;
246     if (!EmptyDefaultItem)
247     {
248         result = (check) ? DcmCodeString::checkStringValue(value, "1") : EC_Normal;
249         if (result.good())
250             result = ROIGenerationAlgorithm.putOFStringArray(value);
251     }
252     return result;
253 }
254 
255 
setROIGenerationDescription(const OFString & value,const OFBool check)256 OFCondition DRTStructureSetROISequence::Item::setROIGenerationDescription(const OFString &value, const OFBool check)
257 {
258     OFCondition result = EC_IllegalCall;
259     if (!EmptyDefaultItem)
260     {
261         result = (check) ? DcmLongString::checkStringValue(value, "1") : EC_Normal;
262         if (result.good())
263             result = ROIGenerationDescription.putOFStringArray(value);
264     }
265     return result;
266 }
267 
268 
setROIName(const OFString & value,const OFBool check)269 OFCondition DRTStructureSetROISequence::Item::setROIName(const OFString &value, const OFBool check)
270 {
271     OFCondition result = EC_IllegalCall;
272     if (!EmptyDefaultItem)
273     {
274         result = (check) ? DcmLongString::checkStringValue(value, "1") : EC_Normal;
275         if (result.good())
276             result = ROIName.putOFStringArray(value);
277     }
278     return result;
279 }
280 
281 
setROINumber(const OFString & value,const OFBool check)282 OFCondition DRTStructureSetROISequence::Item::setROINumber(const OFString &value, const OFBool check)
283 {
284     OFCondition result = EC_IllegalCall;
285     if (!EmptyDefaultItem)
286     {
287         result = (check) ? DcmIntegerString::checkStringValue(value, "1") : EC_Normal;
288         if (result.good())
289             result = ROINumber.putOFStringArray(value);
290     }
291     return result;
292 }
293 
294 
setROIVolume(const OFString & value,const OFBool check)295 OFCondition DRTStructureSetROISequence::Item::setROIVolume(const OFString &value, const OFBool check)
296 {
297     OFCondition result = EC_IllegalCall;
298     if (!EmptyDefaultItem)
299     {
300         result = (check) ? DcmDecimalString::checkStringValue(value, "1") : EC_Normal;
301         if (result.good())
302             result = ROIVolume.putOFStringArray(value);
303     }
304     return result;
305 }
306 
307 
setReferencedFrameOfReferenceUID(const OFString & value,const OFBool check)308 OFCondition DRTStructureSetROISequence::Item::setReferencedFrameOfReferenceUID(const OFString &value, const OFBool check)
309 {
310     OFCondition result = EC_IllegalCall;
311     if (!EmptyDefaultItem)
312     {
313         result = (check) ? DcmUniqueIdentifier::checkStringValue(value, "1") : EC_Normal;
314         if (result.good())
315             result = ReferencedFrameOfReferenceUID.putOFStringArray(value);
316     }
317     return result;
318 }
319 
320 
321 // --- sequence class ---
322 
DRTStructureSetROISequence(const OFBool emptyDefaultSequence)323 DRTStructureSetROISequence::DRTStructureSetROISequence(const OFBool emptyDefaultSequence)
324   : EmptyDefaultSequence(emptyDefaultSequence),
325     SequenceOfItems(),
326     CurrentItem(),
327     EmptyItem(OFTrue /*emptyDefaultItem*/)
328 {
329     CurrentItem = SequenceOfItems.end();
330 }
331 
332 
DRTStructureSetROISequence(const DRTStructureSetROISequence & copy)333 DRTStructureSetROISequence::DRTStructureSetROISequence(const DRTStructureSetROISequence &copy)
334   : EmptyDefaultSequence(copy.EmptyDefaultSequence),
335     SequenceOfItems(),
336     CurrentItem(),
337     EmptyItem(OFTrue /*emptyDefaultItem*/)
338 {
339     /* create a copy of the internal sequence of items */
340     Item *item = NULL;
341     OFListConstIterator(Item *) current = copy.SequenceOfItems.begin();
342     const OFListConstIterator(Item *) last = copy.SequenceOfItems.end();
343     while (current != last)
344     {
345         item = new Item(**current);
346         if (item != NULL)
347         {
348             SequenceOfItems.push_back(item);
349         } else {
350             /* memory exhausted, there is nothing we can do about it */
351             break;
352         }
353         ++current;
354     }
355     CurrentItem = SequenceOfItems.begin();
356 }
357 
358 
operator =(const DRTStructureSetROISequence & copy)359 DRTStructureSetROISequence &DRTStructureSetROISequence::operator=(const DRTStructureSetROISequence &copy)
360 {
361     if (this != &copy)
362     {
363         clear();
364         EmptyDefaultSequence = copy.EmptyDefaultSequence;
365         /* create a copy of the internal sequence of items */
366         Item *item = NULL;
367         OFListConstIterator(Item *) current = copy.SequenceOfItems.begin();
368         const OFListConstIterator(Item *) last = copy.SequenceOfItems.end();
369         while (current != last)
370         {
371             item = new Item(**current);
372             if (item != NULL)
373             {
374                 SequenceOfItems.push_back(item);
375             } else {
376                 /* memory exhausted, there is nothing we can do about it */
377                 break;
378             }
379             ++current;
380         }
381         CurrentItem = SequenceOfItems.begin();
382     }
383     return *this;
384 }
385 
386 
~DRTStructureSetROISequence()387 DRTStructureSetROISequence::~DRTStructureSetROISequence()
388 {
389     clear();
390 }
391 
392 
clear()393 void DRTStructureSetROISequence::clear()
394 {
395     if (!EmptyDefaultSequence)
396     {
397         CurrentItem = SequenceOfItems.begin();
398         const OFListConstIterator(Item *) last = SequenceOfItems.end();
399         /* delete all items and free memory */
400         while (CurrentItem != last)
401         {
402             delete (*CurrentItem);
403             CurrentItem = SequenceOfItems.erase(CurrentItem);
404         }
405         /* make sure that the list is empty */
406         SequenceOfItems.clear();
407         CurrentItem = SequenceOfItems.end();
408     }
409 }
410 
411 
isEmpty()412 OFBool DRTStructureSetROISequence::isEmpty()
413 {
414     return SequenceOfItems.empty();
415 }
416 
417 
isValid() const418 OFBool DRTStructureSetROISequence::isValid() const
419 {
420     return !EmptyDefaultSequence;
421 }
422 
423 
getNumberOfItems() const424 size_t DRTStructureSetROISequence::getNumberOfItems() const
425 {
426     return SequenceOfItems.size();
427 }
428 
429 
gotoFirstItem()430 OFCondition DRTStructureSetROISequence::gotoFirstItem()
431 {
432     OFCondition result = EC_IllegalCall;
433     if (!SequenceOfItems.empty())
434     {
435         CurrentItem = SequenceOfItems.begin();
436         result = EC_Normal;
437     }
438     return result;
439 }
440 
441 
gotoNextItem()442 OFCondition DRTStructureSetROISequence::gotoNextItem()
443 {
444     OFCondition result = EC_IllegalCall;
445     if (CurrentItem != SequenceOfItems.end())
446     {
447         ++CurrentItem;
448         result = EC_Normal;
449     }
450     return result;
451 }
452 
453 
gotoItem(const size_t num,OFListIterator (Item *)& iterator)454 OFCondition DRTStructureSetROISequence::gotoItem(const size_t num, OFListIterator(Item *) &iterator)
455 {
456     OFCondition result = EC_IllegalCall;
457     if (!SequenceOfItems.empty())
458     {
459         size_t idx = num + 1;
460         iterator = SequenceOfItems.begin();
461         const OFListConstIterator(Item *) last = SequenceOfItems.end();
462         while ((--idx > 0) && (iterator != last))
463             ++iterator;
464         /* specified list item found? */
465         if ((idx == 0) && (iterator != last))
466             result = EC_Normal;
467         else
468             result = EC_IllegalParameter;
469     }
470     return result;
471 }
472 
473 
gotoItem(const size_t num,OFListConstIterator (Item *)& iterator) const474 OFCondition DRTStructureSetROISequence::gotoItem(const size_t num, OFListConstIterator(Item *) &iterator) const
475 {
476     OFCondition result = EC_IllegalCall;
477     if (!SequenceOfItems.empty())
478     {
479         size_t idx = num + 1;
480         iterator = SequenceOfItems.begin();
481         const OFListConstIterator(Item *) last = SequenceOfItems.end();
482         while ((--idx > 0) && (iterator != last))
483             ++iterator;
484         /* specified list item found? */
485         if ((idx == 0) && (iterator != last))
486             result = EC_Normal;
487         else
488             result = EC_IllegalParameter;
489     }
490     return result;
491 }
492 
493 
gotoItem(const size_t num)494 OFCondition DRTStructureSetROISequence::gotoItem(const size_t num)
495 {
496     return gotoItem(num, CurrentItem);
497 }
498 
499 
getCurrentItem(Item * & item) const500 OFCondition DRTStructureSetROISequence::getCurrentItem(Item *&item) const
501 {
502     OFCondition result = EC_IllegalCall;
503     if (CurrentItem != SequenceOfItems.end())
504     {
505         item = *CurrentItem;
506         result = EC_Normal;
507     }
508     return result;
509 }
510 
511 
getCurrentItem()512 DRTStructureSetROISequence::Item &DRTStructureSetROISequence::getCurrentItem()
513 {
514     if (CurrentItem != SequenceOfItems.end())
515         return **CurrentItem;
516     else
517         return EmptyItem;
518 }
519 
520 
getCurrentItem() const521 const DRTStructureSetROISequence::Item &DRTStructureSetROISequence::getCurrentItem() const
522 {
523     if (CurrentItem != SequenceOfItems.end())
524         return **CurrentItem;
525     else
526         return EmptyItem;
527 }
528 
529 
getItem(const size_t num,Item * & item)530 OFCondition DRTStructureSetROISequence::getItem(const size_t num, Item *&item)
531 {
532     OFListIterator(Item *) iterator;
533     OFCondition result = gotoItem(num, iterator);
534     if (result.good())
535         item = *iterator;
536     return result;
537 }
538 
539 
getItem(const size_t num)540 DRTStructureSetROISequence::Item &DRTStructureSetROISequence::getItem(const size_t num)
541 {
542     OFListIterator(Item *) iterator;
543     if (gotoItem(num, iterator).good())
544         return **iterator;
545     else
546         return EmptyItem;
547 }
548 
549 
getItem(const size_t num) const550 const DRTStructureSetROISequence::Item &DRTStructureSetROISequence::getItem(const size_t num) const
551 {
552     OFListConstIterator(Item *) iterator;
553     if (gotoItem(num, iterator).good())
554         return **iterator;
555     else
556         return EmptyItem;
557 }
558 
559 
operator [](const size_t num)560 DRTStructureSetROISequence::Item &DRTStructureSetROISequence::operator[](const size_t num)
561 {
562     return getItem(num);
563 }
564 
565 
operator [](const size_t num) const566 const DRTStructureSetROISequence::Item &DRTStructureSetROISequence::operator[](const size_t num) const
567 {
568     return getItem(num);
569 }
570 
571 
addItem(Item * & item)572 OFCondition DRTStructureSetROISequence::addItem(Item *&item)
573 {
574     OFCondition result = EC_IllegalCall;
575     if (!EmptyDefaultSequence)
576     {
577         item = new Item();
578         if (item != NULL)
579         {
580             SequenceOfItems.push_back(item);
581             result = EC_Normal;
582         } else
583             result = EC_MemoryExhausted;
584     }
585     return result;
586 }
587 
588 
insertItem(const size_t pos,Item * & item)589 OFCondition DRTStructureSetROISequence::insertItem(const size_t pos, Item *&item)
590 {
591     OFCondition result = EC_IllegalCall;
592     if (!EmptyDefaultSequence)
593     {
594         OFListIterator(Item *) iterator;
595         result = gotoItem(pos, iterator);
596         if (result.good())
597         {
598             item = new Item();
599             if (item != NULL)
600             {
601                 SequenceOfItems.insert(iterator, 1, item);
602                 result = EC_Normal;
603             } else
604                 result = EC_MemoryExhausted;
605         } else
606             result = addItem(item);
607     }
608     return result;
609 }
610 
611 
removeItem(const size_t pos)612 OFCondition DRTStructureSetROISequence::removeItem(const size_t pos)
613 {
614     OFCondition result = EC_IllegalCall;
615     if (!EmptyDefaultSequence)
616     {
617         OFListIterator(Item *) iterator;
618         if (gotoItem(pos, iterator).good())
619         {
620             delete *iterator;
621             iterator = SequenceOfItems.erase(iterator);
622             result = EC_Normal;
623         } else
624             result = EC_IllegalParameter;
625     }
626     return result;
627 }
628 
629 
read(DcmItem & dataset,const OFString & card,const OFString & type,const char * moduleName)630 OFCondition DRTStructureSetROISequence::read(DcmItem &dataset,
631                                              const OFString &card,
632                                              const OFString &type,
633                                              const char *moduleName)
634 {
635     OFCondition result = EC_IllegalCall;
636     if (!EmptyDefaultSequence)
637     {
638         /* re-initialize object */
639         clear();
640         /* retrieve sequence element from dataset */
641         DcmSequenceOfItems *sequence;
642         result = dataset.findAndGetSequence(DCM_StructureSetROISequence, sequence);
643         if (sequence != NULL)
644         {
645             if (checkElementValue(*sequence, card, type, result, moduleName))
646             {
647                 DcmStack stack;
648                 OFBool first = OFTrue;
649                 /* iterate over all sequence items */
650                 while (result.good() && sequence->nextObject(stack, first /*intoSub*/).good())
651                 {
652                     DcmItem *ditem = OFstatic_cast(DcmItem *, stack.top());
653                     if (ditem != NULL)
654                     {
655                         Item *item = new Item();
656                         if (item != NULL)
657                         {
658                             result = item->read(*ditem);
659                             if (result.good())
660                             {
661                                 /* append new item to the end of the list */
662                                 SequenceOfItems.push_back(item);
663                                 first = OFFalse;
664                             }
665                         } else
666                             result = EC_MemoryExhausted;
667                     } else
668                         result = EC_CorruptedData;
669                 }
670             }
671         } else {
672             DcmSequenceOfItems element(DCM_StructureSetROISequence);
673             checkElementValue(element, card, type, result, moduleName);
674         }
675     }
676     return result;
677 }
678 
679 
write(DcmItem & dataset,const OFString & card,const OFString & type,const char * moduleName)680 OFCondition DRTStructureSetROISequence::write(DcmItem &dataset,
681                                               const OFString &card,
682                                               const OFString &type,
683                                               const char *moduleName)
684 {
685     OFCondition result = EC_IllegalCall;
686     if (!EmptyDefaultSequence)
687     {
688         result = EC_MemoryExhausted;
689         DcmSequenceOfItems *sequence = new DcmSequenceOfItems(DCM_StructureSetROISequence);
690         if (sequence != NULL)
691         {
692             result = EC_Normal;
693             /* an empty optional sequence is not written */
694             if ((type == "2") || !SequenceOfItems.empty())
695             {
696                 OFListIterator(Item *) iterator = SequenceOfItems.begin();
697                 const OFListConstIterator(Item *) last = SequenceOfItems.end();
698                 /* iterate over all sequence items */
699                 while (result.good() && (iterator != last))
700                 {
701                     DcmItem *item = new DcmItem();
702                     if (item != NULL)
703                     {
704                         /* append new item to the end of the sequence */
705                         result = sequence->append(item);
706                         if (result.good())
707                         {
708                             result = (*iterator)->write(*item);
709                             ++iterator;
710                         } else
711                             delete item;
712                     } else
713                         result = EC_MemoryExhausted;
714                 }
715                 if (result.good())
716                 {
717                     /* insert sequence element into the dataset */
718                     result = dataset.insert(sequence, OFTrue /*replaceOld*/);
719                 }
720                 if (DCM_dcmrtLogger.isEnabledFor(OFLogger::WARN_LOG_LEVEL))
721                     checkElementValue(*sequence, card, type, result, moduleName);
722                 if (result.good())
723                 {
724                     /* forget reference to sequence object (avoid deletion below) */
725                     sequence = NULL;
726                 }
727             }
728             else if (type == "1")
729             {
730                 /* empty type 1 sequence not allowed */
731                 result = RT_EC_InvalidValue;
732                 if (DCM_dcmrtLogger.isEnabledFor(OFLogger::WARN_LOG_LEVEL))
733                     checkElementValue(*sequence, card, type, result, moduleName);
734             }
735             /* delete sequence (if not inserted into the dataset) */
736             delete sequence;
737         }
738     }
739     return result;
740 }
741 
742 
743 // end of source file
744