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 DRTReferencedRTPlanSequence
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/drtrrtps.h"
18 
19 
20 // --- item class ---
21 
Item(const OFBool emptyDefaultItem)22 DRTReferencedRTPlanSequence::Item::Item(const OFBool emptyDefaultItem)
23   : EmptyDefaultItem(emptyDefaultItem),
24     ReferencedFractionGroupSequence(emptyDefaultItem /*emptyDefaultSequence*/),
25     ReferencedSOPClassUID(DCM_ReferencedSOPClassUID),
26     ReferencedSOPInstanceUID(DCM_ReferencedSOPInstanceUID)
27 {
28 }
29 
30 
Item(const Item & copy)31 DRTReferencedRTPlanSequence::Item::Item(const Item &copy)
32   : EmptyDefaultItem(copy.EmptyDefaultItem),
33     ReferencedFractionGroupSequence(copy.ReferencedFractionGroupSequence),
34     ReferencedSOPClassUID(copy.ReferencedSOPClassUID),
35     ReferencedSOPInstanceUID(copy.ReferencedSOPInstanceUID)
36 {
37 }
38 
39 
~Item()40 DRTReferencedRTPlanSequence::Item::~Item()
41 {
42 }
43 
44 
operator =(const Item & copy)45 DRTReferencedRTPlanSequence::Item &DRTReferencedRTPlanSequence::Item::operator=(const Item &copy)
46 {
47     if (this != &copy)
48     {
49         EmptyDefaultItem = copy.EmptyDefaultItem;
50         ReferencedFractionGroupSequence = copy.ReferencedFractionGroupSequence;
51         ReferencedSOPClassUID = copy.ReferencedSOPClassUID;
52         ReferencedSOPInstanceUID = copy.ReferencedSOPInstanceUID;
53     }
54     return *this;
55 }
56 
57 
clear()58 void DRTReferencedRTPlanSequence::Item::clear()
59 {
60     if (!EmptyDefaultItem)
61     {
62         /* clear all DICOM attributes */
63         ReferencedSOPClassUID.clear();
64         ReferencedSOPInstanceUID.clear();
65         ReferencedFractionGroupSequence.clear();
66     }
67 }
68 
69 
isEmpty()70 OFBool DRTReferencedRTPlanSequence::Item::isEmpty()
71 {
72     return ReferencedSOPClassUID.isEmpty() &&
73            ReferencedSOPInstanceUID.isEmpty() &&
74            ReferencedFractionGroupSequence.isEmpty();
75 }
76 
77 
isValid() const78 OFBool DRTReferencedRTPlanSequence::Item::isValid() const
79 {
80     return !EmptyDefaultItem;
81 }
82 
83 
read(DcmItem & item)84 OFCondition DRTReferencedRTPlanSequence::Item::read(DcmItem &item)
85 {
86     OFCondition result = EC_IllegalCall;
87     if (!EmptyDefaultItem)
88     {
89         /* re-initialize object */
90         clear();
91         getAndCheckElementFromDataset(item, ReferencedSOPClassUID, "1", "1", "ReferencedRTPlanSequence");
92         getAndCheckElementFromDataset(item, ReferencedSOPInstanceUID, "1", "1", "ReferencedRTPlanSequence");
93         ReferencedFractionGroupSequence.read(item, "1-n", "1C", "ReferencedRTPlanSequence");
94         result = EC_Normal;
95     }
96     return result;
97 }
98 
99 
write(DcmItem & item)100 OFCondition DRTReferencedRTPlanSequence::Item::write(DcmItem &item)
101 {
102     OFCondition result = EC_IllegalCall;
103     if (!EmptyDefaultItem)
104     {
105         result = EC_Normal;
106         addElementToDataset(result, item, new DcmUniqueIdentifier(ReferencedSOPClassUID), "1", "1", "ReferencedRTPlanSequence");
107         addElementToDataset(result, item, new DcmUniqueIdentifier(ReferencedSOPInstanceUID), "1", "1", "ReferencedRTPlanSequence");
108         if (result.good()) result = ReferencedFractionGroupSequence.write(item, "1-n", "1C", "ReferencedRTPlanSequence");
109     }
110     return result;
111 }
112 
113 
getReferencedSOPClassUID(OFString & value,const signed long pos) const114 OFCondition DRTReferencedRTPlanSequence::Item::getReferencedSOPClassUID(OFString &value, const signed long pos) const
115 {
116     if (EmptyDefaultItem)
117         return EC_IllegalCall;
118     else
119         return getStringValueFromElement(ReferencedSOPClassUID, value, pos);
120 }
121 
122 
getReferencedSOPInstanceUID(OFString & value,const signed long pos) const123 OFCondition DRTReferencedRTPlanSequence::Item::getReferencedSOPInstanceUID(OFString &value, const signed long pos) const
124 {
125     if (EmptyDefaultItem)
126         return EC_IllegalCall;
127     else
128         return getStringValueFromElement(ReferencedSOPInstanceUID, value, pos);
129 }
130 
131 
setReferencedSOPClassUID(const OFString & value,const OFBool check)132 OFCondition DRTReferencedRTPlanSequence::Item::setReferencedSOPClassUID(const OFString &value, const OFBool check)
133 {
134     OFCondition result = EC_IllegalCall;
135     if (!EmptyDefaultItem)
136     {
137         result = (check) ? DcmUniqueIdentifier::checkStringValue(value, "1") : EC_Normal;
138         if (result.good())
139             result = ReferencedSOPClassUID.putOFStringArray(value);
140     }
141     return result;
142 }
143 
144 
setReferencedSOPInstanceUID(const OFString & value,const OFBool check)145 OFCondition DRTReferencedRTPlanSequence::Item::setReferencedSOPInstanceUID(const OFString &value, const OFBool check)
146 {
147     OFCondition result = EC_IllegalCall;
148     if (!EmptyDefaultItem)
149     {
150         result = (check) ? DcmUniqueIdentifier::checkStringValue(value, "1") : EC_Normal;
151         if (result.good())
152             result = ReferencedSOPInstanceUID.putOFStringArray(value);
153     }
154     return result;
155 }
156 
157 
158 // --- sequence class ---
159 
DRTReferencedRTPlanSequence(const OFBool emptyDefaultSequence)160 DRTReferencedRTPlanSequence::DRTReferencedRTPlanSequence(const OFBool emptyDefaultSequence)
161   : EmptyDefaultSequence(emptyDefaultSequence),
162     SequenceOfItems(),
163     CurrentItem(),
164     EmptyItem(OFTrue /*emptyDefaultItem*/)
165 {
166     CurrentItem = SequenceOfItems.end();
167 }
168 
169 
DRTReferencedRTPlanSequence(const DRTReferencedRTPlanSequence & copy)170 DRTReferencedRTPlanSequence::DRTReferencedRTPlanSequence(const DRTReferencedRTPlanSequence &copy)
171   : EmptyDefaultSequence(copy.EmptyDefaultSequence),
172     SequenceOfItems(),
173     CurrentItem(),
174     EmptyItem(OFTrue /*emptyDefaultItem*/)
175 {
176     /* create a copy of the internal sequence of items */
177     Item *item = NULL;
178     OFListConstIterator(Item *) current = copy.SequenceOfItems.begin();
179     const OFListConstIterator(Item *) last = copy.SequenceOfItems.end();
180     while (current != last)
181     {
182         item = new Item(**current);
183         if (item != NULL)
184         {
185             SequenceOfItems.push_back(item);
186         } else {
187             /* memory exhausted, there is nothing we can do about it */
188             break;
189         }
190         ++current;
191     }
192     CurrentItem = SequenceOfItems.begin();
193 }
194 
195 
operator =(const DRTReferencedRTPlanSequence & copy)196 DRTReferencedRTPlanSequence &DRTReferencedRTPlanSequence::operator=(const DRTReferencedRTPlanSequence &copy)
197 {
198     if (this != &copy)
199     {
200         clear();
201         EmptyDefaultSequence = copy.EmptyDefaultSequence;
202         /* create a copy of the internal sequence of items */
203         Item *item = NULL;
204         OFListConstIterator(Item *) current = copy.SequenceOfItems.begin();
205         const OFListConstIterator(Item *) last = copy.SequenceOfItems.end();
206         while (current != last)
207         {
208             item = new Item(**current);
209             if (item != NULL)
210             {
211                 SequenceOfItems.push_back(item);
212             } else {
213                 /* memory exhausted, there is nothing we can do about it */
214                 break;
215             }
216             ++current;
217         }
218         CurrentItem = SequenceOfItems.begin();
219     }
220     return *this;
221 }
222 
223 
~DRTReferencedRTPlanSequence()224 DRTReferencedRTPlanSequence::~DRTReferencedRTPlanSequence()
225 {
226     clear();
227 }
228 
229 
clear()230 void DRTReferencedRTPlanSequence::clear()
231 {
232     if (!EmptyDefaultSequence)
233     {
234         CurrentItem = SequenceOfItems.begin();
235         const OFListConstIterator(Item *) last = SequenceOfItems.end();
236         /* delete all items and free memory */
237         while (CurrentItem != last)
238         {
239             delete (*CurrentItem);
240             CurrentItem = SequenceOfItems.erase(CurrentItem);
241         }
242         /* make sure that the list is empty */
243         SequenceOfItems.clear();
244         CurrentItem = SequenceOfItems.end();
245     }
246 }
247 
248 
isEmpty()249 OFBool DRTReferencedRTPlanSequence::isEmpty()
250 {
251     return SequenceOfItems.empty();
252 }
253 
254 
isValid() const255 OFBool DRTReferencedRTPlanSequence::isValid() const
256 {
257     return !EmptyDefaultSequence;
258 }
259 
260 
getNumberOfItems() const261 size_t DRTReferencedRTPlanSequence::getNumberOfItems() const
262 {
263     return SequenceOfItems.size();
264 }
265 
266 
gotoFirstItem()267 OFCondition DRTReferencedRTPlanSequence::gotoFirstItem()
268 {
269     OFCondition result = EC_IllegalCall;
270     if (!SequenceOfItems.empty())
271     {
272         CurrentItem = SequenceOfItems.begin();
273         result = EC_Normal;
274     }
275     return result;
276 }
277 
278 
gotoNextItem()279 OFCondition DRTReferencedRTPlanSequence::gotoNextItem()
280 {
281     OFCondition result = EC_IllegalCall;
282     if (CurrentItem != SequenceOfItems.end())
283     {
284         ++CurrentItem;
285         result = EC_Normal;
286     }
287     return result;
288 }
289 
290 
gotoItem(const size_t num,OFListIterator (Item *)& iterator)291 OFCondition DRTReferencedRTPlanSequence::gotoItem(const size_t num, OFListIterator(Item *) &iterator)
292 {
293     OFCondition result = EC_IllegalCall;
294     if (!SequenceOfItems.empty())
295     {
296         size_t idx = num + 1;
297         iterator = SequenceOfItems.begin();
298         const OFListConstIterator(Item *) last = SequenceOfItems.end();
299         while ((--idx > 0) && (iterator != last))
300             ++iterator;
301         /* specified list item found? */
302         if ((idx == 0) && (iterator != last))
303             result = EC_Normal;
304         else
305             result = EC_IllegalParameter;
306     }
307     return result;
308 }
309 
310 
gotoItem(const size_t num,OFListConstIterator (Item *)& iterator) const311 OFCondition DRTReferencedRTPlanSequence::gotoItem(const size_t num, OFListConstIterator(Item *) &iterator) const
312 {
313     OFCondition result = EC_IllegalCall;
314     if (!SequenceOfItems.empty())
315     {
316         size_t idx = num + 1;
317         iterator = SequenceOfItems.begin();
318         const OFListConstIterator(Item *) last = SequenceOfItems.end();
319         while ((--idx > 0) && (iterator != last))
320             ++iterator;
321         /* specified list item found? */
322         if ((idx == 0) && (iterator != last))
323             result = EC_Normal;
324         else
325             result = EC_IllegalParameter;
326     }
327     return result;
328 }
329 
330 
gotoItem(const size_t num)331 OFCondition DRTReferencedRTPlanSequence::gotoItem(const size_t num)
332 {
333     return gotoItem(num, CurrentItem);
334 }
335 
336 
getCurrentItem(Item * & item) const337 OFCondition DRTReferencedRTPlanSequence::getCurrentItem(Item *&item) const
338 {
339     OFCondition result = EC_IllegalCall;
340     if (CurrentItem != SequenceOfItems.end())
341     {
342         item = *CurrentItem;
343         result = EC_Normal;
344     }
345     return result;
346 }
347 
348 
getCurrentItem()349 DRTReferencedRTPlanSequence::Item &DRTReferencedRTPlanSequence::getCurrentItem()
350 {
351     if (CurrentItem != SequenceOfItems.end())
352         return **CurrentItem;
353     else
354         return EmptyItem;
355 }
356 
357 
getCurrentItem() const358 const DRTReferencedRTPlanSequence::Item &DRTReferencedRTPlanSequence::getCurrentItem() const
359 {
360     if (CurrentItem != SequenceOfItems.end())
361         return **CurrentItem;
362     else
363         return EmptyItem;
364 }
365 
366 
getItem(const size_t num,Item * & item)367 OFCondition DRTReferencedRTPlanSequence::getItem(const size_t num, Item *&item)
368 {
369     OFListIterator(Item *) iterator;
370     OFCondition result = gotoItem(num, iterator);
371     if (result.good())
372         item = *iterator;
373     return result;
374 }
375 
376 
getItem(const size_t num)377 DRTReferencedRTPlanSequence::Item &DRTReferencedRTPlanSequence::getItem(const size_t num)
378 {
379     OFListIterator(Item *) iterator;
380     if (gotoItem(num, iterator).good())
381         return **iterator;
382     else
383         return EmptyItem;
384 }
385 
386 
getItem(const size_t num) const387 const DRTReferencedRTPlanSequence::Item &DRTReferencedRTPlanSequence::getItem(const size_t num) const
388 {
389     OFListConstIterator(Item *) iterator;
390     if (gotoItem(num, iterator).good())
391         return **iterator;
392     else
393         return EmptyItem;
394 }
395 
396 
operator [](const size_t num)397 DRTReferencedRTPlanSequence::Item &DRTReferencedRTPlanSequence::operator[](const size_t num)
398 {
399     return getItem(num);
400 }
401 
402 
operator [](const size_t num) const403 const DRTReferencedRTPlanSequence::Item &DRTReferencedRTPlanSequence::operator[](const size_t num) const
404 {
405     return getItem(num);
406 }
407 
408 
addItem(Item * & item)409 OFCondition DRTReferencedRTPlanSequence::addItem(Item *&item)
410 {
411     OFCondition result = EC_IllegalCall;
412     if (!EmptyDefaultSequence)
413     {
414         item = new Item();
415         if (item != NULL)
416         {
417             SequenceOfItems.push_back(item);
418             result = EC_Normal;
419         } else
420             result = EC_MemoryExhausted;
421     }
422     return result;
423 }
424 
425 
insertItem(const size_t pos,Item * & item)426 OFCondition DRTReferencedRTPlanSequence::insertItem(const size_t pos, Item *&item)
427 {
428     OFCondition result = EC_IllegalCall;
429     if (!EmptyDefaultSequence)
430     {
431         OFListIterator(Item *) iterator;
432         result = gotoItem(pos, iterator);
433         if (result.good())
434         {
435             item = new Item();
436             if (item != NULL)
437             {
438                 SequenceOfItems.insert(iterator, 1, item);
439                 result = EC_Normal;
440             } else
441                 result = EC_MemoryExhausted;
442         } else
443             result = addItem(item);
444     }
445     return result;
446 }
447 
448 
removeItem(const size_t pos)449 OFCondition DRTReferencedRTPlanSequence::removeItem(const size_t pos)
450 {
451     OFCondition result = EC_IllegalCall;
452     if (!EmptyDefaultSequence)
453     {
454         OFListIterator(Item *) iterator;
455         if (gotoItem(pos, iterator).good())
456         {
457             delete *iterator;
458             iterator = SequenceOfItems.erase(iterator);
459             result = EC_Normal;
460         } else
461             result = EC_IllegalParameter;
462     }
463     return result;
464 }
465 
466 
read(DcmItem & dataset,const OFString & card,const OFString & type,const char * moduleName)467 OFCondition DRTReferencedRTPlanSequence::read(DcmItem &dataset,
468                                               const OFString &card,
469                                               const OFString &type,
470                                               const char *moduleName)
471 {
472     OFCondition result = EC_IllegalCall;
473     if (!EmptyDefaultSequence)
474     {
475         /* re-initialize object */
476         clear();
477         /* retrieve sequence element from dataset */
478         DcmSequenceOfItems *sequence;
479         result = dataset.findAndGetSequence(DCM_ReferencedRTPlanSequence, sequence);
480         if (sequence != NULL)
481         {
482             if (checkElementValue(*sequence, card, type, result, moduleName))
483             {
484                 DcmStack stack;
485                 OFBool first = OFTrue;
486                 /* iterate over all sequence items */
487                 while (result.good() && sequence->nextObject(stack, first /*intoSub*/).good())
488                 {
489                     DcmItem *ditem = OFstatic_cast(DcmItem *, stack.top());
490                     if (ditem != NULL)
491                     {
492                         Item *item = new Item();
493                         if (item != NULL)
494                         {
495                             result = item->read(*ditem);
496                             if (result.good())
497                             {
498                                 /* append new item to the end of the list */
499                                 SequenceOfItems.push_back(item);
500                                 first = OFFalse;
501                             }
502                         } else
503                             result = EC_MemoryExhausted;
504                     } else
505                         result = EC_CorruptedData;
506                 }
507             }
508         } else {
509             DcmSequenceOfItems element(DCM_ReferencedRTPlanSequence);
510             checkElementValue(element, card, type, result, moduleName);
511         }
512     }
513     return result;
514 }
515 
516 
write(DcmItem & dataset,const OFString & card,const OFString & type,const char * moduleName)517 OFCondition DRTReferencedRTPlanSequence::write(DcmItem &dataset,
518                                                const OFString &card,
519                                                const OFString &type,
520                                                const char *moduleName)
521 {
522     OFCondition result = EC_IllegalCall;
523     if (!EmptyDefaultSequence)
524     {
525         result = EC_MemoryExhausted;
526         DcmSequenceOfItems *sequence = new DcmSequenceOfItems(DCM_ReferencedRTPlanSequence);
527         if (sequence != NULL)
528         {
529             result = EC_Normal;
530             /* an empty optional sequence is not written */
531             if ((type == "2") || !SequenceOfItems.empty())
532             {
533                 OFListIterator(Item *) iterator = SequenceOfItems.begin();
534                 const OFListConstIterator(Item *) last = SequenceOfItems.end();
535                 /* iterate over all sequence items */
536                 while (result.good() && (iterator != last))
537                 {
538                     DcmItem *item = new DcmItem();
539                     if (item != NULL)
540                     {
541                         /* append new item to the end of the sequence */
542                         result = sequence->append(item);
543                         if (result.good())
544                         {
545                             result = (*iterator)->write(*item);
546                             ++iterator;
547                         } else
548                             delete item;
549                     } else
550                         result = EC_MemoryExhausted;
551                 }
552                 if (result.good())
553                 {
554                     /* insert sequence element into the dataset */
555                     result = dataset.insert(sequence, OFTrue /*replaceOld*/);
556                 }
557                 if (DCM_dcmrtLogger.isEnabledFor(OFLogger::WARN_LOG_LEVEL))
558                     checkElementValue(*sequence, card, type, result, moduleName);
559                 if (result.good())
560                 {
561                     /* forget reference to sequence object (avoid deletion below) */
562                     sequence = NULL;
563                 }
564             }
565             else if (type == "1")
566             {
567                 /* empty type 1 sequence not allowed */
568                 result = RT_EC_InvalidValue;
569                 if (DCM_dcmrtLogger.isEnabledFor(OFLogger::WARN_LOG_LEVEL))
570                     checkElementValue(*sequence, card, type, result, moduleName);
571             }
572             /* delete sequence (if not inserted into the dataset) */
573             delete sequence;
574         }
575     }
576     return result;
577 }
578 
579 
580 // end of source file
581