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 ©)
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 ©)
56 {
57 if (this != ©)
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 ©)
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 ©)
360 {
361 if (this != ©)
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