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 ©)
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 ©)
46 {
47 if (this != ©)
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 ©)
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 ©)
197 {
198 if (this != ©)
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