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 ©)
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 ©)
44 {
45 if (this != ©)
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 ©)
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 ©)
177 {
178 if (this != ©)
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