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