1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
/*
*
* Copyright (C) 2011-2015, OFFIS e.V.
* All rights reserved. See COPYRIGHT file for details.
*
* This software and supporting documentation were developed by
*
* OFFIS e.V.
* R&D Division Health
* Escherweg 2
* D-26121 Oldenburg, Germany
*
*
* Module: dcmdata
*
* Author: Joerg Riesmeier, Michael Onken
*
* Purpose: Static helper functionality for dcmdata module
*
*/
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
#include "dcmtk/dcmdata/dcdatutl.h"
#include "dcmtk/dcmdata/dctypes.h"
#include "dcmtk/dcmdata/dcdeftag.h"
#include "dcmtk/dcmdata/dcmetinf.h"
#include "dcmtk/dcmdata/dcfilefo.h"
// --- static helpers ---
OFCondition DcmDataUtil::getSOPInstanceFromFile(const OFFilename &filename,
OFString &sopClassUID,
OFString &sopInstanceUID,
OFString &transferSyntaxUID,
const E_FileReadMode readMode)
{
OFCondition status = EC_IllegalParameter;
if (!filename.isEmpty())
{
DCMDATA_DEBUG("getting SOP Class UID, SOP Instance UID and Transfer Syntax UID from DICOM file");
sopClassUID.clear();
sopInstanceUID.clear();
transferSyntaxUID.clear();
// prefer to load file meta information header only (since this is more efficient)
if (readMode != ERM_dataset)
{
DcmMetaInfo metaInfo;
status = metaInfo.loadFile(filename);
if (status.good())
{
// try to get the UIDs from the meta-header
DCMDATA_DEBUG("trying to get SOP Class UID, SOP Instance UID and Transfer Syntax UID from meta-header");
metaInfo.findAndGetOFStringArray(DCM_MediaStorageSOPClassUID, sopClassUID);
metaInfo.findAndGetOFStringArray(DCM_MediaStorageSOPInstanceUID, sopInstanceUID);
metaInfo.findAndGetOFStringArray(DCM_TransferSyntaxUID, transferSyntaxUID);
}
}
// alternatively, get UIDs from the dataset (if required and desired)
if ((readMode != ERM_fileOnly) && (readMode != ERM_metaOnly))
{
if (sopClassUID.empty() || sopInstanceUID.empty())
DCMDATA_DEBUG("no SOP Class UID and/or SOP Instance UID found in meta-header, checking dataset instead");
if (status.bad() || sopClassUID.empty() || sopInstanceUID.empty() || transferSyntaxUID.empty())
{
DcmFileFormat fileformat;
status = fileformat.loadFile(filename, EXS_Unknown, EGL_noChange, 256 /* maxReadLength */, readMode);
if (status.good())
{
DcmDataset *dataset = fileformat.getDataset();
if (dataset != NULL)
{
if (sopClassUID.empty())
dataset->findAndGetOFStringArray(DCM_SOPClassUID, sopClassUID);
if (sopInstanceUID.empty())
dataset->findAndGetOFStringArray(DCM_SOPInstanceUID, sopInstanceUID);
if (transferSyntaxUID.empty())
{
DCMDATA_DEBUG("no Transfer Syntax UID found in meta-header, trying to determine from dataset instead");
// empty string in case of unknown/unsupported transfer syntax
transferSyntaxUID = DcmXfer(dataset->getOriginalXfer()).getXferID();
}
}
}
}
}
}
return status;
}
OFCondition DcmDataUtil::getSOPInstanceFromDataset(DcmDataset *dataset,
const E_TransferSyntax datasetXfer,
OFString &sopClassUID,
OFString &sopInstanceUID,
OFString &transferSyntaxUID)
{
OFCondition status = EC_IllegalParameter;
// check for invalid dataset pointer
if (dataset != NULL)
{
DCMDATA_DEBUG("getting SOP Class UID, SOP Instance UID and Transfer Syntax UID from DICOM dataset");
sopClassUID.clear();
sopInstanceUID.clear();
transferSyntaxUID.clear();
// check for correct class type
if (dataset->ident() == EVR_dataset)
{
// try to determine the transfer syntax of the dataset
E_TransferSyntax xfer = datasetXfer;
if (xfer == EXS_Unknown)
xfer = dataset->getOriginalXfer();
if (xfer == EXS_Unknown)
{
// update the internally stored transfer syntax based on the pixel data (if any)
dataset->updateOriginalXfer();
xfer = dataset->getOriginalXfer();
}
if (xfer != EXS_Unknown)
{
status = EC_Normal;
// store UID of the transfers syntax in result variable
transferSyntaxUID = DcmXfer(xfer).getXferID();
// get other UIDs directly from the dataset
dataset->findAndGetOFStringArray(DCM_SOPClassUID, sopClassUID);
dataset->findAndGetOFStringArray(DCM_SOPInstanceUID, sopInstanceUID);
} else {
DCMDATA_DEBUG("unable to determine transfer syntax from dataset");
status = EC_UnknownTransferSyntax;
}
} else
status = EC_CorruptedData;
}
return status;
}
|