comparison Plugins/Engine/OrthancPlugins.cpp @ 1843:d10a8164da5f

ensure images returned to plugins are writable
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 30 Nov 2015 13:50:21 +0100
parents 697ae8d0e287
children 559956d5ceb2
comparison
equal deleted inserted replaced
1842:697ae8d0e287 1843:d10a8164da5f
1261 1261
1262 CopyToMemoryBuffer(*p.target, result); 1262 CopyToMemoryBuffer(*p.target, result);
1263 } 1263 }
1264 1264
1265 1265
1266 static OrthancPluginImage* ReturnImage(std::auto_ptr<ImageAccessor>& image)
1267 {
1268 // Images returned to plugins are assumed to be writeable. If the
1269 // input image is read-only, we return a copy so that it can be modified.
1270
1271 if (image->IsReadOnly())
1272 {
1273 std::auto_ptr<Image> copy(new Image(image->GetFormat(), image->GetWidth(), image->GetHeight()));
1274 ImageProcessing::Copy(*copy, *image);
1275 image.reset(NULL);
1276 return reinterpret_cast<OrthancPluginImage*>(copy.release());
1277 }
1278 else
1279 {
1280 return reinterpret_cast<OrthancPluginImage*>(image.release());
1281 }
1282 }
1283
1284
1266 void OrthancPlugins::UncompressImage(const void* parameters) 1285 void OrthancPlugins::UncompressImage(const void* parameters)
1267 { 1286 {
1268 const _OrthancPluginUncompressImage& p = *reinterpret_cast<const _OrthancPluginUncompressImage*>(parameters); 1287 const _OrthancPluginUncompressImage& p = *reinterpret_cast<const _OrthancPluginUncompressImage*>(parameters);
1269 1288
1270 std::auto_ptr<ImageAccessor> image; 1289 std::auto_ptr<ImageAccessor> image;
1294 1313
1295 default: 1314 default:
1296 throw OrthancException(ErrorCode_ParameterOutOfRange); 1315 throw OrthancException(ErrorCode_ParameterOutOfRange);
1297 } 1316 }
1298 1317
1299 *(p.target) = reinterpret_cast<OrthancPluginImage*>(image.release()); 1318 *(p.target) = ReturnImage(image);
1300 } 1319 }
1301 1320
1302 1321
1303 void OrthancPlugins::CompressImage(const void* parameters) 1322 void OrthancPlugins::CompressImage(const void* parameters)
1304 { 1323 {
1384 const ImageAccessor& source = *reinterpret_cast<const ImageAccessor*>(p.source); 1403 const ImageAccessor& source = *reinterpret_cast<const ImageAccessor*>(p.source);
1385 1404
1386 std::auto_ptr<ImageAccessor> target(new Image(Plugins::Convert(p.targetFormat), source.GetWidth(), source.GetHeight())); 1405 std::auto_ptr<ImageAccessor> target(new Image(Plugins::Convert(p.targetFormat), source.GetWidth(), source.GetHeight()));
1387 ImageProcessing::Convert(*target, source); 1406 ImageProcessing::Convert(*target, source);
1388 1407
1389 *(p.target) = reinterpret_cast<OrthancPluginImage*>(target.release()); 1408 *(p.target) = ReturnImage(target);
1390 } 1409 }
1391 1410
1392 1411
1393 1412
1394 void OrthancPlugins::GetFontInfo(const void* parameters) 1413 void OrthancPlugins::GetFontInfo(const void* parameters)
1548 1567
1549 default: 1568 default:
1550 throw OrthancException(ErrorCode_InternalError); 1569 throw OrthancException(ErrorCode_InternalError);
1551 } 1570 }
1552 1571
1553 *(p.target) = reinterpret_cast<OrthancPluginImage*>(result.release()); 1572 *(p.target) = ReturnImage(result);
1554 } 1573 }
1555 1574
1556 1575
1557 void OrthancPlugins::DatabaseAnswer(const void* parameters) 1576 void OrthancPlugins::DatabaseAnswer(const void* parameters)
1558 { 1577 {
1962 } 1981 }
1963 1982
1964 case _OrthancPluginService_GetImageBuffer: 1983 case _OrthancPluginService_GetImageBuffer:
1965 { 1984 {
1966 const _OrthancPluginGetImageInfo& p = *reinterpret_cast<const _OrthancPluginGetImageInfo*>(parameters); 1985 const _OrthancPluginGetImageInfo& p = *reinterpret_cast<const _OrthancPluginGetImageInfo*>(parameters);
1967 const ImageAccessor& image = reinterpret_cast<const ImageAccessor&>(p.image); 1986 *(p.resultBuffer) = reinterpret_cast<const ImageAccessor*>(p.image)->GetBuffer();
1968
1969 if (image.IsReadOnly())
1970 {
1971 throw OrthancException(ErrorCode_ReadOnly);
1972 }
1973
1974 *(p.resultBuffer) = image.GetBuffer();
1975 return true; 1987 return true;
1976 } 1988 }
1977 1989
1978 case _OrthancPluginService_FreeImage: 1990 case _OrthancPluginService_FreeImage:
1979 { 1991 {
2291 pluginImage != NULL) 2303 pluginImage != NULL)
2292 { 2304 {
2293 return reinterpret_cast<ImageAccessor*>(pluginImage); 2305 return reinterpret_cast<ImageAccessor*>(pluginImage);
2294 } 2306 }
2295 2307
2296 LOG(WARNING) << "The custom image decoder cannot handle an image, trying with the built-in decoder"; 2308 LOG(WARNING) << "The custom image decoder cannot handle an image, fallback to the built-in decoder";
2297 } 2309 }
2298 } 2310 }
2299 2311
2300 DicomImageDecoder defaultDecoder; 2312 DicomImageDecoder defaultDecoder;
2301 return defaultDecoder.Decode(dicom, frame); 2313 return defaultDecoder.Decode(dicom, frame);