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 DRTRequestAttributesSequence
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/drtras.h"
18
19
20 // --- item class ---
21
Item(const OFBool emptyDefaultItem)22 DRTRequestAttributesSequence::Item::Item(const OFBool emptyDefaultItem)
23 : EmptyDefaultItem(emptyDefaultItem),
24 AccessionNumber(DCM_AccessionNumber),
25 IssuerOfAccessionNumberSequence(emptyDefaultItem /*emptyDefaultSequence*/),
26 ReasonForRequestedProcedureCodeSequence(emptyDefaultItem /*emptyDefaultSequence*/),
27 ReasonForTheRequestedProcedure(DCM_ReasonForTheRequestedProcedure),
28 ReferencedStudySequence(emptyDefaultItem /*emptyDefaultSequence*/),
29 RequestedProcedureCodeSequence(emptyDefaultItem /*emptyDefaultSequence*/),
30 RequestedProcedureDescription(DCM_RequestedProcedureDescription),
31 RequestedProcedureID(DCM_RequestedProcedureID),
32 ScheduledProcedureStepDescription(DCM_ScheduledProcedureStepDescription),
33 ScheduledProcedureStepID(DCM_ScheduledProcedureStepID),
34 ScheduledProtocolCodeSequence(emptyDefaultItem /*emptyDefaultSequence*/),
35 StudyInstanceUID(DCM_StudyInstanceUID)
36 {
37 }
38
39
Item(const Item & copy)40 DRTRequestAttributesSequence::Item::Item(const Item ©)
41 : EmptyDefaultItem(copy.EmptyDefaultItem),
42 AccessionNumber(copy.AccessionNumber),
43 IssuerOfAccessionNumberSequence(copy.IssuerOfAccessionNumberSequence),
44 ReasonForRequestedProcedureCodeSequence(copy.ReasonForRequestedProcedureCodeSequence),
45 ReasonForTheRequestedProcedure(copy.ReasonForTheRequestedProcedure),
46 ReferencedStudySequence(copy.ReferencedStudySequence),
47 RequestedProcedureCodeSequence(copy.RequestedProcedureCodeSequence),
48 RequestedProcedureDescription(copy.RequestedProcedureDescription),
49 RequestedProcedureID(copy.RequestedProcedureID),
50 ScheduledProcedureStepDescription(copy.ScheduledProcedureStepDescription),
51 ScheduledProcedureStepID(copy.ScheduledProcedureStepID),
52 ScheduledProtocolCodeSequence(copy.ScheduledProtocolCodeSequence),
53 StudyInstanceUID(copy.StudyInstanceUID)
54 {
55 }
56
57
~Item()58 DRTRequestAttributesSequence::Item::~Item()
59 {
60 }
61
62
operator =(const Item & copy)63 DRTRequestAttributesSequence::Item &DRTRequestAttributesSequence::Item::operator=(const Item ©)
64 {
65 if (this != ©)
66 {
67 EmptyDefaultItem = copy.EmptyDefaultItem;
68 AccessionNumber = copy.AccessionNumber;
69 IssuerOfAccessionNumberSequence = copy.IssuerOfAccessionNumberSequence;
70 ReasonForRequestedProcedureCodeSequence = copy.ReasonForRequestedProcedureCodeSequence;
71 ReasonForTheRequestedProcedure = copy.ReasonForTheRequestedProcedure;
72 ReferencedStudySequence = copy.ReferencedStudySequence;
73 RequestedProcedureCodeSequence = copy.RequestedProcedureCodeSequence;
74 RequestedProcedureDescription = copy.RequestedProcedureDescription;
75 RequestedProcedureID = copy.RequestedProcedureID;
76 ScheduledProcedureStepDescription = copy.ScheduledProcedureStepDescription;
77 ScheduledProcedureStepID = copy.ScheduledProcedureStepID;
78 ScheduledProtocolCodeSequence = copy.ScheduledProtocolCodeSequence;
79 StudyInstanceUID = copy.StudyInstanceUID;
80 }
81 return *this;
82 }
83
84
clear()85 void DRTRequestAttributesSequence::Item::clear()
86 {
87 if (!EmptyDefaultItem)
88 {
89 /* clear all DICOM attributes */
90 RequestedProcedureID.clear();
91 AccessionNumber.clear();
92 IssuerOfAccessionNumberSequence.clear();
93 StudyInstanceUID.clear();
94 ReferencedStudySequence.clear();
95 RequestedProcedureDescription.clear();
96 RequestedProcedureCodeSequence.clear();
97 ReasonForTheRequestedProcedure.clear();
98 ReasonForRequestedProcedureCodeSequence.clear();
99 ScheduledProcedureStepID.clear();
100 ScheduledProcedureStepDescription.clear();
101 ScheduledProtocolCodeSequence.clear();
102 }
103 }
104
105
isEmpty()106 OFBool DRTRequestAttributesSequence::Item::isEmpty()
107 {
108 return RequestedProcedureID.isEmpty() &&
109 AccessionNumber.isEmpty() &&
110 IssuerOfAccessionNumberSequence.isEmpty() &&
111 StudyInstanceUID.isEmpty() &&
112 ReferencedStudySequence.isEmpty() &&
113 RequestedProcedureDescription.isEmpty() &&
114 RequestedProcedureCodeSequence.isEmpty() &&
115 ReasonForTheRequestedProcedure.isEmpty() &&
116 ReasonForRequestedProcedureCodeSequence.isEmpty() &&
117 ScheduledProcedureStepID.isEmpty() &&
118 ScheduledProcedureStepDescription.isEmpty() &&
119 ScheduledProtocolCodeSequence.isEmpty();
120 }
121
122
isValid() const123 OFBool DRTRequestAttributesSequence::Item::isValid() const
124 {
125 return !EmptyDefaultItem;
126 }
127
128
read(DcmItem & item)129 OFCondition DRTRequestAttributesSequence::Item::read(DcmItem &item)
130 {
131 OFCondition result = EC_IllegalCall;
132 if (!EmptyDefaultItem)
133 {
134 /* re-initialize object */
135 clear();
136 getAndCheckElementFromDataset(item, RequestedProcedureID, "1", "1C", "RequestAttributesSequence");
137 getAndCheckElementFromDataset(item, AccessionNumber, "1", "3", "RequestAttributesSequence");
138 IssuerOfAccessionNumberSequence.read(item, "1-n", "3", "RequestAttributesSequence");
139 getAndCheckElementFromDataset(item, StudyInstanceUID, "1", "3", "RequestAttributesSequence");
140 ReferencedStudySequence.read(item, "1-n", "3", "RequestAttributesSequence");
141 getAndCheckElementFromDataset(item, RequestedProcedureDescription, "1", "3", "RequestAttributesSequence");
142 RequestedProcedureCodeSequence.read(item, "1-n", "3", "RequestAttributesSequence");
143 getAndCheckElementFromDataset(item, ReasonForTheRequestedProcedure, "1", "3", "RequestAttributesSequence");
144 ReasonForRequestedProcedureCodeSequence.read(item, "1-n", "3", "RequestAttributesSequence");
145 getAndCheckElementFromDataset(item, ScheduledProcedureStepID, "1", "1C", "RequestAttributesSequence");
146 getAndCheckElementFromDataset(item, ScheduledProcedureStepDescription, "1", "3", "RequestAttributesSequence");
147 ScheduledProtocolCodeSequence.read(item, "1-n", "3", "RequestAttributesSequence");
148 result = EC_Normal;
149 }
150 return result;
151 }
152
153
write(DcmItem & item)154 OFCondition DRTRequestAttributesSequence::Item::write(DcmItem &item)
155 {
156 OFCondition result = EC_IllegalCall;
157 if (!EmptyDefaultItem)
158 {
159 result = EC_Normal;
160 addElementToDataset(result, item, new DcmShortString(RequestedProcedureID), "1", "1C", "RequestAttributesSequence");
161 addElementToDataset(result, item, new DcmShortString(AccessionNumber), "1", "3", "RequestAttributesSequence");
162 if (result.good()) result = IssuerOfAccessionNumberSequence.write(item, "1-n", "3", "RequestAttributesSequence");
163 addElementToDataset(result, item, new DcmUniqueIdentifier(StudyInstanceUID), "1", "3", "RequestAttributesSequence");
164 if (result.good()) result = ReferencedStudySequence.write(item, "1-n", "3", "RequestAttributesSequence");
165 addElementToDataset(result, item, new DcmLongString(RequestedProcedureDescription), "1", "3", "RequestAttributesSequence");
166 if (result.good()) result = RequestedProcedureCodeSequence.write(item, "1-n", "3", "RequestAttributesSequence");
167 addElementToDataset(result, item, new DcmLongString(ReasonForTheRequestedProcedure), "1", "3", "RequestAttributesSequence");
168 if (result.good()) result = ReasonForRequestedProcedureCodeSequence.write(item, "1-n", "3", "RequestAttributesSequence");
169 addElementToDataset(result, item, new DcmShortString(ScheduledProcedureStepID), "1", "1C", "RequestAttributesSequence");
170 addElementToDataset(result, item, new DcmLongString(ScheduledProcedureStepDescription), "1", "3", "RequestAttributesSequence");
171 if (result.good()) result = ScheduledProtocolCodeSequence.write(item, "1-n", "3", "RequestAttributesSequence");
172 }
173 return result;
174 }
175
176
getAccessionNumber(OFString & value,const signed long pos) const177 OFCondition DRTRequestAttributesSequence::Item::getAccessionNumber(OFString &value, const signed long pos) const
178 {
179 if (EmptyDefaultItem)
180 return EC_IllegalCall;
181 else
182 return getStringValueFromElement(AccessionNumber, value, pos);
183 }
184
185
getReasonForTheRequestedProcedure(OFString & value,const signed long pos) const186 OFCondition DRTRequestAttributesSequence::Item::getReasonForTheRequestedProcedure(OFString &value, const signed long pos) const
187 {
188 if (EmptyDefaultItem)
189 return EC_IllegalCall;
190 else
191 return getStringValueFromElement(ReasonForTheRequestedProcedure, value, pos);
192 }
193
194
getRequestedProcedureDescription(OFString & value,const signed long pos) const195 OFCondition DRTRequestAttributesSequence::Item::getRequestedProcedureDescription(OFString &value, const signed long pos) const
196 {
197 if (EmptyDefaultItem)
198 return EC_IllegalCall;
199 else
200 return getStringValueFromElement(RequestedProcedureDescription, value, pos);
201 }
202
203
getRequestedProcedureID(OFString & value,const signed long pos) const204 OFCondition DRTRequestAttributesSequence::Item::getRequestedProcedureID(OFString &value, const signed long pos) const
205 {
206 if (EmptyDefaultItem)
207 return EC_IllegalCall;
208 else
209 return getStringValueFromElement(RequestedProcedureID, value, pos);
210 }
211
212
getScheduledProcedureStepDescription(OFString & value,const signed long pos) const213 OFCondition DRTRequestAttributesSequence::Item::getScheduledProcedureStepDescription(OFString &value, const signed long pos) const
214 {
215 if (EmptyDefaultItem)
216 return EC_IllegalCall;
217 else
218 return getStringValueFromElement(ScheduledProcedureStepDescription, value, pos);
219 }
220
221
getScheduledProcedureStepID(OFString & value,const signed long pos) const222 OFCondition DRTRequestAttributesSequence::Item::getScheduledProcedureStepID(OFString &value, const signed long pos) const
223 {
224 if (EmptyDefaultItem)
225 return EC_IllegalCall;
226 else
227 return getStringValueFromElement(ScheduledProcedureStepID, value, pos);
228 }
229
230
getStudyInstanceUID(OFString & value,const signed long pos) const231 OFCondition DRTRequestAttributesSequence::Item::getStudyInstanceUID(OFString &value, const signed long pos) const
232 {
233 if (EmptyDefaultItem)
234 return EC_IllegalCall;
235 else
236 return getStringValueFromElement(StudyInstanceUID, value, pos);
237 }
238
239
setAccessionNumber(const OFString & value,const OFBool check)240 OFCondition DRTRequestAttributesSequence::Item::setAccessionNumber(const OFString &value, const OFBool check)
241 {
242 OFCondition result = EC_IllegalCall;
243 if (!EmptyDefaultItem)
244 {
245 result = (check) ? DcmShortString::checkStringValue(value, "1") : EC_Normal;
246 if (result.good())
247 result = AccessionNumber.putOFStringArray(value);
248 }
249 return result;
250 }
251
252
setReasonForTheRequestedProcedure(const OFString & value,const OFBool check)253 OFCondition DRTRequestAttributesSequence::Item::setReasonForTheRequestedProcedure(const OFString &value, const OFBool check)
254 {
255 OFCondition result = EC_IllegalCall;
256 if (!EmptyDefaultItem)
257 {
258 result = (check) ? DcmLongString::checkStringValue(value, "1") : EC_Normal;
259 if (result.good())
260 result = ReasonForTheRequestedProcedure.putOFStringArray(value);
261 }
262 return result;
263 }
264
265
setRequestedProcedureDescription(const OFString & value,const OFBool check)266 OFCondition DRTRequestAttributesSequence::Item::setRequestedProcedureDescription(const OFString &value, const OFBool check)
267 {
268 OFCondition result = EC_IllegalCall;
269 if (!EmptyDefaultItem)
270 {
271 result = (check) ? DcmLongString::checkStringValue(value, "1") : EC_Normal;
272 if (result.good())
273 result = RequestedProcedureDescription.putOFStringArray(value);
274 }
275 return result;
276 }
277
278
setRequestedProcedureID(const OFString & value,const OFBool check)279 OFCondition DRTRequestAttributesSequence::Item::setRequestedProcedureID(const OFString &value, const OFBool check)
280 {
281 OFCondition result = EC_IllegalCall;
282 if (!EmptyDefaultItem)
283 {
284 result = (check) ? DcmShortString::checkStringValue(value, "1") : EC_Normal;
285 if (result.good())
286 result = RequestedProcedureID.putOFStringArray(value);
287 }
288 return result;
289 }
290
291
setScheduledProcedureStepDescription(const OFString & value,const OFBool check)292 OFCondition DRTRequestAttributesSequence::Item::setScheduledProcedureStepDescription(const OFString &value, const OFBool check)
293 {
294 OFCondition result = EC_IllegalCall;
295 if (!EmptyDefaultItem)
296 {
297 result = (check) ? DcmLongString::checkStringValue(value, "1") : EC_Normal;
298 if (result.good())
299 result = ScheduledProcedureStepDescription.putOFStringArray(value);
300 }
301 return result;
302 }
303
304
setScheduledProcedureStepID(const OFString & value,const OFBool check)305 OFCondition DRTRequestAttributesSequence::Item::setScheduledProcedureStepID(const OFString &value, const OFBool check)
306 {
307 OFCondition result = EC_IllegalCall;
308 if (!EmptyDefaultItem)
309 {
310 result = (check) ? DcmShortString::checkStringValue(value, "1") : EC_Normal;
311 if (result.good())
312 result = ScheduledProcedureStepID.putOFStringArray(value);
313 }
314 return result;
315 }
316
317
setStudyInstanceUID(const OFString & value,const OFBool check)318 OFCondition DRTRequestAttributesSequence::Item::setStudyInstanceUID(const OFString &value, const OFBool check)
319 {
320 OFCondition result = EC_IllegalCall;
321 if (!EmptyDefaultItem)
322 {
323 result = (check) ? DcmUniqueIdentifier::checkStringValue(value, "1") : EC_Normal;
324 if (result.good())
325 result = StudyInstanceUID.putOFStringArray(value);
326 }
327 return result;
328 }
329
330
331 // --- sequence class ---
332
DRTRequestAttributesSequence(const OFBool emptyDefaultSequence)333 DRTRequestAttributesSequence::DRTRequestAttributesSequence(const OFBool emptyDefaultSequence)
334 : EmptyDefaultSequence(emptyDefaultSequence),
335 SequenceOfItems(),
336 CurrentItem(),
337 EmptyItem(OFTrue /*emptyDefaultItem*/)
338 {
339 CurrentItem = SequenceOfItems.end();
340 }
341
342
DRTRequestAttributesSequence(const DRTRequestAttributesSequence & copy)343 DRTRequestAttributesSequence::DRTRequestAttributesSequence(const DRTRequestAttributesSequence ©)
344 : EmptyDefaultSequence(copy.EmptyDefaultSequence),
345 SequenceOfItems(),
346 CurrentItem(),
347 EmptyItem(OFTrue /*emptyDefaultItem*/)
348 {
349 /* create a copy of the internal sequence of items */
350 Item *item = NULL;
351 OFListConstIterator(Item *) current = copy.SequenceOfItems.begin();
352 const OFListConstIterator(Item *) last = copy.SequenceOfItems.end();
353 while (current != last)
354 {
355 item = new Item(**current);
356 if (item != NULL)
357 {
358 SequenceOfItems.push_back(item);
359 } else {
360 /* memory exhausted, there is nothing we can do about it */
361 break;
362 }
363 ++current;
364 }
365 CurrentItem = SequenceOfItems.begin();
366 }
367
368
operator =(const DRTRequestAttributesSequence & copy)369 DRTRequestAttributesSequence &DRTRequestAttributesSequence::operator=(const DRTRequestAttributesSequence ©)
370 {
371 if (this != ©)
372 {
373 clear();
374 EmptyDefaultSequence = copy.EmptyDefaultSequence;
375 /* create a copy of the internal sequence of items */
376 Item *item = NULL;
377 OFListConstIterator(Item *) current = copy.SequenceOfItems.begin();
378 const OFListConstIterator(Item *) last = copy.SequenceOfItems.end();
379 while (current != last)
380 {
381 item = new Item(**current);
382 if (item != NULL)
383 {
384 SequenceOfItems.push_back(item);
385 } else {
386 /* memory exhausted, there is nothing we can do about it */
387 break;
388 }
389 ++current;
390 }
391 CurrentItem = SequenceOfItems.begin();
392 }
393 return *this;
394 }
395
396
~DRTRequestAttributesSequence()397 DRTRequestAttributesSequence::~DRTRequestAttributesSequence()
398 {
399 clear();
400 }
401
402
clear()403 void DRTRequestAttributesSequence::clear()
404 {
405 if (!EmptyDefaultSequence)
406 {
407 CurrentItem = SequenceOfItems.begin();
408 const OFListConstIterator(Item *) last = SequenceOfItems.end();
409 /* delete all items and free memory */
410 while (CurrentItem != last)
411 {
412 delete (*CurrentItem);
413 CurrentItem = SequenceOfItems.erase(CurrentItem);
414 }
415 /* make sure that the list is empty */
416 SequenceOfItems.clear();
417 CurrentItem = SequenceOfItems.end();
418 }
419 }
420
421
isEmpty()422 OFBool DRTRequestAttributesSequence::isEmpty()
423 {
424 return SequenceOfItems.empty();
425 }
426
427
isValid() const428 OFBool DRTRequestAttributesSequence::isValid() const
429 {
430 return !EmptyDefaultSequence;
431 }
432
433
getNumberOfItems() const434 size_t DRTRequestAttributesSequence::getNumberOfItems() const
435 {
436 return SequenceOfItems.size();
437 }
438
439
gotoFirstItem()440 OFCondition DRTRequestAttributesSequence::gotoFirstItem()
441 {
442 OFCondition result = EC_IllegalCall;
443 if (!SequenceOfItems.empty())
444 {
445 CurrentItem = SequenceOfItems.begin();
446 result = EC_Normal;
447 }
448 return result;
449 }
450
451
gotoNextItem()452 OFCondition DRTRequestAttributesSequence::gotoNextItem()
453 {
454 OFCondition result = EC_IllegalCall;
455 if (CurrentItem != SequenceOfItems.end())
456 {
457 ++CurrentItem;
458 result = EC_Normal;
459 }
460 return result;
461 }
462
463
gotoItem(const size_t num,OFListIterator (Item *)& iterator)464 OFCondition DRTRequestAttributesSequence::gotoItem(const size_t num, OFListIterator(Item *) &iterator)
465 {
466 OFCondition result = EC_IllegalCall;
467 if (!SequenceOfItems.empty())
468 {
469 size_t idx = num + 1;
470 iterator = SequenceOfItems.begin();
471 const OFListConstIterator(Item *) last = SequenceOfItems.end();
472 while ((--idx > 0) && (iterator != last))
473 ++iterator;
474 /* specified list item found? */
475 if ((idx == 0) && (iterator != last))
476 result = EC_Normal;
477 else
478 result = EC_IllegalParameter;
479 }
480 return result;
481 }
482
483
gotoItem(const size_t num,OFListConstIterator (Item *)& iterator) const484 OFCondition DRTRequestAttributesSequence::gotoItem(const size_t num, OFListConstIterator(Item *) &iterator) const
485 {
486 OFCondition result = EC_IllegalCall;
487 if (!SequenceOfItems.empty())
488 {
489 size_t idx = num + 1;
490 iterator = SequenceOfItems.begin();
491 const OFListConstIterator(Item *) last = SequenceOfItems.end();
492 while ((--idx > 0) && (iterator != last))
493 ++iterator;
494 /* specified list item found? */
495 if ((idx == 0) && (iterator != last))
496 result = EC_Normal;
497 else
498 result = EC_IllegalParameter;
499 }
500 return result;
501 }
502
503
gotoItem(const size_t num)504 OFCondition DRTRequestAttributesSequence::gotoItem(const size_t num)
505 {
506 return gotoItem(num, CurrentItem);
507 }
508
509
getCurrentItem(Item * & item) const510 OFCondition DRTRequestAttributesSequence::getCurrentItem(Item *&item) const
511 {
512 OFCondition result = EC_IllegalCall;
513 if (CurrentItem != SequenceOfItems.end())
514 {
515 item = *CurrentItem;
516 result = EC_Normal;
517 }
518 return result;
519 }
520
521
getCurrentItem()522 DRTRequestAttributesSequence::Item &DRTRequestAttributesSequence::getCurrentItem()
523 {
524 if (CurrentItem != SequenceOfItems.end())
525 return **CurrentItem;
526 else
527 return EmptyItem;
528 }
529
530
getCurrentItem() const531 const DRTRequestAttributesSequence::Item &DRTRequestAttributesSequence::getCurrentItem() const
532 {
533 if (CurrentItem != SequenceOfItems.end())
534 return **CurrentItem;
535 else
536 return EmptyItem;
537 }
538
539
getItem(const size_t num,Item * & item)540 OFCondition DRTRequestAttributesSequence::getItem(const size_t num, Item *&item)
541 {
542 OFListIterator(Item *) iterator;
543 OFCondition result = gotoItem(num, iterator);
544 if (result.good())
545 item = *iterator;
546 return result;
547 }
548
549
getItem(const size_t num)550 DRTRequestAttributesSequence::Item &DRTRequestAttributesSequence::getItem(const size_t num)
551 {
552 OFListIterator(Item *) iterator;
553 if (gotoItem(num, iterator).good())
554 return **iterator;
555 else
556 return EmptyItem;
557 }
558
559
getItem(const size_t num) const560 const DRTRequestAttributesSequence::Item &DRTRequestAttributesSequence::getItem(const size_t num) const
561 {
562 OFListConstIterator(Item *) iterator;
563 if (gotoItem(num, iterator).good())
564 return **iterator;
565 else
566 return EmptyItem;
567 }
568
569
operator [](const size_t num)570 DRTRequestAttributesSequence::Item &DRTRequestAttributesSequence::operator[](const size_t num)
571 {
572 return getItem(num);
573 }
574
575
operator [](const size_t num) const576 const DRTRequestAttributesSequence::Item &DRTRequestAttributesSequence::operator[](const size_t num) const
577 {
578 return getItem(num);
579 }
580
581
addItem(Item * & item)582 OFCondition DRTRequestAttributesSequence::addItem(Item *&item)
583 {
584 OFCondition result = EC_IllegalCall;
585 if (!EmptyDefaultSequence)
586 {
587 item = new Item();
588 if (item != NULL)
589 {
590 SequenceOfItems.push_back(item);
591 result = EC_Normal;
592 } else
593 result = EC_MemoryExhausted;
594 }
595 return result;
596 }
597
598
insertItem(const size_t pos,Item * & item)599 OFCondition DRTRequestAttributesSequence::insertItem(const size_t pos, Item *&item)
600 {
601 OFCondition result = EC_IllegalCall;
602 if (!EmptyDefaultSequence)
603 {
604 OFListIterator(Item *) iterator;
605 result = gotoItem(pos, iterator);
606 if (result.good())
607 {
608 item = new Item();
609 if (item != NULL)
610 {
611 SequenceOfItems.insert(iterator, 1, item);
612 result = EC_Normal;
613 } else
614 result = EC_MemoryExhausted;
615 } else
616 result = addItem(item);
617 }
618 return result;
619 }
620
621
removeItem(const size_t pos)622 OFCondition DRTRequestAttributesSequence::removeItem(const size_t pos)
623 {
624 OFCondition result = EC_IllegalCall;
625 if (!EmptyDefaultSequence)
626 {
627 OFListIterator(Item *) iterator;
628 if (gotoItem(pos, iterator).good())
629 {
630 delete *iterator;
631 iterator = SequenceOfItems.erase(iterator);
632 result = EC_Normal;
633 } else
634 result = EC_IllegalParameter;
635 }
636 return result;
637 }
638
639
read(DcmItem & dataset,const OFString & card,const OFString & type,const char * moduleName)640 OFCondition DRTRequestAttributesSequence::read(DcmItem &dataset,
641 const OFString &card,
642 const OFString &type,
643 const char *moduleName)
644 {
645 OFCondition result = EC_IllegalCall;
646 if (!EmptyDefaultSequence)
647 {
648 /* re-initialize object */
649 clear();
650 /* retrieve sequence element from dataset */
651 DcmSequenceOfItems *sequence;
652 result = dataset.findAndGetSequence(DCM_RequestAttributesSequence, sequence);
653 if (sequence != NULL)
654 {
655 if (checkElementValue(*sequence, card, type, result, moduleName))
656 {
657 DcmStack stack;
658 OFBool first = OFTrue;
659 /* iterate over all sequence items */
660 while (result.good() && sequence->nextObject(stack, first /*intoSub*/).good())
661 {
662 DcmItem *ditem = OFstatic_cast(DcmItem *, stack.top());
663 if (ditem != NULL)
664 {
665 Item *item = new Item();
666 if (item != NULL)
667 {
668 result = item->read(*ditem);
669 if (result.good())
670 {
671 /* append new item to the end of the list */
672 SequenceOfItems.push_back(item);
673 first = OFFalse;
674 }
675 } else
676 result = EC_MemoryExhausted;
677 } else
678 result = EC_CorruptedData;
679 }
680 }
681 } else {
682 DcmSequenceOfItems element(DCM_RequestAttributesSequence);
683 checkElementValue(element, card, type, result, moduleName);
684 }
685 }
686 return result;
687 }
688
689
write(DcmItem & dataset,const OFString & card,const OFString & type,const char * moduleName)690 OFCondition DRTRequestAttributesSequence::write(DcmItem &dataset,
691 const OFString &card,
692 const OFString &type,
693 const char *moduleName)
694 {
695 OFCondition result = EC_IllegalCall;
696 if (!EmptyDefaultSequence)
697 {
698 result = EC_MemoryExhausted;
699 DcmSequenceOfItems *sequence = new DcmSequenceOfItems(DCM_RequestAttributesSequence);
700 if (sequence != NULL)
701 {
702 result = EC_Normal;
703 /* an empty optional sequence is not written */
704 if ((type == "2") || !SequenceOfItems.empty())
705 {
706 OFListIterator(Item *) iterator = SequenceOfItems.begin();
707 const OFListConstIterator(Item *) last = SequenceOfItems.end();
708 /* iterate over all sequence items */
709 while (result.good() && (iterator != last))
710 {
711 DcmItem *item = new DcmItem();
712 if (item != NULL)
713 {
714 /* append new item to the end of the sequence */
715 result = sequence->append(item);
716 if (result.good())
717 {
718 result = (*iterator)->write(*item);
719 ++iterator;
720 } else
721 delete item;
722 } else
723 result = EC_MemoryExhausted;
724 }
725 if (result.good())
726 {
727 /* insert sequence element into the dataset */
728 result = dataset.insert(sequence, OFTrue /*replaceOld*/);
729 }
730 if (DCM_dcmrtLogger.isEnabledFor(OFLogger::WARN_LOG_LEVEL))
731 checkElementValue(*sequence, card, type, result, moduleName);
732 if (result.good())
733 {
734 /* forget reference to sequence object (avoid deletion below) */
735 sequence = NULL;
736 }
737 }
738 else if (type == "1")
739 {
740 /* empty type 1 sequence not allowed */
741 result = RT_EC_InvalidValue;
742 if (DCM_dcmrtLogger.isEnabledFor(OFLogger::WARN_LOG_LEVEL))
743 checkElementValue(*sequence, card, type, result, moduleName);
744 }
745 /* delete sequence (if not inserted into the dataset) */
746 delete sequence;
747 }
748 }
749 return result;
750 }
751
752
753 // end of source file
754