comparison Core/DicomParsing/FromDcmtkBridge.cpp @ 3199:9316f341e40f

unit testing json for dicomweb
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 06 Feb 2019 10:37:03 +0100
parents 7724ed267b5c
children f6374c36a671
comparison
equal deleted inserted replaced
3198:7724ed267b5c 3199:9316f341e40f
88 #include <dcmtk/dcmdata/dcvrsh.h> 88 #include <dcmtk/dcmdata/dcvrsh.h>
89 #include <dcmtk/dcmdata/dcvrsl.h> 89 #include <dcmtk/dcmdata/dcvrsl.h>
90 #include <dcmtk/dcmdata/dcvrss.h> 90 #include <dcmtk/dcmdata/dcvrss.h>
91 #include <dcmtk/dcmdata/dcvrst.h> 91 #include <dcmtk/dcmdata/dcvrst.h>
92 #include <dcmtk/dcmdata/dcvrtm.h> 92 #include <dcmtk/dcmdata/dcvrtm.h>
93 #include <dcmtk/dcmdata/dcvruc.h>
93 #include <dcmtk/dcmdata/dcvrui.h> 94 #include <dcmtk/dcmdata/dcvrui.h>
94 #include <dcmtk/dcmdata/dcvrul.h> 95 #include <dcmtk/dcmdata/dcvrul.h>
96 #include <dcmtk/dcmdata/dcvrur.h>
95 #include <dcmtk/dcmdata/dcvrus.h> 97 #include <dcmtk/dcmdata/dcvrus.h>
96 #include <dcmtk/dcmdata/dcvrut.h> 98 #include <dcmtk/dcmdata/dcvrut.h>
97 99
98 #if DCMTK_USE_EMBEDDED_DICTIONARIES == 1 100 #if DCMTK_USE_EMBEDDED_DICTIONARIES == 1
99 # include <EmbeddedResources.h> 101 # include <EmbeddedResources.h>
1287 return ValueRepresentation_LongText; 1289 return ValueRepresentation_LongText;
1288 1290
1289 case EVR_OB: 1291 case EVR_OB:
1290 return ValueRepresentation_OtherByte; 1292 return ValueRepresentation_OtherByte;
1291 1293
1292 #if DCMTK_VERSION_NUMBER >= 362 1294 #if DCMTK_VERSION_NUMBER >= 361
1293 case EVR_OD: 1295 case EVR_OD:
1294 return ValueRepresentation_OtherDouble; 1296 return ValueRepresentation_OtherDouble;
1295 #endif 1297 #endif
1296 1298
1297 case EVR_OF: 1299 case EVR_OF:
1324 return ValueRepresentation_ShortText; 1326 return ValueRepresentation_ShortText;
1325 1327
1326 case EVR_TM: 1328 case EVR_TM:
1327 return ValueRepresentation_Time; 1329 return ValueRepresentation_Time;
1328 1330
1329 #if DCMTK_VERSION_NUMBER >= 362 1331 #if DCMTK_VERSION_NUMBER >= 361
1330 case EVR_UC: 1332 case EVR_UC:
1331 return ValueRepresentation_UnlimitedCharacters; 1333 return ValueRepresentation_UnlimitedCharacters;
1332 #endif 1334 #endif
1333 1335
1334 case EVR_UI: 1336 case EVR_UI:
1338 return ValueRepresentation_UnsignedLong; 1340 return ValueRepresentation_UnsignedLong;
1339 1341
1340 case EVR_UN: 1342 case EVR_UN:
1341 return ValueRepresentation_Unknown; 1343 return ValueRepresentation_Unknown;
1342 1344
1343 #if DCMTK_VERSION_NUMBER >= 362 1345 #if DCMTK_VERSION_NUMBER >= 361
1344 case EVR_UR: 1346 case EVR_UR:
1345 return ValueRepresentation_UniversalResource; 1347 return ValueRepresentation_UniversalResource;
1346 #endif 1348 #endif
1347 1349
1348 case EVR_US: 1350 case EVR_US:
1357 } 1359 }
1358 1360
1359 1361
1360 static bool IsBinaryTag(const DcmTag& key) 1362 static bool IsBinaryTag(const DcmTag& key)
1361 { 1363 {
1362 return (key.isUnknownVR() || 1364 return (key.isUnknownVR() ||
1365 #if DCMTK_VERSION_NUMBER >= 361
1366 key.getEVR() == EVR_OD ||
1367 #endif
1368
1369 #if DCMTK_VERSION_NUMBER >= 362
1370 key.getEVR() == EVR_OL ||
1371 #endif
1363 key.getEVR() == EVR_OB || 1372 key.getEVR() == EVR_OB ||
1364 key.getEVR() == EVR_OF || 1373 key.getEVR() == EVR_OF ||
1365 key.getEVR() == EVR_OW || 1374 key.getEVR() == EVR_OW ||
1366 key.getEVR() == EVR_UN || 1375 key.getEVR() == EVR_UN ||
1367 key.getEVR() == EVR_ox); 1376 key.getEVR() == EVR_ox);
1384 1393
1385 /** 1394 /**
1386 * Binary types, handled above 1395 * Binary types, handled above
1387 **/ 1396 **/
1388 1397
1398 #if DCMTK_VERSION_NUMBER >= 361
1399 case EVR_OD:
1400 #endif
1401
1402 #if DCMTK_VERSION_NUMBER >= 362
1403 case EVR_OL:
1404 #endif
1405
1389 case EVR_OB: // other byte 1406 case EVR_OB: // other byte
1390 case EVR_OF: // other float 1407 case EVR_OF: // other float
1391 case EVR_OW: // other word 1408 case EVR_OW: // other word
1392 case EVR_UN: // unknown value representation 1409 case EVR_UN: // unknown value representation
1393 case EVR_ox: // OB or OW depending on context 1410 case EVR_ox: // OB or OW depending on context
1442 return new DcmShortString(key); 1459 return new DcmShortString(key);
1443 1460
1444 case EVR_PN: // person name 1461 case EVR_PN: // person name
1445 return new DcmPersonName(key); 1462 return new DcmPersonName(key);
1446 1463
1464 case EVR_UC: // unlimited characters
1465 return new DcmUnlimitedCharacters(key);
1466
1467 case EVR_UR: // URI/URL
1468 return new DcmUniversalResourceIdentifierOrLocator(key);
1469
1447 1470
1448 /** 1471 /**
1449 * Numerical types 1472 * Numerical types
1450 **/ 1473 **/
1451 1474
1542 DcmTag key(tag.GetGroup(), tag.GetElement()); 1565 DcmTag key(tag.GetGroup(), tag.GetElement());
1543 1566
1544 if (tag.IsPrivate() || 1567 if (tag.IsPrivate() ||
1545 IsBinaryTag(key)) 1568 IsBinaryTag(key))
1546 { 1569 {
1547 if (element.putUint8Array((const Uint8*) decoded->c_str(), decoded->size()).good()) 1570 bool ok;
1571
1572 switch (key.getEVR())
1573 {
1574 case EVR_OW:
1575 if (decoded->size() % sizeof(Uint16) != 0)
1576 {
1577 LOG(ERROR) << "A tag with OW VR must have an even number of bytes";
1578 ok = false;
1579 }
1580 else
1581 {
1582 ok = element.putUint16Array((const Uint16*) decoded->c_str(), decoded->size() / sizeof(Uint16)).good();
1583 }
1584
1585 break;
1586
1587 default:
1588 ok = element.putUint8Array((const Uint8*) decoded->c_str(), decoded->size()).good();
1589 break;
1590 }
1591
1592 if (ok)
1548 { 1593 {
1549 return; 1594 return;
1550 } 1595 }
1551 else 1596 else
1552 { 1597 {
1593 case EVR_ST: // short text 1638 case EVR_ST: // short text
1594 case EVR_LT: // long text 1639 case EVR_LT: // long text
1595 case EVR_UT: // unlimited text 1640 case EVR_UT: // unlimited text
1596 case EVR_PN: // person name 1641 case EVR_PN: // person name
1597 case EVR_UI: // unique identifier 1642 case EVR_UI: // unique identifier
1643 case EVR_UC: // unlimited characters
1644 case EVR_UR: // URI/URL
1598 { 1645 {
1599 ok = element.putString(decoded->c_str()).good(); 1646 ok = element.putString(decoded->c_str()).good();
1600 break; 1647 break;
1601 } 1648 }
1602 1649
2197 * Deal with binary data (including PixelData). 2244 * Deal with binary data (including PixelData).
2198 **/ 2245 **/
2199 2246
2200 if (evr == EVR_OB || // other byte 2247 if (evr == EVR_OB || // other byte
2201 evr == EVR_OF || // other float 2248 evr == EVR_OF || // other float
2249 #if DCMTK_VERSION_NUMBER >= 361
2250 evr == EVR_OD || // other double
2251 #endif
2202 #if DCMTK_VERSION_NUMBER >= 362 2252 #if DCMTK_VERSION_NUMBER >= 362
2203 evr == EVR_OD || // other double
2204 evr == EVR_OL || // other long 2253 evr == EVR_OL || // other long
2205 #endif 2254 #endif
2206 evr == EVR_OW || // other word 2255 evr == EVR_OW || // other word
2207 evr == EVR_UN) // unknown value representation 2256 evr == EVR_UN) // unknown value representation
2208 { 2257 {
2258 Uint16* data16 = NULL;
2209 Uint8* data = NULL; 2259 Uint8* data = NULL;
2210 2260
2211 if (element.getUint8Array(data) == EC_Normal) 2261 if (evr == EVR_OW &&
2262 element.getUint16Array(data16) == EC_Normal)
2263 {
2264 visitor.VisitBinary(parentTags, parentIndexes, tag, vr, data16, element.getLength());
2265 }
2266 else if (evr != EVR_OW &&
2267 element.getUint8Array(data) == EC_Normal)
2212 { 2268 {
2213 visitor.VisitBinary(parentTags, parentIndexes, tag, vr, data, element.getLength()); 2269 visitor.VisitBinary(parentTags, parentIndexes, tag, vr, data, element.getLength());
2214 } 2270 }
2215 else 2271 else
2216 { 2272 {