DYT/Tool/3rdParty_x64/include/dcmtk/dcmdata/dcddirif.h

1618 lines
81 KiB
C
Raw Normal View History

2024-11-22 15:19:31 +00:00
/*
*
* Copyright (C) 2002-2016, 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
*
* Purpose: Interface class for simplified creation of a DICOMDIR
*
*/
#ifndef DCDDIRIF_H
#define DCDDIRIF_H
#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/dcdicdir.h"
/*------------------------------------*
* constant declarations and macros *
*------------------------------------*/
// default file-set ID
#define DEFAULT_FILESETID "DCMTK_MEDIA_DEMO"
// default specific character set of file-set descriptor file
#define DEFAULT_DESCRIPTOR_CHARSET "ISO_IR 100"
/*----------------------*
* class declarations *
*----------------------*/
/** Abstract interface to plugable image support for the DICOMDIR class.
* This is an abstract base class used as an interface to access DICOM
* images from the DicomDirInterface. The implementation can be found
* in dcmjpeg/libsrc/ddpiimpl.cc (incl. JPEG support).
*/
class DCMTK_DCMDATA_EXPORT DicomDirImagePlugin
{
public:
/** destructor (virtual)
*/
virtual ~DicomDirImagePlugin() {}
/** scale image (pixel data) to specified size
* @param srcData pointer to 8 bit source pixel data (original image)
* @param srcWidth width of the source image
* @param srcHeight height of the source image
* @param dstData pointer to 8 bit destination pixel data (scaled image).
* This array needs to be allocated prior to calling this function.
* @param dstWidth width of the destination image
* @param dstHeight height of the destination image
* @return OFTrue if successful, OFFalse otherwise
*/
virtual OFBool scaleData(const Uint8 *srcData,
const unsigned int srcWidth,
const unsigned int srcHeight,
Uint8 *dstData,
const unsigned int dstWidth,
const unsigned int dstHeight) const = 0;
/** scale image (from DICOM dataset) to specified size
* @param dataset DICOM dataset where the pixel data is stored (original image)
* @param pixel pointer to 8 bit destination pixel data (scaled image).
* This array needs to be allocated prior to calling this function.
* @param count number of bytes allocated for the 'pixel' array
* @param frame index of the frame to be scaled (0..n-1)
* @param width width of the destination image
* @param height height of the destination image
* @param decompressAll always decompress complete pixel data if true
* @return OFTrue if successful, OFFalse otherwise
*/
virtual OFBool scaleImage(DcmItem *dataset,
Uint8 *pixel,
const unsigned long count,
const unsigned long frame,
const unsigned int width,
const unsigned int height,
const OFBool decompressAll = OFFalse) const = 0;
protected:
/** constructor (protected)
*/
DicomDirImagePlugin() {}
};
/** An interface class for simplified creation of a DICOMDIR.
* @note Please make sure that for all OFFilename parameters, passed to the various
* methods of this class, at least the 8-bit version of the string value is present
* since in some cases only this version is (can be) used.
*/
class DCMTK_DCMDATA_EXPORT DicomDirInterface
{
public:
/** list of supported media storage application profiles
*/
enum E_ApplicationProfile
{
/// General Purpose Interchange on CD-R or DVD-RAM Media (STD-GEN-CD/DVD-RAM)
AP_GeneralPurpose,
/// default application profile: General Purpose Interchange on CD-R or DVD-RAM Media
AP_Default = AP_GeneralPurpose,
/// General Purpose DVD Interchange with JPEG (STD-GEN-DVD-JPEG)
AP_GeneralPurposeDVDJPEG,
/// General Purpose DVD Interchange with JPEG 2000 (STD-GEN-DVD-J2K)
AP_GeneralPurposeDVDJPEG2000,
/// General Purpose BD Interchange with JPEG (STD-GEN-BD-JPEG)
AP_GeneralPurposeBDJPEG,
/// General Purpose BD Interchange with JPEG 2000 (STD-GEN-BD-J2K)
AP_GeneralPurposeBDJPEG2000,
/// General Purpose BD Interchange with MPEG2 MP\@ML (STD-GEN-BD-MPEG2-MPML)
AP_GeneralPurposeBDMPEG2MPatML,
/// General Purpose BD Interchange with MPEG2 MP\@HL (STD-GEN-BD-MPEG2-MPHL)
AP_GeneralPurposeBDMPEG2MPatHL,
/// General Purpose BD Interchange with MPEG-4 AVC/H.264 HiP\@Level4.1 (STD-GEN-BD-MPEG4-HPLV41)
AP_GeneralPurposeBDMPEG4HPatLV41,
/// General Purpose BD Interchange with MPEG-4 AVC/H.264 BD-Compatible HiP\@Level4.1 (STD-GEN-BD-MPEG4-HPLV41BD)
AP_GeneralPurposeBDMPEG4HPatLV41BD,
/// General Purpose BD Interchange with MPEG-4 AVC/H.264 HiP\@Level4.2 for 2D video (STD-GEN-BD-MPEG4-HPLV42-2D)
AP_GeneralPurposeBDMPEG4HPatLV42_2D,
/// General Purpose BD Interchange with MPEG-4 AVC/H.264 HiP\@Level4.2 for 3D video (STD-GEN-BD-MPEG4-HPLV42-3D)
AP_GeneralPurposeBDMPEG4HPatLV42_3D,
/// General Purpose BD Interchange with MPEG-4 AVC/H.264 Stereo HiP\@Level4.2 (STD-GEN-BD-MPEG4-SHPLV42)
AP_GeneralPurposeBDMPEG4StereoHPatLV42,
/// General Purpose USB and Flash Memory Interchange with JPEG (STD-GEN-USB/MMC/CF/SD-JPEG)
AP_USBandFlashJPEG,
/// General Purpose USB and Flash Memory Interchange with JPEG 2000 (STD-GEN-USB/MMC/CF/SD-J2K)
AP_USBandFlashJPEG2000,
/// General Purpose MIME Interchange Profile (STD-GEN-MIME)
AP_GeneralPurposeMIME,
/// DVD Interchange with MPEG2 MP\@ML (STD-DVD-MPEG2-MPML)
AP_MPEG2MPatMLDVD,
/// Basic Cardiac X-Ray Angiographic Studies on CD-R Media (STD-XABC-CD)
AP_BasicCardiac,
/// 1024 X-Ray Angiographic Studies on CD-R Media (STD-XA1K-CD)
AP_XrayAngiographic,
/// 1024 X-Ray Angiographic Studies on DVD Media (STD-XA1K-DVD)
AP_XrayAngiographicDVD,
/// Dental Radiograph Interchange (STD-DEN-CD)
AP_DentalRadiograph,
/// CT/MR Studies (STD-CTMR-xxxx)
AP_CTandMR,
/// Ultrasound Single Frame for Image Display (STD-US-ID-SF-xxxx)
AP_UltrasoundIDSF,
/// Ultrasound Single Frame with Spatial Calibration (STD-US-SC-SF-xxxx)
AP_UltrasoundSCSF,
/// Ultrasound Single Frame with Combined Calibration (STD-US-CC-SF-xxxx)
AP_UltrasoundCCSF,
/// Ultrasound Single & Multi-Frame for Image Display (STD-US-ID-MF-xxxx)
AP_UltrasoundIDMF,
/// Ultrasound Single & Multi-Frame with Spatial Calibration (STD-UD-SC-MF-xxxx)
AP_UltrasoundSCMF,
/// Ultrasound Single & Multi-Frame with Combined Calibration (STD-UD-CC-MF-xxxx)
AP_UltrasoundCCMF,
/// 12-lead ECG Interchange on Diskette (STD-WVFM-ECG-FD)
AP_TwelveLeadECG,
/// Hemodynamic Waveform Interchange on Diskette (STD-WVFM-HD-FD)
AP_HemodynamicWaveform
};
/** constructor (default).
* No DICOMDIR object is created by default (see methods createNewDicomDir(),
* appendToDicomDir() and updateDicomDir()).
*/
DicomDirInterface();
/** destructor (virtual).
* Free all memory allocated by this class.
*/
virtual ~DicomDirInterface();
/** reset the object to its initial state.
* That means e.g. free memory.
*/
void cleanup();
/** check whether current DICOMDIR is valid.
* That means e.g. that it can be written to a file.
* @return OFTrue if DICOMDIR is valid, OFFalse otherwise
*/
OFBool isDicomDirValid() const;
/** create a new DICOMDIR object.
* This function replaces any previously existing DICOMDIR file with the specified
* 'filename'. If the backup mode (see disableBackupMode()) is enabled, a backup
* copy ('filename' + ".BAK") is created from the existing file and automatically
* deleted after the new file has been written without any errors.
* @param profile media storage application profile to be used for the DICOMDIR
* @param filename name of the DICOMDIR file to be created (default: 'DICOMDIR').
* The filename may include a fully qualified pathname.
* @param filesetID value of the attribute FileSetID (default: 'DCMTK_MEDIA_DEMO',
* might be empty)
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition createNewDicomDir(const E_ApplicationProfile profile = AP_GeneralPurpose,
const OFFilename &filename = OFFilename(DEFAULT_DICOMDIR_NAME),
const OFString &filesetID = DEFAULT_FILESETID);
/** create a DICOMDIR object based on an existing DICOMDIR file (append).
* This function can be used to append new entries to an existing DICOMDIR file.
* If the backup mode (see disableBackupMode()) is enabled, a backup copy ('filename'
* + ".BAK") is created from the existing file and automatically deleted after the
* new file has been written without any errors.
* @param profile media storage application profile to be used for the DICOMDIR.
* NB: The same profile should be used as for the creation of the DICOMDIR file.
* @param filename name of the DICOMDIR file to be appended. The filename may
* include a fully qualified pathname.
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition appendToDicomDir(const E_ApplicationProfile profile,
const OFFilename &filename);
/** create a DICOMDIR object based on an existing DICOMDIR file (update).
* This function can be used to append new entries to and update existing entries
* in an existing DICOMDIR file.
* If the backup mode (see disableBackupMode()) is enabled, a backup copy ('filename'
* + ".BAK") is created from the existing file and automatically deleted after the
* new file has been written without any errors.
* @param profile media storage application profile to be used for the DICOMDIR
* @param filename name of the DICOMDIR file to be updated. The filename may
* include a fully qualified pathname.
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition updateDicomDir(const E_ApplicationProfile profile,
const OFFilename &filename);
/** write the current DICOMDIR object to file.
* NB: The filename has already been specified for the object creation (see above).
* @param encodingType flag, specifying the encoding with undefined or explicit length
* @param groupLength flag, specifying how to handle the group length tags
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition writeDicomDir(const E_EncodingType encodingType = EET_UndefinedLength,
const E_GrpLenEncoding groupLength = EGL_withoutGL);
/** check whether specified filename is valid. i.e. conforms to the DICOM standard
* requirements (length, number of components and proper characters). This function
* is called automatically for the following methods: checkDicomFile(), addDicomFile()
* and setFilesetDescriptor(). So usually there's no need to call it manually
* (especially not in addition to the above mentioned methods).
* @param filename filename to be checked for standard conformance
* @param allowEmpty empty filename (zero length) allowed if OFTrue
* @return OFTrue if filename is valid, OFFalse otherwise
*/
OFBool isFilenameValid(const OFFilename &filename,
const OFBool allowEmpty = OFFalse);
/** check whether given charset identifier is valid.
* Valid character sets are (see DICOM PS3.3 for details): ISO_IR 100, ISO_IR 101,
* ISO_IR 109, ISO_IR 110, ISO_IR 144, ISO_IR 127, ISO_IR 126, ISO_IR 138, ISO_IR 148,
* ISO_IR 166, ISO_IR 13, ISO_IR 192.
* @param charset character set identifier to be checked
* @return OFTrue if charset is valid, OFFalse otherwise
*/
OFBool isCharsetValid(const char *charset);
/** check whether specified DICOM file is suitable to be included into the DICOMDIR.
* This method loads the given file and checks whether it conforms to the current
* application profile. Since this check is also performed by addDicomFile() there
* is usually no need to call this method directly.
* @param filename name of the DICOM file to be checked
* @param directory directory where the DICOM file is stored (optional).
* This parameter might be useful in cases where the DICOM file is not (yet)
* stored in the final directory (i.e. "relative" to the DICOMDIR location).
* @param checkFilename flag indicating whether to check the filename with
* isFilenameValid() or not. In case where the DICOM file is copied or
* renamed after this method is called, it might be useful to disable
* this check.
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition checkDicomFile(const OFFilename &filename,
const OFFilename &directory = OFFilename(),
const OFBool checkFilename = OFTrue);
/** add specified DICOM file to the current DICOMDIR.
* This method loads the given file, checks whether it conforms to the current
* application profile and finally adds it to the DICOMDIR (in case of conformance).
* @param filename name of the DICOM file to be added
* @param directory directory where the DICOM file is stored (optional).
* This parameter might be useful in cases where the DICOM file is not (yet)
* stored in the final directory (i.e. "relative" to the DICOMDIR location).
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition addDicomFile(const OFFilename &filename,
const OFFilename &directory = OFFilename());
/** set the file-set descriptor file ID and character set.
* Prior to any internal modification both 'filename' and 'charset' are checked
* using the above checking routines. Existence of 'filename' is not checked.
* Requires a DICOMDIR object to exist (see createNewDicomDir(), appendToDicomDir()
* or updateDicomDir()).
* @param filename name of the file-set descriptor file to be set
* @param charset character set of the file-set descriptor file to be set.
* default: ISO Latin 1 ("ISO_IR 100"), use NULL or empty string to omit value.
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition setFilesetDescriptor(const char *filename,
const char *charset = DEFAULT_DESCRIPTOR_CHARSET);
/** set preferred size of the icon images.
* NB: some application profiles require a particular icon size.
* In those cases this manual setting is implicitly ignored.
* @param size size of the icon images in pixels (1..256, initial: 64)
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition setIconSize(const unsigned int size);
/** set filename prefix for alternative icon images.
* If non-empty the filename prefix is used to create the icon image from an
* externally stored PGM (portable gray map, 8 bit binary) file instead of the
* DICOM image file. The PGM filename is: 'prefix' + 'dicom_filename'. The
* image does not need to have the correct size as it is scaled automatically.
* @param prefix filename prefix (empty value to disable = default)
* @return always returns EC_Normal
*/
OFCondition setIconPrefix(const OFFilename &prefix);
/** set filename of default icon image.
* For cases that the icon image cannot be created (neither from PGM nor from
* DICOM file, respectively) a default icon (8 bit binary PGM) can be specified.
* If this image also fails to load a black icon (filled with zeros) is used.
* @param filename name of the default PGM file
* @return always returns EC_Normal
*/
OFCondition setDefaultIcon(const OFFilename &filename);
/** get current status of the "abort on first error" mode.
* See enableAbortMode() for more details.
* @return OFTrue if mode is enabled, OFFalse otherwise
*/
OFBool abortMode() const
{
return AbortMode;
}
/** get current status of the "map filenames" mode.
* See enableMapFilenamesMode() for more details.
* @return OFTrue if mode is enabled, OFFalse otherwise
*/
OFBool mapFilenamesMode() const
{
return MapFilenamesMode;
}
/** get current status of the "invent missing values" mode.
* See enableInventMode() for more details.
* @return OFTrue if mode is enabled, OFFalse otherwise
*/
OFBool inventMode() const
{
return InventMode;
}
/** get current status of the "invent missing patient ID" mode.
* See enableInventPatientIDMode() for more details.
* @return OFTrue if mode is enabled, OFFalse otherwise
*/
OFBool inventPatientIDMode() const
{
return InventPatientIDMode;
}
/** get current status of the "retired SOP class support" mode.
* See enableRetiredSOPClassSupport() for more details.
* @return OFTrue if support is enabled, OFFalse otherwise
*/
OFBool retiredSOPClassSupport() const
{
return RetiredSOPClassSupport;
}
/** get current status of the "create icon images" mode.
* See enableIconImageMode() for more details.
* @return OFTrue if mode is enabled, OFFalse otherwise
*/
OFBool iconImageMode() const
{
return IconImageMode;
}
/** get current status of the "create backup" mode.
* See disableBackupMode() for more details.
* @return OFTrue if mode is enabled, OFFalse otherwise
*/
OFBool backupMode() const
{
return BackupMode;
}
/** get current status of the "pixel encoding check" mode.
* See disableEncodingCheck() for more details.
* @return OFTrue if check is enabled, OFFalse otherwise
*/
OFBool encodingCheck() const
{
return EncodingCheck;
}
/** get current status of the "spatial resolution check" mode.
* See disableResolutionCheck() for more details.
* @return OFTrue if check is enabled, OFFalse otherwise
*/
OFBool resolutionCheck() const
{
return ResolutionCheck;
}
/** get current status of the "transfer syntax check" mode.
* See disableTransferSyntaxCheck() for more details.
* @return OFTrue if check is enabled, OFFalse otherwise
*/
OFBool transferSyntaxCheck() const
{
return TransferSyntaxCheck;
}
/** get current status of the "DICOM file format check" mode.
* See disableFileFormatCheck() for more details.
* @return OFTrue if check is enabled, OFFalse otherwise
*/
OFBool fileFormatCheck() const
{
return FileFormatCheck;
}
/** get current status of the "consistency check" mode.
* See disableConsistencyCheck() for more details.
* @return OFTrue if check is enabled, OFFalse otherwise
*/
OFBool consistencyCheck() const
{
return ConsistencyCheck;
}
/** enable/disable the "abort on first error" mode.
* If the mode is enabled, addDicomFile() reports an error message and
* returns with an error status code if something went wrong.
* Default: off, do not abort
* @param newMode enable mode if OFTrue, disable if OFFalse
* @return previously stored value
*/
OFBool enableAbortMode(const OFBool newMode = OFTrue);
/** enable/disable the "map filenames" mode.
* If the mode is enabled, filenames are automatically mapped to DICOM format
* (convert lower case to upper case characters and remove trailing period).
* Default: off, do not map filenames
* @param newMode enable mode if OFTrue, disable if OFFalse
* @return previously stored value
*/
OFBool enableMapFilenamesMode(const OFBool newMode = OFTrue);
/** enable/disable the "invent missing values" mode.
* If the mode is enabled, required DICOMDIR attributes (type 1) are
* invented when missing in the DICOM file.
* Default: off, do not invent attribute values
* @param newMode enable mode if OFTrue, disable if OFFalse
* @return previously stored value
*/
OFBool enableInventMode(const OFBool newMode = OFTrue);
/** enable/disable the "invent new patient ID" mode.
* If the mode is enabled, a new PatientID is invented in case of
* inconsistent PatientName attributes, i.e. when different patients
* share the same ID.
* Default: off, do not invent new patient ID
* @param newMode enable mode if OFTrue, disable if OFFalse
* @return previously stored value
*/
OFBool enableInventPatientIDMode(const OFBool newMode = OFTrue);
/** enable/disable the "retired SOP class support" mode.
* If the mode is enabled, retired SOP classes defined in previous editions
* of the DICOM standard are also accepted.
* Default: off, do not accept retired SOP classes
* @param newMode enable mode if OFTrue, disable if OFFalse
* @return previously stored value
*/
OFBool enableRetiredSOPClassSupport(const OFBool newMode = OFTrue);
/** enable/disable the "create icon images" mode.
* If the mode is enabled, icon images are created for each IMAGE record.
* Please note that particular application profiles (e.g. Basic Cardiac)
* require an icon images to be present. Therefore, this mode does not
* affect the icon images creation of such profiles.
* Default: off, do not create (optional) icon images
* @param newMode enable mode if OFTrue, disable if OFFalse
* @return previously stored value
*/
OFBool enableIconImageMode(const OFBool newMode = OFTrue);
/** disable/enable the "create backup file" mode.
* If this mode is disabled, no backup file of an existing DICOMDIR is created.
* However, when appending new files to an existing DICOMDIR a _temporary_
* backup file "<dicomdir>.$$$" is always created.
* Default: on, create a backup file "<dicomdir>.BAK"
* @param newMode disable mode if OFFalse, enable if OFTrue
* @return previously stored value
*/
OFBool disableBackupMode(const OFBool newMode = OFFalse);
/** disable/enable the "pixel encoding check".
* If this mode is disabled, the pixel encoding is not check for compliance
* with the selected application profile.
* Default: on, check pixel encoding (bits allocated/stored, high bit)
* @warning Please use this switch with care since the resulting DICOMDIR will
* probably violate the rules for the selected application profile.
* @param newMode disable check if OFFalse, enable if OFTrue
* @return previously stored value
*/
OFBool disableEncodingCheck(const OFBool newMode = OFFalse);
/** disable/enable the "spatial resolution check".
* If this mode is disabled, the spatial resolution is not check for compliance
* with the selected application profile.
* Default: on, check spatial resolution
* @warning Please use this switch with care since the resulting DICOMDIR will
* probably violate the rules for the selected application profile.
* @param newMode disable check if OFFalse, enable if OFTrue
* @return previously stored value
*/
OFBool disableResolutionCheck(const OFBool newMode = OFFalse);
/** disable/enable the "transfer syntax check".
* If this mode is disabled, the transfer syntax is not check for compliance
* with the selected application profile.
* Default: on, check transfer syntax
* @warning Please use this switch with care since the resulting DICOMDIR will
* probably violate the rules for the selected application profile.
* @param newMode disable check if OFFalse, enable if OFTrue
* @return previously stored value
*/
OFBool disableTransferSyntaxCheck(const OFBool newMode = OFFalse);
/** disable/enable the "DICOM file format check".
* If this mode is disabled, it is not checked whether the file to be added
* contains file meta information (according to DICOM part 10).
* Default: on, check DICOM file format
* @warning Please use this switch with care since the resulting DICOMDIR will
* violate the rules of the DICOM standard if it references files that are
* missing the file meta information.
* @param newMode disable check if OFFalse, enable if OFTrue
* @return previously stored value
*/
OFBool disableFileFormatCheck(const OFBool newMode = OFFalse);
/** disable/enable the "consistency check".
* If this mode is disabled, the consistency of newly added records with
* already existing ones is not checked (see warnAboutInconsistentAttributes()
* for details).
* Default: on, perform consistency check
* @param newMode disable check if OFFalse, enable if OFTrue
* @return previously stored value
*/
OFBool disableConsistencyCheck(const OFBool newMode = OFFalse);
/** add pluggable image support.
* NB: This plugin is required to create icon images from DICOM files!
* @param plugin pointer to an instance of the plugin implementation.
* See class DicomDirImageImplementation (dcmjpeg/include/ddpiimpl.h).
* @return OFTrue if successful, OFFalse otherwise
*/
OFBool addImageSupport(DicomDirImagePlugin *plugin);
/* -- static function -- */
/** get name/identifier associated with the given application profile
* @param profile media storage application profile
* @return name of the application profile (e.g. "STD-GEN-CD/DVD-RAM")
*/
static const char *getProfileName(const E_ApplicationProfile profile);
/** get string associated with the given directory record entry type.
* @param recordType record type
* @return text string representing the record type
*/
static OFString recordTypeToName(const E_DirRecType recordType);
protected:
/** select given application profile
* @param profile storage media application profile to be selected
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition selectApplicationProfile(const E_ApplicationProfile profile);
/** load and check DICOM file regarding the current application profile
* @param filename name of the DICOM file to be checked
* @param directory directory where the DICOM file is stored (optional)
* @param fileformat object in which the loaded data is stored
* @param checkFilename flag indicating whether to check the filename with
* isFilenameValid() or not
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition loadAndCheckDicomFile(const OFFilename &filename,
const OFFilename &directory,
DcmFileFormat &fileformat,
const OFBool checkFilename = OFTrue);
/** check SOP class and transfer syntax for compliance with current profile
* @param metainfo object where the DICOM file meta information is stored
* @param dataset object where the DICOM dataset is stored
* @param filename name of the DICOM file to be checked
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition checkSOPClassAndXfer(DcmMetaInfo *metainfo,
DcmItem *dataset,
const OFFilename &filename);
/** check attributes for compliance with Basic Cardiac application profile
* @param dataset object where the DICOM dataset is stored
* @param filename name of the DICOM file to be checked
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition checkBasicCardiacAttributes(DcmItem *dataset,
const OFFilename &filename);
/** check attributes for compliance with X-ray Angiography application profile
* @param dataset object where the DICOM dataset is stored
* @param sopClass SOP class of the DICOM data to be checked
* @param filename name of the DICOM file to be checked
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition checkXrayAngiographicAttributes(DcmItem *dataset,
const OFString &sopClass,
const OFFilename &filename);
/** check attributes for compliance with dental radiograph application profile
* @param dataset object where the DICOM dataset is stored
* @param filename name of the DICOM file to be checked
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition checkDentalRadiographAttributes(DcmItem *dataset,
const OFFilename &filename);
/** check attributes for compliance with CT and MR application profile
* @param dataset object where the DICOM dataset is stored
* @param sopClass SOP class of the DICOM data to be checked
* @param filename name of the DICOM file to be checked
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition checkCTandMRAttributes(DcmItem *dataset,
const OFString &sopClass,
const OFFilename &filename);
/** check attributes for compliance with Ultrasound application profiles
* @param dataset object where the DICOM dataset is stored
* @param transferSyntax transfer syntax of the DICOM data to be checked
* @param filename name of the DICOM file to be checked
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition checkUltrasoundAttributes(DcmItem *dataset,
const OFString &transferSyntax,
const OFFilename &filename);
/** check attributes for compliance with current application profile
* @param metainfo object where the DICOM file meta information is stored
* @param dataset object where the DICOM dataset is stored
* @param filename name of the DICOM file to be checked
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition checkMandatoryAttributes(DcmMetaInfo *metainfo,
DcmItem *dataset,
const OFFilename &filename);
/** check whether given directory record matches dataset.
* The check depends on the record type and is performed mainly based on
* the unique key defined for the particular record type (e.g. SOPInstanceUID
* for IMAGE records). For PATIENT records the PatientName may also be used
* if the PatientID is absent.
* @param record directory record to be checked
* @param dataset DICOM dataset of the current file
* @return OFTrue if record matches, OFFalse otherwise
*/
OFBool recordMatchesDataset(DcmDirectoryRecord *record,
DcmItem *dataset);
/** search for a given directory record
* @param parent higher-level structure where the records are stored
* @param recordType type of directory record to be searched for
* @param dataset DICOM dataset of the current file
* @return pointer to record if found, NULL otherwise
*/
DcmDirectoryRecord *findExistingRecord(DcmDirectoryRecord *parent,
const E_DirRecType recordType,
DcmItem* dataset);
/** create or update patient record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildPatientRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFFilename &sourceFilename);
/** create or update study record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildStudyRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFFilename &sourceFilename);
/** create or update new series record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildSeriesRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFFilename &sourceFilename);
/** create or update overlay record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildOverlayRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update modality LUT record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildModalityLutRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update VOI LUT record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildVoiLutRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update curve record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildCurveRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update structure reporting record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildStructReportRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update presentation state record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildPresentationRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update waveform record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildWaveformRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update RT dose record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildRTDoseRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update RT structure set record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildRTStructureSetRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update RT plan record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildRTPlanRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update RT treatment record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildRTTreatmentRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update stored print record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildStoredPrintRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update key object doc record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildKeyObjectDocRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update registration record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildRegistrationRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update fiducial record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildFiducialRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update raw data record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildRawDataRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update spectroscopy record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildSpectroscopyRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update encap doc record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildEncapDocRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update value map record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildValueMapRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update hanging protocol record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildHangingProtocolRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update stereometric record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildStereometricRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update palette record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildPaletteRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update surface record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildSurfaceRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update measurement record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildMeasurementRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update implant record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildImplantRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update implant group record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildImplantGroupRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update implant assy record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildImplantAssyRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update plan record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildPlanRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update surface scan record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildSurfaceScanRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update tract record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildTractRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update assessment record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildAssessmentRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create or update image record and copy required values from dataset
* @param record record to be updated, use NULL to create a new one
* @param fileformat DICOM dataset of the current file
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new or updated record, NULL if an error occurred
*/
DcmDirectoryRecord *buildImageRecord(DcmDirectoryRecord *record,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** create icon image from given PGM (portable gray map) file.
* Please note that only grayscale images in binary format are currently
* supported (magic word "P5"). Memory has to be allocated by the caller.
* @param filename name of the PGM file to be loaded
* @param pixel pointer to memory buffer where the pixel data are to be stored
* @param count number of bytes allocated for the 'pixel' memory buffer
* @param width width of the scaled icon image (in pixels )
* @param height height of the scaled icon image (in pixels)
* @return OFTrue if successful, OFFalse otherwise
*/
OFBool getIconFromFile(const OFFilename &filename,
Uint8 *pixel,
const unsigned long count,
const unsigned int width,
const unsigned int height);
/** create icon image from DICOM dataset.
* Please note that the memory buffer has to be allocated by the caller.
* @param dataset DICOM dataset from which the icon image is created
* @param pixel pointer to memory buffer where the pixel data are to be stored
* @param count number of bytes allocated for the 'pixel' memory buffer
* @param width width of the scaled icon image (in pixels )
* @param height height of the scaled icon image (in pixels)
* @return OFTrue if successful, OFFalse otherwise
*/
OFBool getIconFromDataset(DcmItem *dataset,
Uint8 *pixel,
const unsigned long count,
const unsigned int width,
const unsigned int height);
/** add icon image sequence to directory record.
* If the icon image cannot be created from the DICOM dataset and there is no
* PGM file specified (neither for the particular image not a default one) a
* black image is used instead.
* @param record directory record where the icon image is stored
* @param dataset DICOM dataset from which the icon image is possibly created
* @param size resolution of the icon image to be created (width and height)
* @param sourceFilename name of the source DICOM file
* @return EC_Normal upon success, an error code otherwise
*/
OFCondition addIconImage(DcmDirectoryRecord *record,
DcmItem *dataset,
const unsigned int size,
const OFFilename &sourceFilename);
/** add child record to a given parent record.
* A new record is only added if it does not already exist.
* @param parent parent record (add new record as a child of this one)
* @param recordType type of directory record to be created
* @param fileformat DICOM dataset containing data of the new record
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
* @return pointer to new/existing record, NULL if an error occurred
*/
DcmDirectoryRecord *addRecord(DcmDirectoryRecord *parent,
const E_DirRecType recordType,
DcmFileFormat *fileformat,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** check referenced SOP instance for consistency with a new directory record
* @param record directory record to be checked
* @param dataset DICOM dataset containing data of the new record
* @param referencedFileID value of the Referenced File ID attribute
* @param sourceFilename name of the source DICOM file
*/
OFBool checkReferencedSOPInstance(DcmDirectoryRecord *record,
DcmItem *dataset,
const OFString &referencedFileID,
const OFFilename &sourceFilename);
/** invent missing type 1 attributes for all child records (from patient level)
* @param parent invent missing attributes for all children of this record (root)
* @param recurse invent missing attributes also for lower level records if OFTrue.
* Only invent attributes for the top (patient) level if OFFalse.
*/
void inventMissingAttributes(DcmDirectoryRecord *parent,
const OFBool recurse = OFTrue);
/** invent missing type 1 attributes for all child records (from study level)
* @param parent invent missing attributes for all children of this record
*/
void inventMissingStudyLevelAttributes(DcmDirectoryRecord *parent);
/** invent missing type 1 attributes for all child records (from series level)
* @param parent invent missing attributes for all children of this record
*/
void inventMissingSeriesLevelAttributes(DcmDirectoryRecord *parent);
/** invent missing type 1 attributes for all child records (from instance level)
* @param parent invent missing attributes for all children of this record
*/
void inventMissingInstanceLevelAttributes(DcmDirectoryRecord *parent);
/** create backup of a given file
* @param filename name of the file to be backuped
*/
void createDicomDirBackup(const OFFilename &filename);
/** delete backup file if one has been created
*/
void deleteDicomDirBackup();
/** print a message that the value of a given tag is unexpected.
* The output format is: "{Error|Warning}: attribute <key.tagName()> <key>
* has other value than expected[ in file: <filename>]"
* @param key affected tag
* @param filename name of the file (optional, might be empty)
* @param errorMsg print error message if OFTrue, a warning message otherwise
*/
void printUnexpectedValueMessage(const DcmTagKey &key,
const OFFilename &filename = OFFilename(),
const OFBool errorMsg = OFTrue);
/** print an error message that a required attribute is missing/empty.
* The output format is: "Error: <error.text()>: required attribute <key.tagName()>
* <key> {empty|missing}[ in file: <filename>]"
* @param key affected tag
* @param filename name of the file (optional, might be empty)
* @param emptyMsg print "empty" if OFTrue, "missing" otherwise
*/
void printRequiredAttributeMessage(const DcmTagKey &key,
const OFFilename &filename = OFFilename(),
const OFBool emptyMsg = OFFalse);
/** print an error message that something went wrong with an attribute.
* The output format is: "Error: <error.text()>: [cannot <operation> ]<key.tagName()>
* <key>"
* @param key affected tag
* @param error status to be reported (only if ".bad()")
* @param operation name of the operation that failed (optional, might be NULL)
*/
void printAttributeErrorMessage(const DcmTagKey &key,
const OFCondition &error,
const char *operation);
/** print an error message that something went wrong with a given record.
* The output format is: "Error: <error.text()>: [cannot <operation> ]<recordType>
* directory record"
* @param error status to be reported (only if ".bad()")
* @param recordType type of directory record which caused the error
* @param operation name of the operation that failed (optional, might be NULL)
*/
void printRecordErrorMessage(const OFCondition &error,
const E_DirRecType recordType,
const char *operation);
/** copy contents of specified file
* @param fromFilename name of the file to be copied
* @param toFilename name of the new file (copy of 'fromFilename')
* @return OFTrue if successful, OFFalse otherwise
*/
OFBool copyFile(const OFFilename &fromFilename,
const OFFilename &toFilename);
/** check if all the attributes in record match the values in dataset and warn if not
* @param record directory record to be checked
* @param dataset DICOM dataset to be compared with the directory record
* @param sourceFilename name of the source DICOM file
* @param abortCheck flag indicating whether to abort on the first inconsistent record
* @return OFTrue in case of any inconsistency, OFFalse otherwise
*/
OFBool warnAboutInconsistentAttributes(DcmDirectoryRecord *record,
DcmItem *dataset,
const OFFilename &sourceFilename,
const OFBool abortCheck = OFFalse);
/** check whether given file-set ID is valid
* @param filesetID file-set ID to be checked
* @return OFTrue if ID is valid, OFFalse otherwise
*/
OFBool checkFilesetID(const OFString &filesetID);
/** check whether given tag exists in the DICOM dataset
* @param dataset DICOM dataset to be checked
* @param key tag to be searched for
* @param filename of the file (optional, report any error if non-empty)
* @return OFTrue if tag exists, OFFalse otherwise
*/
OFBool checkExists(DcmItem *dataset,
const DcmTagKey &key,
const OFFilename &filename = OFFilename());
/** check whether given tag exists with a value in the DICOM dataset
* @param dataset DICOM dataset to be checked
* @param key tag to be searched for
* @param filename of the file (optional, report any error if non-empty)
* @return OFTrue if tag exists with value, OFFalse otherwise
*/
OFBool checkExistsWithValue(DcmItem *dataset,
const DcmTagKey &key,
const OFFilename &filename = OFFilename());
/** check whether given tag exists in the DICOM dataset and has the expected string value
* @param dataset DICOM dataset to be checked
* @param key tag to be searched for
* @param value expected string value
* @param filename of the file (optional, report any error if non-empty)
* @return OFTrue if tag exists with given string value, OFFalse otherwise
*/
OFBool checkExistsWithStringValue(DcmItem *dataset,
const DcmTagKey &key,
const OFString &value,
const OFFilename &filename = OFFilename());
/** check whether given tag exists in the DICOM dataset and has the expected integer value
* @param dataset DICOM dataset to be checked
* @param key tag to be searched for
* @param value expected integer value
* @param filename of the file (optional, report any error if non-empty)
* @param reject report an "Error" if OFTrue, a "Warning" if OFFalse
* @return OFTrue if tag exists with given string value, OFFalse otherwise
*/
OFBool checkExistsWithIntegerValue(DcmItem *dataset,
const DcmTagKey &key,
const long value,
const OFFilename &filename = OFFilename(),
const OFBool reject = OFTrue);
/** check whether given tag exists in the DICOM dataset and has an integer value in the
* expected range
* @param dataset DICOM dataset to be checked
* @param key tag to be searched for
* @param min minimum integer value of the expected range
* @param max maximum integer value of the expected range
* @param filename of the file (optional, report any error if non-empty)
* @param reject report an "Error" if OFTrue, a "Warning" if OFFalse
* @return OFTrue if tag exists with given string value, OFFalse otherwise
*/
OFBool checkExistsWithMinMaxValue(DcmItem *dataset,
const DcmTagKey &key,
const long min,
const long max,
const OFFilename &filename = OFFilename(),
const OFBool reject = OFTrue);
/** get string value from dataset and report an error (if any)
* @param dataset dataset from which the string value is to be retrieved
* @param key tag of the attribute to be retrieved
* @param result string variable in which the resulting value is stored
* @param searchIntoSub flag indicating whether to do a deep search or not
* @return reference to the resulting string value (parameter 'result')
*/
OFString &getStringFromDataset(DcmItem *dataset,
const DcmTagKey &key,
OFString &result,
OFBool searchIntoSub = OFFalse);
/** get string value component from dataset and report an error (if any)
* @param dataset dataset from which the string value is to be retrieved
* @param key tag of the attribute to be retrieved
* @param result string variable in which the resulting value is stored
* @param pos index of the component in case of multi-valued elements (0..vm-1)
* @param searchIntoSub flag indicating whether to do a deep search or not
* @return reference to the resulting string value (parameter 'result')
*/
OFString &getStringComponentFromDataset(DcmItem *dataset,
const DcmTagKey &key,
OFString &result,
const unsigned long pos,
OFBool searchIntoSub = OFFalse);
/** get string value from file and report an error (if any)
* @param filename name of the file from which the string value is to be retrieved
* @param key tag of the attribute to be retrieved
* @param result string variable in which the resulting value is stored
* @param searchIntoSub flag indicating whether to do a deep search or not
* @return reference to the resulting string value (parameter 'result')
*/
OFString &getStringFromFile(const OFFilename &filename,
const DcmTagKey &key,
OFString &result,
OFBool searchIntoSub = OFFalse);
/** copy element from given dataset to directory record
* @param dataset DICOM dataset containing the original data
* @param key tag of the element to be copied
* @param record directory record to which the element is to be copied
* @param sourceFilename name of the source DICOM file
* @param optional flag indicating whether the element is optional or required
* @param copyEmpty flag indicating whether to copy an empty element (no value)
*/
void copyElement(DcmItem *dataset,
const DcmTagKey &key,
DcmDirectoryRecord *record,
const OFFilename &sourceFilename,
const OFBool optional = OFFalse,
const OFBool copyEmpty = OFTrue);
/** copy type 1C element from given dataset or first item of the given sequence
* to directory record. Typically, the SharedFunctionalGroupsSequence is used
* with this method.
* @param dataset DICOM dataset containing the original data
* @param elementKey tag of the element to be copied
* @param sequenceKey tag of the sequence element to be used in case the element
* cannot be found on the main dataset level
* @param record directory record to which the element is to be copied
* @param sourceFilename name of the source DICOM file
*/
void copyElementType1CFromDatasetOrSequenceItem(DcmItem *dataset,
const DcmTagKey &elementKey,
const DcmTagKey &sequenceKey,
DcmDirectoryRecord *record,
const OFFilename &sourceFilename);
/** copy type 1 element from given dataset to directory record
* @param dataset DICOM dataset containing the original data
* @param key tag of the element to be copied
* @param record directory record to which the element is to be copied
* @param sourceFilename name of the source DICOM file
*/
void copyElementType1(DcmItem *dataset,
const DcmTagKey &key,
DcmDirectoryRecord *record,
const OFFilename &sourceFilename)
{
copyElement(dataset, key, record, sourceFilename, OFFalse /*optional*/, OFFalse /*copyEmpty*/);
}
/** copy type 1C element from given dataset to directory record
* @param dataset DICOM dataset containing the original data
* @param key tag of the element to be copied
* @param record directory record to which the element is to be copied
* @param sourceFilename name of the source DICOM file
*/
void copyElementType1C(DcmItem *dataset,
const DcmTagKey &key,
DcmDirectoryRecord *record,
const OFFilename &sourceFilename)
{
copyElement(dataset, key, record, sourceFilename, OFTrue /*optional*/, OFFalse /*copyEmpty*/);
}
/** copy type 2 element from given dataset to directory record
* @param dataset DICOM dataset containing the original data
* @param key tag of the element to be copied
* @param record directory record to which the element is to be copied
* @param sourceFilename name of the source DICOM file
*/
void copyElementType2(DcmItem *dataset,
const DcmTagKey &key,
DcmDirectoryRecord *record,
const OFFilename &sourceFilename)
{
copyElement(dataset, key, record, sourceFilename, OFFalse /*optional*/, OFTrue /*copyEmpty*/);
}
/** copy type 3 element from given dataset to directory record
* @param dataset DICOM dataset containing the original data
* @param key tag of the element to be copied
* @param record directory record to which the element is to be copied
* @param sourceFilename name of the source DICOM file
*/
void copyElementType3(DcmItem *dataset,
const DcmTagKey &key,
DcmDirectoryRecord *record,
const OFFilename &sourceFilename)
{
copyElement(dataset, key, record, sourceFilename, OFTrue /*optional*/, OFTrue /*copyEmpty*/);
}
/** copy optional string value from given dataset to directory record
* @param dataset DICOM dataset containing the original data
* @param key tag of the element value to be copied
* @param record directory record to which the element value is to be copied
* @param sourceFilename name of the source DICOM file
* @param defaultValue default string value used in case the element is missing
* @param printWarning print warning message if element does not exist (with a value)
* and no default value is given
*/
void copyStringWithDefault(DcmItem *dataset,
const DcmTagKey &key,
DcmDirectoryRecord *record,
const OFFilename &sourceFilename,
const char *defaultValue = "",
const OFBool printWarning = OFFalse);
/** compare string attribute from dataset and record and report any deviation
* @param dataset DICOM dataset where the string value is stored
* @param datKey tag of the string value to be compared (dataset)
* @param record directory record where the string value is stored
* @param recKey tag of the string value to be compared (record)
* @param sourceFilename name of the source DICOM file
* @param errorMsg report error if true, warning message otherwise (default)
* @return OFTrue if string values are identical, OFFalse otherwise
*/
OFBool compareStringAttributes(DcmItem *dataset,
const DcmTagKey &datKey,
DcmDirectoryRecord *record,
const DcmTagKey &recKey,
const OFFilename &sourceFilename,
const OFBool errorMsg = OFFalse);
/** compare sequence attribute from dataset and record and report any deviation
* @param dataset DICOM dataset where the sequence value is stored
* @param key tag of the sequence to be compared
* @param record directory record where the sequence value is stored
* @param sourceFilename name of the source DICOM file
* @return OFTrue if sequences are identical, OFFalse otherwise
*/
OFBool compareSequenceAttributes(DcmItem *dataset,
DcmTagKey &key,
DcmDirectoryRecord *record,
const OFFilename &sourceFilename);
/** set default value (number or prefix and number) to a given tag
* @param record directory record where the elements are stored
* @param key tag of the element to be modified
* @param number numeric value to be set as a the element value
* @param prefix optional prefix to be added to the numeric value
*/
void setDefaultValue(DcmDirectoryRecord *record,
const DcmTagKey &key,
const unsigned long number,
const char *prefix = NULL);
private:
/// pointer to the current DICOMDIR object
DcmDicomDir *DicomDir;
/// pointer to the optional image plugin (required for icon image support)
DicomDirImagePlugin *ImagePlugin;
/// currently selected application profile
E_ApplicationProfile ApplicationProfile;
/// create DICOMDIR backup
OFBool BackupMode;
/// abort on first inconsistent record
OFBool AbortMode;
/// automatically map filenames
OFBool MapFilenamesMode;
/// invent missing attributes mode
OFBool InventMode;
/// invent missing patient ID mode
OFBool InventPatientIDMode;
/// support retired SOP classes
OFBool RetiredSOPClassSupport;
/// check pixel encoding
OFBool EncodingCheck;
/// check image resolution
OFBool ResolutionCheck;
/// check transfer syntax
OFBool TransferSyntaxCheck;
/// check DICOM file format
OFBool FileFormatCheck;
/// check consistency of newly added record
OFBool ConsistencyCheck;
/// create icon images
OFBool IconImageMode;
/// update existing file-set
OFBool FilesetUpdateMode;
/// name of the DICOMDIR backup file
OFFilename BackupFilename;
/// flag indicating whether a backup has been created
OFBool BackupCreated;
/// size of the optional icon image in pixels
unsigned int IconSize;
/// filename prefix for the external icon images
OFFilename IconPrefix;
/// filename of the default icon (if any)
OFFilename DefaultIcon;
/// flag indicating whether RLE decompression is supported
OFBool RLESupport;
/// flag indicating whether JPEG decompression is supported
OFBool JPEGSupport;
/// flag indicating whether JPEG 2000 decompression is supported
OFBool JP2KSupport;
/// current patient number used to invent missing attribute values
unsigned long AutoPatientNumber;
/// current study number used to invent missing attribute values
unsigned long AutoStudyNumber;
/// current series number used to invent missing attribute values
unsigned long AutoSeriesNumber;
/// current instance number used to invent missing attribute values
unsigned long AutoInstanceNumber;
/// current overlay number used to invent missing attribute values
unsigned long AutoOverlayNumber;
/// current LUT number used to invent missing attribute values
unsigned long AutoLutNumber;
/// current curve number used to invent missing attribute values
unsigned long AutoCurveNumber;
/// private undefined copy constructor
DicomDirInterface(const DicomDirInterface &obj);
/// private undefined assignment operator
DicomDirInterface &operator=(const DicomDirInterface &obj);
};
#endif