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