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 &copy)
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 &copy)
64 {
65     if (this != &copy)
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 &copy)
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 &copy)
370 {
371     if (this != &copy)
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