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 ©)
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 ©)
42 {
43 if (this != ©)
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 ©)
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 ©)
161 {
162 if (this != ©)
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