/*
 *
 *  Copyright (C) 1998-2019, 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: dcmsign
 *
 *  Author: Norbert Loxen, Marco Eichelberg
 *
 *  Purpose:
 *    classes: SiCreatorProfile
 *
 */

#include "dcmtk/config/osconfig.h"

#ifdef WITH_OPENSSL

#include "dcmtk/dcmsign/sicreapr.h"
#include "dcmtk/dcmdata/dcdeftag.h"
#include "dcmtk/dcmdata/dcitem.h"
#include "dcmtk/dcmsign/sitypes.h"

SiCreatorProfile::SiCreatorProfile()
: containsRawData_(OFFalse)
{
}

OFBool SiCreatorProfile::attributeRequiredIfPresent(const DcmTagKey& key) const
{
  // This list of attribute tags was extracted from DICOM 2019c.
  // Attribute tags occuring in multiple modules were commented out
  // but remain in the source code to simplify a comparison with the
  // module tables in a later edition of the DICOM standard.

  // The following attributes must be included in the signature if present
  // according to the Creator RSA Digital Signature Profile
  // (DICOM Part 15, section C.2):

  // the SOP Class and Instance UIDs
  if (key == DCM_SOPClassUID) return OFTrue;
  if (key == DCM_SOPInstanceUID) return OFTrue;

  // the SOP Creation Date and Time, if present
  if (key == DCM_InstanceCreationDate) return OFTrue;
  if (key == DCM_InstanceCreationTime) return OFTrue;

  // the Study and Series Instance UIDs
  if (key == DCM_StudyInstanceUID) return OFTrue;
  if (key == DCM_SeriesInstanceUID) return OFTrue;

  // any attributes of the General Equipment Module that are present
  if (key == DCM_Manufacturer) return OFTrue;
  if (key == DCM_InstitutionName) return OFTrue;
  if (key == DCM_InstitutionAddress) return OFTrue;
  if (key == DCM_StationName) return OFTrue;
  if (key == DCM_InstitutionalDepartmentName) return OFTrue;
  if (key == DCM_InstitutionalDepartmentTypeCodeSequence) return OFTrue;
  if (key == DCM_ManufacturerModelName) return OFTrue;
  if (key == DCM_DeviceSerialNumber) return OFTrue;
  if (key == DCM_SoftwareVersions) return OFTrue;
  if (key == DCM_GantryID) return OFTrue;
  if (key == DCM_UDISequence) return OFTrue;
  if (key == DCM_DeviceUID) return OFTrue;
  if (key == DCM_SpatialResolution) return OFTrue;
  if (key == DCM_DateOfLastCalibration) return OFTrue;
  if (key == DCM_TimeOfLastCalibration) return OFTrue;
  if (key == DCM_PixelPaddingValue) return OFTrue;

  // any attributes of the Overlay Plane Module that are present
  if (key == DCM_OverlayRows) return OFTrue;
  if (key == DCM_OverlayColumns) return OFTrue;
  if (key == DCM_OverlayType) return OFTrue;
  if (key == DCM_OverlayOrigin) return OFTrue;
  if (key == DCM_OverlayBitsAllocated) return OFTrue;
  if (key == DCM_OverlayBitPosition) return OFTrue;
  if (key == DCM_OverlayData) return OFTrue;
  if (key == DCM_OverlayDescription) return OFTrue;
  if (key == DCM_OverlaySubtype) return OFTrue;
  if (key == DCM_OverlayLabel) return OFTrue;
  if (key == DCM_ROIArea) return OFTrue;
  if (key == DCM_ROIMean) return OFTrue;
  if (key == DCM_ROIStandardDeviation) return OFTrue;

  // any attributes of the Curve Module that are present
  if ((key.getGroup() >= 0x5000) && (key.getGroup() < 0x5020) && ((key.getGroup() & 1) == 0))
  {
    switch (key.getElement())
    {
      case 0x0005: // CurveDimensions (retired)
      case 0x0010: // NumberOfPoints (retired)
      case 0x0103: // DataValueRepresentation (retired)
      case 0x3000: // CurveData (retired)
      case 0x0022: // CurveDescription (retired)
      case 0x0030: // AxisUnits (retired)
      case 0x0040: // AxisLabels (retired)
      case 0x0104: // MinimumCoordinateValue (retired)
      case 0x0105: // MaximumCoordinateValue (retired)
      case 0x0106: // CurveRange (retired)
      case 0x0110: // CurveDataDescriptor (retired)
      case 0x0112: // CoordinateStartValue (retired)
      case 0x0114: // CoordinateStepValue (retired)
      case 0x2500: // CurveLabel (retired)
      case 0x2600: // ReferencedOverlaySequence (retired)
        return OFTrue;
        break;
      default:
        /* nothing */
        break;
    }
  }

  // any attributes of the Graphic Annotation Module that are present
  if (key == DCM_GraphicAnnotationSequence) return OFTrue;

  // any attributes of the General Image Module that are present
  if (key == DCM_InstanceNumber) return OFTrue;
  if (key == DCM_PatientOrientation) return OFTrue;
  if (key == DCM_ContentDate) return OFTrue;
  if (key == DCM_ContentTime) return OFTrue;
  if (key == DCM_ImageType) return OFTrue;
  if (key == DCM_AcquisitionNumber) return OFTrue;
  if (key == DCM_AcquisitionDate) return OFTrue;
  if (key == DCM_AcquisitionTime) return OFTrue;
  if (key == DCM_AcquisitionDateTime) return OFTrue;
  if (key == DCM_ImagesInAcquisition) return OFTrue;
  if (key == DCM_ImageComments) return OFTrue;
  if (key == DCM_QualityControlImage) return OFTrue;
  if (key == DCM_BurnedInAnnotation) return OFTrue;
  if (key == DCM_RecognizableVisualFeatures) return OFTrue;
  if (key == DCM_LossyImageCompression) return OFTrue;
  if (key == DCM_LossyImageCompressionRatio) return OFTrue;
  if (key == DCM_LossyImageCompressionMethod) return OFTrue;
  if (key == DCM_IconImageSequence) return OFTrue;
  if (key == DCM_PresentationLUTShape) return OFTrue;
  if (key == DCM_IrradiationEventUID) return OFTrue;
  if (key == DCM_RealWorldValueMappingSequence) return OFTrue;
  if (key == DCM_ImageLaterality) return OFTrue;
  if (key == DCM_AnatomicRegionSequence) return OFTrue;
  if (key == DCM_PrimaryAnatomicStructureSequence) return OFTrue;

  // any attributes of the Image Pixel Module that are present
  if (key == DCM_SamplesPerPixel) return OFTrue;
  if (key == DCM_PhotometricInterpretation) return OFTrue;
  if (key == DCM_Rows) return OFTrue;
  if (key == DCM_Columns) return OFTrue;
  if (key == DCM_BitsAllocated) return OFTrue;
  if (key == DCM_BitsStored) return OFTrue;
  if (key == DCM_HighBit) return OFTrue;
  if (key == DCM_PixelRepresentation) return OFTrue;
  if (key == DCM_PlanarConfiguration) return OFTrue;
  if (key == DCM_PixelAspectRatio) return OFTrue;
  if (key == DCM_SmallestImagePixelValue) return OFTrue;
  if (key == DCM_LargestImagePixelValue) return OFTrue;
  if (key == DCM_RedPaletteColorLookupTableDescriptor) return OFTrue;
  if (key == DCM_GreenPaletteColorLookupTableDescriptor) return OFTrue;
  if (key == DCM_BluePaletteColorLookupTableDescriptor) return OFTrue;
  if (key == DCM_RedPaletteColorLookupTableData) return OFTrue;
  if (key == DCM_GreenPaletteColorLookupTableData) return OFTrue;
  if (key == DCM_BluePaletteColorLookupTableData) return OFTrue;
  if (key == DCM_ICCProfile) return OFTrue;
  if (key == DCM_ColorSpace) return OFTrue;
  if (key == DCM_PixelData) return OFTrue;
  if (key == DCM_PixelDataProviderURL) return OFTrue;
  if (key == DCM_PixelPaddingRangeLimit) return OFTrue;
  if (key == DCM_ExtendedOffsetTable) return OFTrue;
  if (key == DCM_ExtendedOffsetTableLengths) return OFTrue;

  // any attributes of the SR Document General Module that are present
  // if (key == DCM_InstanceNumber) return OFTrue; // also in General Image Module
  if (key == DCM_PreliminaryFlag) return OFTrue;
  if (key == DCM_CompletionFlag) return OFTrue;
  if (key == DCM_CompletionFlagDescription) return OFTrue;
  if (key == DCM_VerificationFlag) return OFTrue;
  // if (key == DCM_ContentDate) return OFTrue; // also in General Image Module
  // if (key == DCM_ContentTime) return OFTrue; // also in General Image Module
  if (key == DCM_VerifyingObserverSequence) return OFTrue;
  if (key == DCM_AuthorObserverSequence) return OFTrue;
  if (key == DCM_ParticipantSequence) return OFTrue;
  if (key == DCM_CustodialOrganizationSequence) return OFTrue;
  if (key == DCM_PredecessorDocumentsSequence) return OFTrue;
  if (key == DCM_IdenticalDocumentsSequence) return OFTrue;
  if (key == DCM_ReferencedRequestSequence) return OFTrue;
  if (key == DCM_PerformedProcedureCodeSequence) return OFTrue;
  if (key == DCM_CurrentRequestedProcedureEvidenceSequence) return OFTrue;
  if (key == DCM_PertinentOtherEvidenceSequence) return OFTrue;
  if (key == DCM_ReferencedInstanceSequence) return OFTrue;

  // any attributes of the SR Document Content Module that are present
  if (key == DCM_ValueType) return OFTrue;
  if (key == DCM_ConceptNameCodeSequence) return OFTrue;
  if (key == DCM_ContinuityOfContent) return OFTrue;
  if (key == DCM_ContentTemplateSequence) return OFTrue;
  if (key == DCM_ObservationDateTime) return OFTrue;
  if (key == DCM_ObservationUID) return OFTrue;
  if (key == DCM_ContentSequence) return OFTrue;

  // any attributes of the Waveform Module that are present
  if (key == DCM_WaveformSequence) return OFTrue;
  if (key == DCM_WaveformDataDisplayScale) return OFTrue;
  if (key == DCM_WaveformDisplayBackgroundCIELabValue) return OFTrue;
  if (key == DCM_WaveformPresentationGroupSequence) return OFTrue;

  // any attributes of the Waveform Annotation Module that are present
  if (key == DCM_WaveformAnnotationSequence) return OFTrue;

  // any attributes of the Multi-frame Functional Groups Module that are present
  if (key == DCM_SharedFunctionalGroupsSequence) return OFTrue;
  if (key == DCM_PerFrameFunctionalGroupsSequence) return OFTrue;
  // if (key == DCM_InstanceNumber) return OFTrue; // also in General Image Module
  // if (key == DCM_ContentDate) return OFTrue; // also in General Image Module
  // if (key == DCM_ContentTime) return OFTrue; // also in General Image Module
  if (key == DCM_NumberOfFrames) return OFTrue;
  if (key == DCM_StereoPairsPresent) return OFTrue;
  if (key == DCM_ConcatenationFrameOffsetNumber) return OFTrue;
  if (key == DCM_RepresentativeFrameNumber) return OFTrue;
  if (key == DCM_ConcatenationUID) return OFTrue;
  if (key == DCM_SOPInstanceUIDOfConcatenationSource) return OFTrue;
  if (key == DCM_InConcatenationNumber) return OFTrue;
  if (key == DCM_InConcatenationTotalNumber) return OFTrue;

  // any attributes of the Enhanced MR Image Module that are present
  // if (key == DCM_AcquisitionNumber) return OFTrue; // also in General Image Module
  // if (key == DCM_AcquisitionDateTime) return OFTrue; // also in General Image Module
  if (key == DCM_AcquisitionDuration) return OFTrue;
  if (key == DCM_ReferencedRawDataSequence) return OFTrue;
  if (key == DCM_ReferencedWaveformSequence) return OFTrue;
  if (key == DCM_ReferencedImageEvidenceSequence) return OFTrue;
  if (key == DCM_SourceImageEvidenceSequence) return OFTrue;
  if (key == DCM_ReferencedPresentationStateSequence) return OFTrue;
  if (key == DCM_ContentQualification) return OFTrue;
  if (key == DCM_ResonantNucleus) return OFTrue;
  if (key == DCM_KSpaceFiltering) return OFTrue;
  if (key == DCM_MagneticFieldStrength) return OFTrue;
  if (key == DCM_ApplicableSafetyStandardAgency) return OFTrue;
  if (key == DCM_ApplicableSafetyStandardDescription) return OFTrue;
  // if (key == DCM_ImageComments) return OFTrue; // also in General Image Module
  if (key == DCM_IsocenterPosition) return OFTrue;
  if (key == DCM_B1rms) return OFTrue;
  // if (key == DCM_ImageType) return OFTrue; // also in General Image Module
  if (key == DCM_PixelPresentation) return OFTrue;
  if (key == DCM_VolumetricProperties) return OFTrue;
  if (key == DCM_VolumeBasedCalculationTechnique) return OFTrue;
  if (key == DCM_ComplexImageComponent) return OFTrue;
  if (key == DCM_AcquisitionContrast) return OFTrue;
  if (key == DCM_FunctionalSettlingPhaseFramesPresent) return OFTrue;
  // if (key == DCM_SamplesPerPixel) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_PhotometricInterpretation) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BitsAllocated) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BitsStored) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_HighBit) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_PixelRepresentation) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_PlanarConfiguration) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BurnedInAnnotation) return OFTrue; // also in General Image Module
  // if (key == DCM_RecognizableVisualFeatures) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompression) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionRatio) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionMethod) return OFTrue; // also in General Image Module
  // if (key == DCM_PresentationLUTShape) return OFTrue; // also in General Image Module
  // if (key == DCM_IconImageSequence) return OFTrue; // also in General Image Module
  if (key == DCM_ViewCodeSequence) return OFTrue;
  if (key == DCM_SliceProgressionDirection) return OFTrue;

  // any attributes of the MR Spectroscopy Module that are present
  // if (key == DCM_AcquisitionNumber) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_AcquisitionDateTime) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_AcquisitionDuration) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ReferencedRawDataSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ReferencedWaveformSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ReferencedImageEvidenceSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_SourceImageEvidenceSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ReferencedPresentationStateSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ContentQualification) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ResonantNucleus) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_k-SpaceFiltering) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_MagneticFieldStrength) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ApplicableSafetyStandardAgency) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ApplicableSafetyStandardDescription) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ImageComments) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_IsocenterPosition) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_B1rms) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ImageType) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_VolumetricProperties) return OFTrue; // also in Enhanced MR Image Module
  // if (key == DCM_VolumeBasedCalculationTechnique) return OFTrue; // also in Enhanced MR Image Module
  // if (key == DCM_ComplexImageComponent) return OFTrue; // also in Enhanced MR Image Module
  // if (key == DCM_AcquisitionContrast) return OFTrue; // also in Enhanced MR Image Module
  if (key == DCM_TransmitterFrequency) return OFTrue;
  if (key == DCM_SpectralWidth) return OFTrue;
  if (key == DCM_ChemicalShiftReference) return OFTrue;
  if (key == DCM_VolumeLocalizationTechnique) return OFTrue;
  if (key == DCM_VolumeLocalizationSequence) return OFTrue;
  if (key == DCM_Decoupling) return OFTrue;
  if (key == DCM_DecoupledNucleus) return OFTrue;
  if (key == DCM_DecouplingFrequency) return OFTrue;
  if (key == DCM_DecouplingMethod) return OFTrue;
  if (key == DCM_DecouplingChemicalShiftReference) return OFTrue;
  if (key == DCM_TimeDomainFiltering) return OFTrue;
  if (key == DCM_NumberOfZeroFills) return OFTrue;
  if (key == DCM_BaselineCorrection) return OFTrue;
  if (key == DCM_FrequencyCorrection) return OFTrue;
  if (key == DCM_FirstOrderPhaseCorrection) return OFTrue;
  if (key == DCM_WaterReferencedPhaseCorrection) return OFTrue;
  if (key == DCM_WaterReferenceAcquisition) return OFTrue;
  // if (key == DCM_ReferencedInstanceSequence) return OFTrue; // also in SR Document General Module

  // any attributes of the Raw Data Module that are present
  // if (key == DCM_InstanceNumber) return OFTrue; // also in General Image Module
  // if (key == DCM_ContentDate) return OFTrue; // also in General Image Module
  // if (key == DCM_ContentTime) return OFTrue; // also in General Image Module
  // if (key == DCM_AcquisitionDateTime) return OFTrue; // also in General Image Module
  if (key == DCM_ContentLabel) return OFTrue;
  if (key == DCM_ContentDescription) return OFTrue;
  // if (key == DCM_ConceptNameCodeSequence) return OFTrue; // also in SR Document Content Module
  // if (key == DCM_ImageLaterality) return OFTrue; // also in General Image Module
  if (key == DCM_CreatorVersionUID) return OFTrue;
  // if (key == DCM_ReferencedInstanceSequence) return OFTrue; // also in SR Document General Module

  // if the Raw Data Module is present, we need to include all private tags into
  // signature because the raw data as such is stored in private attributes.
  if (((key.getGroup() & 1) == 1) && containsRawData_) return OFTrue;

  // any attributes of the Enhanced CT Image Module that are present
  // if (key == DCM_ImageType) return OFTrue; // also in General Image Module
  if (key == DCM_MultienergyCTAcquisition) return OFTrue;
  // if (key == DCM_AcquisitionNumber) return OFTrue; // also in General Image Module
  // if (key == DCM_AcquisitionDateTime) return OFTrue; // also in General Image Module
  // if (key == DCM_AcquisitionDuration) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ReferencedRawDataSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ReferencedWaveformSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ReferencedImageEvidenceSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_SourceImageEvidenceSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ReferencedPresentationStateSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_SamplesPerPixel) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_PhotometricInterpretation) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BitsAllocated) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BitsStored) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_HighBit) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_ContentQualification) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ImageComments) return OFTrue; // also in General Image Module
  // if (key == DCM_BurnedInAnnotation) return OFTrue; // also in General Image Module
  // if (key == DCM_RecognizableVisualFeatures) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompression) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionRatio) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionMethod) return OFTrue; // also in General Image Module
  // if (key == DCM_PresentationLUTShape) return OFTrue; // also in General Image Module
  // if (key == DCM_IconImageSequence) return OFTrue; // also in General Image Module
  // if (key == DCM_IsocenterPosition) return OFTrue;  // also in Enhanced MR Image Module

  // any attributes of the Enhanced XA/XRF Image Module that are present
  // if (key == DCM_ImageType) return OFTrue; // also in General Image Module
  if (key == DCM_PlanesInAcquisition) return OFTrue;
  if (key == DCM_PlaneIdentification) return OFTrue;
  // if (key == DCM_AcquisitionNumber) return OFTrue; // also in General Image Module
  // if (key == DCM_AcquisitionDateTime) return OFTrue; // also in General Image Module
  // if (key == DCM_BitsAllocated) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BitsStored) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_HighBit) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_SamplesPerPixel) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_PixelRepresentation) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_PhotometricInterpretation) return OFTrue; // also in Image Pixel Module
  if (key == DCM_AcquisitionProtocolName) return OFTrue;
  if (key == DCM_AcquisitionProtocolDescription) return OFTrue;
  if (key == DCM_ScanOptions) return OFTrue;
  // if (key == DCM_ContentQualification) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_PatientOrientationCodeSequence) return OFTrue; // also in General Image Module
  if (key == DCM_PatientGantryRelationshipCodeSequence) return OFTrue;
  if (key == DCM_ExaminedBodyThickness) return OFTrue;
  // if (key == DCM_BurnedInAnnotation) return OFTrue; // also in General Image Module
  // if (key == DCM_RecognizableVisualFeatures) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompression) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionRatio) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionMethod) return OFTrue; // also in General Image Module
  if (key == DCM_ReferencedOtherPlaneSequence) return OFTrue;
  // if (key == DCM_ReferencedImageEvidenceSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_SourceImageEvidenceSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ReferencedInstanceSequence) return OFTrue; // also in SR Document General Module
  // if (key == DCM_ImageComments) return OFTrue; // also in General Image Module
  // if (key == DCM_QualityControlImage) return OFTrue; // also in General Image Module
  // if (key == DCM_IconImageSequence) return OFTrue; // also in General Image Module
  // if (key == DCM_PresentationLUTShape) return OFTrue; // also in General Image Module

  // any attributes of the Segmentation Image Module that are present
  // if (key == DCM_ImageType) return OFTrue; // also in General Image Module
  if (key == DCM_ImageOrientationSlide) return OFTrue;
  // if (key == DCM_SamplesPerPixel) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_PhotometricInterpretation) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_PixelRepresentation) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BitsAllocated) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BitsStored) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_HighBit) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_LossyImageCompression) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionRatio) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionMethod) return OFTrue; // also in General Image Module
  if (key == DCM_SegmentationType) return OFTrue;
  if (key == DCM_SegmentationFractionalType) return OFTrue;
  if (key == DCM_MaximumFractionalValue) return OFTrue;
  if (key == DCM_SegmentsOverlap) return OFTrue;
  if (key == DCM_SegmentSequence) return OFTrue;

  // any attributes of the Encapsulated Document Module that are present
  // if (key == DCM_InstanceNumber) return OFTrue; // also in General Image Module
  // if (key == DCM_ContentDate) return OFTrue; // also in General Image Module
  // if (key == DCM_ContentTime) return OFTrue; // also in General Image Module
  // if (key == DCM_AcquisitionDateTime) return OFTrue; // also in General Image Module
  // if (key == DCM_ImageLaterality) return OFTrue; // also in General Image Module
  // if (key == DCM_BurnedInAnnotation) return OFTrue; // also in General Image Module
  // if (key == DCM_RecognizableVisualFeatures) return OFTrue; // also in General Image Module
  if (key == DCM_SourceInstanceSequence) return OFTrue;
  if (key == DCM_DocumentTitle) return OFTrue;
  // if (key == DCM_ConceptNameCodeSequence) return OFTrue; // also in SR Document Content Module
  if (key == DCM_DocumentClassCodeSequence) return OFTrue;
  // if (key == DCM_VerificationFlag) return OFTrue; // also in SR Document General Module
  if (key == DCM_HL7InstanceIdentifier) return OFTrue;
  // if (key == DCM_PredecessorDocumentsSequence) return OFTrue; // also in SR Document General Module
  // if (key == DCM_IdenticalDocumentsSequence) return OFTrue; // also in SR Document General Module
  if (key == DCM_MIMETypeOfEncapsulatedDocument) return OFTrue;
  if (key == DCM_ListOfMIMETypes) return OFTrue;
  if (key == DCM_EncapsulatedDocument) return OFTrue;
  if (key == DCM_EncapsulatedDocumentLength) return OFTrue;
  // if (key == DCM_ValueType) return OFTrue; // also in SR Document Content Module
  // if (key == DCM_ContentSequence) return OFTrue; // also in SR Document Content Module
  // if (key == DCM_ContinuityOfContent) return OFTrue; // also in SR Document Content Module
  // if (key == DCM_ContentTemplateSequence) return OFTrue; // also in SR Document Content Module

  // any attributes of the X-Ray 3D Image Module that are present
  // if (key == DCM_ImageType) return OFTrue; // also in General Image Module
  // if (key == DCM_BitsAllocated) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BitsStored) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_HighBit) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_SamplesPerPixel) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_PhotometricInterpretation) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_ContentQualification) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_BurnedInAnnotation) return OFTrue; // also in General Image Module
  // if (key == DCM_RecognizableVisualFeatures) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompression) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionRatio) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionMethod) return OFTrue; // also in General Image Module
  // if (key == DCM_ReferencedImageEvidenceSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ImageComments) return OFTrue; // also in General Image Module
  // if (key == DCM_QualityControlImage) return OFTrue; // also in General Image Module
  // if (key == DCM_IconImageSequence) return OFTrue; // also in General Image Module
  // if (key == DCM_PresentationLUTShape) return OFTrue; // also in General Image Module
  if (key == DCM_SourceIrradiationEventSequence) return OFTrue;

  // any attributes of the Enhanced PET Image Module that are present
  // if (key == DCM_ImageType) return OFTrue; // also in General Image Module
  // if (key == DCM_AcquisitionNumber) return OFTrue; // also in General Image Module
  // if (key == DCM_AcquisitionDateTime) return OFTrue; // also in General Image Module
  // if (key == DCM_AcquisitionDuration) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ReferencedRawDataSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ReferencedWaveformSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ReferencedImageEvidenceSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_SourceImageEvidenceSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_SamplesPerPixel) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_PhotometricInterpretation) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BitsAllocated) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BitsStored) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_HighBit) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_ContentQualification) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ImageComments) return OFTrue; // also in General Image Module
  // if (key == DCM_BurnedInAnnotation) return OFTrue; // also in General Image Module
  // if (key == DCM_RecognizableVisualFeatures) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompression) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionRatio) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionMethod) return OFTrue; // also in General Image Module
  // if (key == DCM_PresentationLUTShape) return OFTrue; // also in General Image Module
  // if (key == DCM_IconImageSequence) return OFTrue; // also in General Image Module

  // any attributes of the Enhanced US Image Module that are present
  // if (key == DCM_ImageType) return OFTrue; // also in General Image Module
  // if (key == DCM_SamplesPerPixel) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_PhotometricInterpretation) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BitsAllocated) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BitsStored) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_HighBit) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_PixelRepresentation) return OFTrue; // also in Image Pixel Module
  if (key == DCM_DimensionOrganizationType) return OFTrue;
  // if (key == DCM_AcquisitionDateTime) return OFTrue; // also in General Image Module
  // if (key == DCM_AcquisitionDuration) return OFTrue;  // also in Enhanced MR Image Module
  if (key == DCM_PositionMeasuringDeviceUsed) return OFTrue;
  // if (key == DCM_LossyImageCompression) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionRatio) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionMethod) return OFTrue; // also in General Image Module
  // if (key == DCM_PresentationLUTShape) return OFTrue; // also in General Image Module
  if (key == DCM_RescaleIntercept) return OFTrue;
  if (key == DCM_RescaleSlope) return OFTrue;
  if (key == DCM_SourceImageSequence) return OFTrue;
  if (key == DCM_ReferencedImageSequence) return OFTrue;
  // if (key == DCM_ReferencedRawDataSequence) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_ReferencedInstanceSequence) return OFTrue; // also in SR Document General Module
  if (key == DCM_NumberOfStages) return OFTrue;
  if (key == DCM_StageNumber) return OFTrue;
  if (key == DCM_StageCodeSequence) return OFTrue;
  if (key == DCM_EventTimerSequence) return OFTrue;
  // if (key == DCM_BurnedInAnnotation) return OFTrue; // also in General Image Module
  // if (key == DCM_RecognizableVisualFeatures) return OFTrue; // also in General Image Module
  // if (key == DCM_IconImageSequence) return OFTrue; // also in General Image Module
  if (key == DCM_TransducerData) return OFTrue;
  if (key == DCM_TransducerGeometryCodeSequence) return OFTrue;
  if (key == DCM_TransducerBeamSteeringCodeSequence) return OFTrue;
  if (key == DCM_TransducerApplicationCodeSequence) return OFTrue;
  if (key == DCM_ProcessingFunction) return OFTrue;
  if (key == DCM_MechanicalIndex) return OFTrue;
  if (key == DCM_BoneThermalIndex) return OFTrue;
  if (key == DCM_CranialThermalIndex) return OFTrue;
  if (key == DCM_SoftTissueThermalIndex) return OFTrue;
  if (key == DCM_DepthsOfFocus) return OFTrue;
  if (key == DCM_DepthOfScanField) return OFTrue;

  // any attributes of the Surface Segmentation Module that are present
  // if (key == DCM_InstanceNumber) return OFTrue; // also in General Image Module
  // if (key == DCM_ContentLabel) return OFTrue; // also in Raw Data Module
  // if (key == DCM_ContentDescription) return OFTrue; // also in Raw Data Module
  // if (key == DCM_ConceptNameCodeSequence) return OFTrue; // also in SR Document Content Module
  if (key == DCM_AlternateContentDescriptionSequence) return OFTrue;
  if (key == DCM_ContentCreatorName) return OFTrue;
  if (key == DCM_ContentCreatorIdentificationCodeSequence) return OFTrue;
  // if (key == DCM_ContentDate) return OFTrue; // also in General Image Module
  // if (key == DCM_ContentTime) return OFTrue; // also in General Image Module
  // if (key == DCM_SegmentSequence) return OFTrue; // also in Segmentation Image Module

  // any attributes of the Surface Mesh Module that are present
  if (key == DCM_NumberOfSurfaces) return OFTrue;
  if (key == DCM_SurfaceSequence) return OFTrue;

  // any attributes of the Structured Display Module that are present
  // if (key == DCM_InstanceNumber) return OFTrue; // also in General Image Module
  // if (key == DCM_ContentLabel) return OFTrue; // also in Raw Data Module
  // if (key == DCM_ContentDescription) return OFTrue; // also in Raw Data Module
  // if (key == DCM_ConceptNameCodeSequence) return OFTrue; // also in SR Document Content Module
  // if (key == DCM_AlternateContentDescriptionSequence) return OFTrue; // also in Surface Segmentation Module
  // if (key == DCM_ContentCreatorName) return OFTrue; // also in Surface Segmentation Module
  // if (key == DCM_ContentCreatorIdentificationCodeSequence) return OFTrue; // also in Surface Segmentation Module
  if (key == DCM_PresentationCreationDate) return OFTrue;
  if (key == DCM_PresentationCreationTime) return OFTrue;
  if (key == DCM_NumberOfScreens) return OFTrue;
  if (key == DCM_NominalScreenDefinitionSequence) return OFTrue;
  // if (key == DCM_IconImageSequence) return OFTrue; // also in General Image Module
  if (key == DCM_StructuredDisplayBackgroundCIELabValue) return OFTrue;
  if (key == DCM_EmptyImageBoxCIELabValue) return OFTrue;
  if (key == DCM_HangingProtocolName) return OFTrue;
  if (key == DCM_HangingProtocolCreator) return OFTrue;

  // any attributes of the Structured Display Annotation Module that are present
  if (key == DCM_StructuredDisplayTextBoxSequence) return OFTrue;

  // any attributes of the Structured Display Image Box Module that are present
  if (key == DCM_StructuredDisplayImageBoxSequence) return OFTrue;
  if (key == DCM_ImageBoxSynchronizationSequence) return OFTrue;

  // any Attributes of the Implant Template Module that are present
  // if (key == DCM_Manufacturer) return OFTrue; // also in General Equipment Module
  if (key == DCM_FrameOfReferenceUID) return OFTrue;
  if (key == DCM_ImplantName) return OFTrue;
  if (key == DCM_ImplantSize) return OFTrue;
  if (key == DCM_ImplantPartNumber) return OFTrue;
  if (key == DCM_ImplantTemplateVersion) return OFTrue;
  if (key == DCM_ReplacedImplantTemplateSequence) return OFTrue;
  if (key == DCM_ImplantType) return OFTrue;
  if (key == DCM_OriginalImplantTemplateSequence) return OFTrue;
  if (key == DCM_DerivationImplantTemplateSequence) return OFTrue;
  if (key == DCM_EffectiveDateTime) return OFTrue;
  if (key == DCM_ImplantTargetAnatomySequence) return OFTrue;
  if (key == DCM_NotificationFromManufacturerSequence) return OFTrue;
  if (key == DCM_InformationFromManufacturerSequence) return OFTrue;
  if (key == DCM_ImplantRegulatoryDisapprovalCodeSequence) return OFTrue;
  if (key == DCM_OverallTemplateSpatialTolerance) return OFTrue;
  if (key == DCM_MaterialsCodeSequence) return OFTrue;
  if (key == DCM_CoatingMaterialsCodeSequence) return OFTrue;
  if (key == DCM_ImplantTypeCodeSequence) return OFTrue;
  if (key == DCM_FixationMethodCodeSequence) return OFTrue;

  // any Attributes of the Implant Assembly Template Module that are present
  // if (key == DCM_EffectiveDateTime) return OFTrue; // also in Implant Template Module
  if (key == DCM_ImplantAssemblyTemplateName) return OFTrue;
  if (key == DCM_ImplantAssemblyTemplateIssuer) return OFTrue;
  if (key == DCM_ImplantAssemblyTemplateVersion) return OFTrue;
  if (key == DCM_ReplacedImplantAssemblyTemplateSequence) return OFTrue;
  if (key == DCM_ImplantAssemblyTemplateType) return OFTrue;
  if (key == DCM_OriginalImplantAssemblyTemplateSequence) return OFTrue;
  if (key == DCM_DerivationImplantAssemblyTemplateSequence) return OFTrue;
  if (key == DCM_ImplantAssemblyTemplateTargetAnatomySequence) return OFTrue;
  if (key == DCM_ProcedureTypeCodeSequence) return OFTrue;
  if (key == DCM_SurgicalTechnique) return OFTrue;
  // if (key == DCM_MIMETypeOfEncapsulatedDocument) return OFTrue; // also in Encapsulated Document Module
  // if (key == DCM_EncapsulatedDocument) return OFTrue; // also in Encapsulated Document Module
  if (key == DCM_ComponentTypesSequence) return OFTrue;
  if (key == DCM_ComponentAssemblySequence) return OFTrue;

  // any Attributes of the Implant Template Group Module that are present
  // if (key == DCM_EffectiveDateTime) return OFTrue; // also in Implant Template Module
  if (key == DCM_ImplantTemplateGroupName) return OFTrue;
  if (key == DCM_ImplantTemplateGroupDescription) return OFTrue;
  if (key == DCM_ImplantTemplateGroupIssuer) return OFTrue;
  if (key == DCM_ImplantTemplateGroupVersion) return OFTrue;
  if (key == DCM_ReplacedImplantTemplateGroupSequence) return OFTrue;
  if (key == DCM_ImplantTemplateGroupTargetAnatomySequence) return OFTrue;
  if (key == DCM_ImplantTemplateGroupMembersSequence) return OFTrue;
  if (key == DCM_ImplantTemplateGroupVariationDimensionSequence) return OFTrue;

  // any attributes of the Point Cloud Module that are present
  if (key == DCM_SurfacePointsSequence) return OFTrue;
  if (key == DCM_SurfacePointPresentationValueData) return OFTrue;
  if (key == DCM_SurfacePointColorCIELabValueData) return OFTrue;

  // any attributes of the Enhanced Mammography Image Module that are present
  if (key == DCM_PositionerMotion) return OFTrue;
  if (key == DCM_PositionerType) return OFTrue;
  // if (key == DCM_ContentQualification) return OFTrue;  // also in Enhanced MR Image Module
  // if (key == DCM_AcquisitionDateTime) return OFTrue; // also in General Image Module
  // if (key == DCM_AcquisitionDuration) return OFTrue;  // also in Enhanced MR Image Module
  if (key == DCM_KVP) return OFTrue;
  if (key == DCM_XRayTubeCurrentInmA) return OFTrue;
  if (key == DCM_ExposureTimeInms) return OFTrue;
  if (key == DCM_ExposureInmAs) return OFTrue;
  if (key == DCM_FocalSpots) return OFTrue;
  if (key == DCM_AnodeTargetMaterial) return OFTrue;
  if (key == DCM_BodyPartThickness) return OFTrue;
  if (key == DCM_CompressionForce) return OFTrue;
  if (key == DCM_CompressionPressure) return OFTrue;
  if (key == DCM_CompressionContactArea) return OFTrue;
  if (key == DCM_PaddleDescription) return OFTrue;
  if (key == DCM_ExposureControlMode) return OFTrue;
  if (key == DCM_ExposureControlModeDescription) return OFTrue;
  if (key == DCM_PatientOrientation) return OFTrue;
  // if (key == DCM_ImageComments) return OFTrue; // also in General Image Module
  // if (key == DCM_SamplesPerPixel) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_PhotometricInterpretation) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BitsAllocated) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_BitsStored) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_HighBit) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_PixelRepresentation) return OFTrue; // also in Image Pixel Module
  // if (key == DCM_QualityControlImage) return OFTrue; // also in General Image Module
  // if (key == DCM_BurnedInAnnotation) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompression) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionRatio) return OFTrue; // also in General Image Module
  // if (key == DCM_LossyImageCompressionMethod) return OFTrue; // also in General Image Module
  if (key == DCM_OrganDose) return OFTrue;
  if (key == DCM_EntranceDoseInmGy) return OFTrue;
  if (key == DCM_EntranceDoseDerivation) return OFTrue;
  if (key == DCM_TypeOfDetectorMotion) return OFTrue;
  // if (key == DCM_IconImageSequence) return OFTrue; // also in General Image Module
  // if (key == DCM_PresentationLUTShape) return OFTrue; // also in General Image Module

  // any attributes of the Tractography Results Module that are present
  // if (key == DCM_InstanceNumber) return OFTrue; // also in General Image Module
  // if (key == DCM_ContentLabel) return OFTrue; // also in Raw Data Module
  // if (key == DCM_ContentDescription) return OFTrue; // also in Raw Data Module
  // if (key == DCM_ConceptNameCodeSequence) return OFTrue; // also in SR Document Content Module
  // if (key == DCM_AlternateContentDescriptionSequence) return OFTrue; // also in Surface Segmentation Module
  // if (key == DCM_ContentCreatorName) return OFTrue; // also in Surface Segmentation Module
  // if (key == DCM_ContentCreatorIdentificationCodeSequence) return OFTrue; // also in Surface Segmentation Module
  // if (key == DCM_ContentDate) return OFTrue; // also in General Image Module
  // if (key == DCM_ContentTime) return OFTrue; // also in General Image Module
  if (key == DCM_TrackSetSequence) return OFTrue;
  // if (key == DCM_ReferencedInstanceSequence) return OFTrue; // also in SR Document General Module

  // any attributes of the Volumetric Graphic Annotation Module that are present
  if (key == DCM_VolumetricAnnotationSequence) return OFTrue;
  if (key == DCM_VolumetricPresentationInputAnnotationSequence) return OFTrue;

  return OFFalse;
}


OFBool SiCreatorProfile::checkRequiredAttributeList(DcmAttributeTag& tagList) const
{
  OFBool result =
    containsTag(tagList, DCM_SOPClassUID) &&
    containsTag(tagList, DCM_StudyInstanceUID) &&
    containsTag(tagList, DCM_SeriesInstanceUID) &&
    containsTag(tagList, DCM_SOPInstanceUID);

  return result;
}


OFCondition SiCreatorProfile::inspectSignatureDataset(DcmItem &item)
{
  DcmElement *delem = NULL;
  if (item.findAndGetElement(DCM_CreatorVersionUID, delem).good())
  {
    // The CreatorVersionUID attribute is present in the dataset or item.
    // Since this attribute only occurs in the Raw Data Module, this means that
    // the Raw Data Module is present.
    containsRawData_ = OFTrue;
  }
  else
  {
    containsRawData_ = OFFalse;
  }
  return EC_Normal;
}

OFBool SiCreatorProfile::mainDatasetRequired() const
{
  return OFTrue;
}

#else /* WITH_OPENSSL */

int sicreapr_cc_dummy_to_keep_linker_from_moaning = 0;

#endif
