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