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