00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef DCDDIRIF_H
00031 #define DCDDIRIF_H
00032
00033 #include "dcmtk/config/osconfig.h"
00034
00035 #include "dcmtk/dcmdata/dcdicdir.h"
00036
00037
00038
00039
00040
00041
00042
00043 #define DEFAULT_FILESETID "DCMTK_MEDIA_DEMO"
00044
00045 #define DEFAULT_DESCRIPTOR_CHARSET "ISO_IR 100"
00046
00047
00048
00049
00050
00051
00057 class DicomDirImagePlugin
00058 {
00059 public:
00060
00063 virtual ~DicomDirImagePlugin() {}
00064
00075 virtual OFBool scaleData(const Uint8 *srcData,
00076 const unsigned int srcWidth,
00077 const unsigned int srcHeight,
00078 Uint8 *dstData,
00079 const unsigned int dstWidth,
00080 const unsigned int dstHeight) const = 0;
00081
00093 virtual OFBool scaleImage(DcmItem *dataset,
00094 Uint8 *pixel,
00095 const unsigned long count,
00096 const unsigned long frame,
00097 const unsigned int width,
00098 const unsigned int height,
00099 const OFBool decompressAll = OFFalse) const = 0;
00100
00101 protected:
00102
00105 DicomDirImagePlugin() {}
00106 };
00107
00108
00111 class DicomDirInterface
00112 {
00113
00114 public:
00115
00118 enum E_ApplicationProfile
00119 {
00121 AP_GeneralPurpose,
00123 AP_Default = AP_GeneralPurpose,
00125 AP_GeneralPurposeDVD,
00127 AP_GeneralPurposeMIME,
00129 AP_USBandFlash,
00131 AP_MPEG2MPatMLDVD,
00133 AP_BasicCardiac,
00135 AP_XrayAngiographic,
00137 AP_XrayAngiographicDVD,
00139 AP_DentalRadiograph,
00141 AP_CTandMR,
00143 AP_UltrasoundIDSF,
00145 AP_UltrasoundSCSF,
00147 AP_UltrasoundCCSF,
00149 AP_UltrasoundIDMF,
00151 AP_UltrasoundSCMF,
00153 AP_UltrasoundCCMF,
00155 AP_TwelveLeadECG,
00157 AP_HemodynamicWaveform
00158 };
00159
00164 DicomDirInterface();
00165
00169 virtual ~DicomDirInterface();
00170
00174 void cleanup();
00175
00180 OFBool isDicomDirValid() const;
00181
00193 OFCondition createNewDicomDir(const E_ApplicationProfile profile = AP_GeneralPurpose,
00194 const char *filename = DEFAULT_DICOMDIR_NAME,
00195 const char *filesetID = DEFAULT_FILESETID);
00196
00208 OFCondition appendToDicomDir(const E_ApplicationProfile profile,
00209 const char *filename);
00210
00222 OFCondition updateDicomDir(const E_ApplicationProfile profile,
00223 const char *filename);
00224
00231 OFCondition writeDicomDir(const E_EncodingType encodingType = EET_UndefinedLength,
00232 const E_GrpLenEncoding groupLength = EGL_withoutGL);
00233
00243 OFBool isFilenameValid(const char *filename,
00244 const OFBool allowEmpty = OFFalse);
00245
00253 OFBool isCharsetValid(const char *charset);
00254
00265 OFCondition checkDicomFile(const char *filename,
00266 const char *directory = NULL);
00267
00277 OFCondition addDicomFile(const char *filename,
00278 const char *directory = NULL);
00279
00289 OFCondition setFilesetDescriptor(const char *filename,
00290 const char *charset = DEFAULT_DESCRIPTOR_CHARSET);
00291
00298 OFCondition setIconSize(const unsigned int size);
00299
00308 OFCondition setIconPrefix(const char *prefix);
00309
00317 OFCondition setDefaultIcon(const char *filename);
00318
00323 OFBool abortMode() const
00324 {
00325 return AbortMode;
00326 }
00327
00332 OFBool mapFilenamesMode() const
00333 {
00334 return MapFilenamesMode;
00335 }
00336
00341 OFBool inventMode() const
00342 {
00343 return InventMode;
00344 }
00345
00350 OFBool inventPatientIDMode() const
00351 {
00352 return InventPatientIDMode;
00353 }
00354
00359 OFBool retiredSOPClassSupport() const
00360 {
00361 return RetiredSOPClassSupport;
00362 }
00363
00368 OFBool iconImageMode() const
00369 {
00370 return IconImageMode;
00371 }
00372
00377 OFBool backupMode() const
00378 {
00379 return BackupMode;
00380 }
00381
00386 OFBool encodingCheck() const
00387 {
00388 return EncodingCheck;
00389 }
00390
00395 OFBool resolutionCheck() const
00396 {
00397 return ResolutionCheck;
00398 }
00399
00404 OFBool transferSyntaxCheck() const
00405 {
00406 return TransferSyntaxCheck;
00407 }
00408
00413 OFBool consistencyCheck() const
00414 {
00415 return ConsistencyCheck;
00416 }
00417
00425 OFBool enableAbortMode(const OFBool newMode = OFTrue);
00426
00434 OFBool enableMapFilenamesMode(const OFBool newMode = OFTrue);
00435
00443 OFBool enableInventMode(const OFBool newMode = OFTrue);
00444
00453 OFBool enableInventPatientIDMode(const OFBool newMode = OFTrue);
00454
00462 OFBool enableRetiredSOPClassSupport(const OFBool newMode = OFTrue);
00463
00473 OFBool enableIconImageMode(const OFBool newMode = OFTrue);
00474
00483 OFBool disableBackupMode(const OFBool newMode = OFFalse);
00484
00494 OFBool disableEncodingCheck(const OFBool newMode = OFFalse);
00495
00505 OFBool disableResolutionCheck(const OFBool newMode = OFFalse);
00506
00516 OFBool disableTransferSyntaxCheck(const OFBool newMode = OFFalse);
00517
00526 OFBool disableConsistencyCheck(const OFBool newMode = OFFalse);
00527
00534 OFBool addImageSupport(DicomDirImagePlugin *plugin);
00535
00536
00537
00542 static const char *getProfileName(const E_ApplicationProfile profile);
00543
00544
00545 protected:
00546
00551 OFCondition selectApplicationProfile(const E_ApplicationProfile profile);
00552
00559 OFCondition loadAndCheckDicomFile(const char *filename,
00560 const char *directory,
00561 DcmFileFormat &fileformat);
00562
00569 OFCondition checkSOPClassAndXfer(DcmMetaInfo *metainfo,
00570 DcmItem *dataset,
00571 const char *filename);
00572
00578 OFCondition checkBasicCardiacAttributes(DcmItem *dataset,
00579 const char *filename);
00580
00587 OFCondition checkXrayAngiographicAttributes(DcmItem *dataset,
00588 const OFString &sopClass,
00589 const char *filename);
00590
00596 OFCondition checkDentalRadiographAttributes(DcmItem *dataset,
00597 const char *filename);
00598
00605 OFCondition checkCTandMRAttributes(DcmItem *dataset,
00606 const OFString &sopClass,
00607 const char *filename);
00608
00615 OFCondition checkUltrasoundAttributes(DcmItem *dataset,
00616 const OFString &transferSyntax,
00617 const char *filename);
00618
00625 OFCondition checkMandatoryAttributes(DcmMetaInfo *metainfo,
00626 DcmItem *dataset,
00627 const char *filename);
00628
00638 OFBool recordMatchesDataset(DcmDirectoryRecord *record,
00639 DcmItem *dataset);
00640
00647 DcmDirectoryRecord *findExistingRecord(DcmDirectoryRecord *parent,
00648 const E_DirRecType recordType,
00649 DcmItem* dataset);
00650
00657 DcmDirectoryRecord *buildPatientRecord(DcmDirectoryRecord *record,
00658 DcmItem *dataset,
00659 const OFString &sourceFilename);
00660
00667 DcmDirectoryRecord *buildStudyRecord(DcmDirectoryRecord *record,
00668 DcmItem *dataset,
00669 const OFString &sourceFilename);
00670
00677 DcmDirectoryRecord *buildSeriesRecord(DcmDirectoryRecord *record,
00678 DcmItem *dataset,
00679 const OFString &sourceFilename);
00680
00688 DcmDirectoryRecord *buildOverlayRecord(DcmDirectoryRecord *record,
00689 DcmItem *dataset,
00690 const OFString &referencedFileID,
00691 const OFString &sourceFilename);
00692
00700 DcmDirectoryRecord *buildModalityLutRecord(DcmDirectoryRecord *record,
00701 DcmItem *dataset,
00702 const OFString &referencedFileID,
00703 const OFString &sourceFilename);
00704
00712 DcmDirectoryRecord *buildVoiLutRecord(DcmDirectoryRecord *record,
00713 DcmItem *dataset,
00714 const OFString &referencedFileID,
00715 const OFString &sourceFilename);
00716
00724 DcmDirectoryRecord *buildCurveRecord(DcmDirectoryRecord *record,
00725 DcmItem *dataset,
00726 const OFString &referencedFileID,
00727 const OFString &sourceFilename);
00728
00736 DcmDirectoryRecord *buildStructReportRecord(DcmDirectoryRecord *record,
00737 DcmItem *dataset,
00738 const OFString &referencedFileID,
00739 const OFString &sourceFilename);
00740
00748 DcmDirectoryRecord *buildPresentationRecord(DcmDirectoryRecord *record,
00749 DcmItem *dataset,
00750 const OFString &referencedFileID,
00751 const OFString &sourceFilename);
00752
00760 DcmDirectoryRecord *buildWaveformRecord(DcmDirectoryRecord *record,
00761 DcmItem *dataset,
00762 const OFString &referencedFileID,
00763 const OFString &sourceFilename);
00764
00772 DcmDirectoryRecord *buildRTDoseRecord(DcmDirectoryRecord *record,
00773 DcmItem *dataset,
00774 const OFString &referencedFileID,
00775 const OFString &sourceFilename);
00776
00784 DcmDirectoryRecord *buildRTStructureSetRecord(DcmDirectoryRecord *record,
00785 DcmItem *dataset,
00786 const OFString &referencedFileID,
00787 const OFString &sourceFilename);
00788
00796 DcmDirectoryRecord *buildRTPlanRecord(DcmDirectoryRecord *record,
00797 DcmItem *dataset,
00798 const OFString &referencedFileID,
00799 const OFString &sourceFilename);
00800
00808 DcmDirectoryRecord *buildRTTreatmentRecord(DcmDirectoryRecord *record,
00809 DcmItem *dataset,
00810 const OFString &referencedFileID,
00811 const OFString &sourceFilename);
00812
00820 DcmDirectoryRecord *buildStoredPrintRecord(DcmDirectoryRecord *record,
00821 DcmItem *dataset,
00822 const OFString &referencedFileID,
00823 const OFString &sourceFilename);
00824
00832 DcmDirectoryRecord *buildKeyObjectDocRecord(DcmDirectoryRecord *record,
00833 DcmItem *dataset,
00834 const OFString &referencedFileID,
00835 const OFString &sourceFilename);
00836
00844 DcmDirectoryRecord *buildRegistrationRecord(DcmDirectoryRecord *record,
00845 DcmItem *dataset,
00846 const OFString &referencedFileID,
00847 const OFString &sourceFilename);
00848
00856 DcmDirectoryRecord *buildFiducialRecord(DcmDirectoryRecord *record,
00857 DcmItem *dataset,
00858 const OFString &referencedFileID,
00859 const OFString &sourceFilename);
00860
00868 DcmDirectoryRecord *buildRawDataRecord(DcmDirectoryRecord *record,
00869 DcmItem *dataset,
00870 const OFString &referencedFileID,
00871 const OFString &sourceFilename);
00872
00880 DcmDirectoryRecord *buildSpectroscopyRecord(DcmDirectoryRecord *record,
00881 DcmItem *dataset,
00882 const OFString &referencedFileID,
00883 const OFString &sourceFilename);
00884
00892 DcmDirectoryRecord *buildEncapDocRecord(DcmDirectoryRecord *record,
00893 DcmItem *dataset,
00894 const OFString &referencedFileID,
00895 const OFString &sourceFilename);
00896
00904 DcmDirectoryRecord *buildValueMapRecord(DcmDirectoryRecord *record,
00905 DcmItem *dataset,
00906 const OFString &referencedFileID,
00907 const OFString &sourceFilename);
00908
00916 DcmDirectoryRecord *buildHangingProtocolRecord(DcmDirectoryRecord *record,
00917 DcmItem *dataset,
00918 const OFString &referencedFileID,
00919 const OFString &sourceFilename);
00920
00928 DcmDirectoryRecord *buildStereometricRecord(DcmDirectoryRecord *record,
00929 DcmItem *dataset,
00930 const OFString &referencedFileID,
00931 const OFString &sourceFilename);
00932
00940 DcmDirectoryRecord *buildPaletteRecord(DcmDirectoryRecord *record,
00941 DcmItem *dataset,
00942 const OFString &referencedFileID,
00943 const OFString &sourceFilename);
00944
00952 DcmDirectoryRecord *buildSurfaceRecord(DcmDirectoryRecord *record,
00953 DcmItem *dataset,
00954 const OFString &referencedFileID,
00955 const OFString &sourceFilename);
00956
00964 DcmDirectoryRecord *buildMeasurementRecord(DcmDirectoryRecord *record,
00965 DcmItem *dataset,
00966 const OFString &referencedFileID,
00967 const OFString &sourceFilename);
00968
00976 DcmDirectoryRecord *buildImplantRecord(DcmDirectoryRecord *record,
00977 DcmItem *dataset,
00978 const OFString &referencedFileID,
00979 const OFString &sourceFilename);
00980
00988 DcmDirectoryRecord *buildImplantGroupRecord(DcmDirectoryRecord *record,
00989 DcmItem *dataset,
00990 const OFString &referencedFileID,
00991 const OFString &sourceFilename);
00992
01000 DcmDirectoryRecord *buildImplantAssyRecord(DcmDirectoryRecord *record,
01001 DcmItem *dataset,
01002 const OFString &referencedFileID,
01003 const OFString &sourceFilename);
01004
01012 DcmDirectoryRecord *buildImageRecord(DcmDirectoryRecord *record,
01013 DcmItem *dataset,
01014 const OFString &referencedFileID,
01015 const OFString &sourceFilename);
01016
01027 OFBool getIconFromFile(const OFString &filename,
01028 Uint8 *pixel,
01029 const unsigned long count,
01030 const unsigned int width,
01031 const unsigned int height);
01032
01042 OFBool getIconFromDataset(DcmItem *dataset,
01043 Uint8 *pixel,
01044 const unsigned long count,
01045 const unsigned int width,
01046 const unsigned int height);
01047
01058 OFCondition addIconImage(DcmDirectoryRecord *record,
01059 DcmItem *dataset,
01060 const unsigned int size,
01061 const OFString &sourceFilename);
01062
01072 DcmDirectoryRecord *addRecord(DcmDirectoryRecord *parent,
01073 const E_DirRecType recordType,
01074 DcmItem *dataset,
01075 const OFString &referencedFileID,
01076 const OFString &sourceFilename);
01077
01084 OFBool checkReferencedSOPInstance(DcmDirectoryRecord *record,
01085 DcmItem *dataset,
01086 const OFString &referencedFileID,
01087 const OFString &sourceFilename);
01088
01094 void inventMissingAttributes(DcmDirectoryRecord *parent,
01095 const OFBool recurse = OFTrue);
01096
01100 void inventMissingStudyLevelAttributes(DcmDirectoryRecord *parent);
01101
01105 void inventMissingSeriesLevelAttributes(DcmDirectoryRecord *parent);
01106
01110 void inventMissingInstanceLevelAttributes(DcmDirectoryRecord *parent);
01111
01115 void createDicomDirBackup(const char *filename);
01116
01119 void deleteDicomDirBackup();
01120
01128 void printUnexpectedValueMessage(const DcmTagKey &key,
01129 const char *filename = NULL,
01130 const OFBool errorMsg = OFTrue);
01131
01139 void printRequiredAttributeMessage(const DcmTagKey &key,
01140 const char *filename = NULL,
01141 const OFBool emptyMsg = OFFalse);
01142
01150 void printAttributeErrorMessage(const DcmTagKey &key,
01151 const OFCondition &error,
01152 const char *operation);
01153
01161 void printRecordErrorMessage(const OFCondition &error,
01162 const E_DirRecType recordType,
01163 const char *operation);
01164
01170 OFBool copyFile(const char *fromFilename,
01171 const char *toFilename);
01172
01180 OFBool warnAboutInconsistentAttributes(DcmDirectoryRecord *record,
01181 DcmItem *dataset,
01182 const OFString &sourceFilename,
01183 const OFBool abortCheck = OFFalse);
01184
01189 OFBool checkFilesetID(const OFString &filesetID);
01190
01197 OFBool checkExists(DcmItem *dataset,
01198 const DcmTagKey &key,
01199 const char *filename = NULL);
01200
01207 OFBool checkExistsWithValue(DcmItem *dataset,
01208 const DcmTagKey &key,
01209 const char *filename = NULL);
01210
01218 OFBool checkExistsWithStringValue(DcmItem *dataset,
01219 const DcmTagKey &key,
01220 const OFString &value,
01221 const char *filename = NULL);
01222
01231 OFBool checkExistsWithIntegerValue(DcmItem *dataset,
01232 const DcmTagKey &key,
01233 const long value,
01234 const char *filename = NULL,
01235 const OFBool reject = OFTrue);
01236
01246 OFBool checkExistsWithMinMaxValue(DcmItem *dataset,
01247 const DcmTagKey &key,
01248 const long min,
01249 const long max,
01250 const char *filename = NULL,
01251 const OFBool reject = OFTrue);
01252
01260 OFString &getStringFromDataset(DcmItem *dataset,
01261 const DcmTagKey &key,
01262 OFString &result,
01263 OFBool searchIntoSub = OFFalse);
01264
01273 OFString &getStringComponentFromDataset(DcmItem *dataset,
01274 const DcmTagKey &key,
01275 OFString &result,
01276 const unsigned long pos,
01277 OFBool searchIntoSub = OFFalse);
01278
01286 OFString &getStringFromFile(const char *filename,
01287 const DcmTagKey &key,
01288 OFString &result,
01289 OFBool searchIntoSub = OFFalse);
01290
01299 void copyElement(DcmItem *dataset,
01300 const DcmTagKey &key,
01301 DcmDirectoryRecord *record,
01302 const OFString &sourceFilename,
01303 const OFBool optional = OFFalse,
01304 const OFBool copyEmpty = OFTrue);
01305
01312 void copyElementType1(DcmItem *dataset,
01313 const DcmTagKey &key,
01314 DcmDirectoryRecord *record,
01315 const OFString &sourceFilename)
01316 {
01317 copyElement(dataset, key, record, sourceFilename, OFFalse , OFFalse );
01318 }
01319
01326 void copyElementType1C(DcmItem *dataset,
01327 const DcmTagKey &key,
01328 DcmDirectoryRecord *record,
01329 const OFString &sourceFilename)
01330 {
01331 copyElement(dataset, key, record, sourceFilename, OFTrue , OFFalse );
01332 }
01333
01340 void copyElementType2(DcmItem *dataset,
01341 const DcmTagKey &key,
01342 DcmDirectoryRecord *record,
01343 const OFString &sourceFilename)
01344 {
01345 copyElement(dataset, key, record, sourceFilename, OFFalse , OFTrue );
01346 }
01347
01354 void copyElementType3(DcmItem *dataset,
01355 const DcmTagKey &key,
01356 DcmDirectoryRecord *record,
01357 const OFString &sourceFilename)
01358 {
01359 copyElement(dataset, key, record, sourceFilename, OFTrue , OFTrue );
01360 }
01361
01371 void copyStringWithDefault(DcmItem *dataset,
01372 const DcmTagKey &key,
01373 DcmDirectoryRecord *record,
01374 const OFString &sourceFilename,
01375 const char *defaultValue = "",
01376 const OFBool printWarning = OFFalse);
01377
01387 OFBool compareStringAttributes(DcmItem *dataset,
01388 const DcmTagKey &datKey,
01389 DcmDirectoryRecord *record,
01390 const DcmTagKey &recKey,
01391 const OFString &sourceFilename,
01392 const OFBool errorMsg = OFFalse);
01393
01401 OFBool compareSequenceAttributes(DcmItem *dataset,
01402 DcmTagKey &key,
01403 DcmDirectoryRecord *record,
01404 const OFString &sourceFilename);
01405
01412 void setDefaultValue(DcmDirectoryRecord *record,
01413 const DcmTagKey &key,
01414 const unsigned long number,
01415 const char *prefix = NULL);
01416
01417
01418 private:
01419
01421 DcmDicomDir *DicomDir;
01422
01424 DicomDirImagePlugin *ImagePlugin;
01425
01427 E_ApplicationProfile ApplicationProfile;
01428
01430 OFBool BackupMode;
01432 OFBool AbortMode;
01434 OFBool MapFilenamesMode;
01436 OFBool InventMode;
01438 OFBool InventPatientIDMode;
01440 OFBool RetiredSOPClassSupport;
01442 OFBool EncodingCheck;
01444 OFBool ResolutionCheck;
01446 OFBool TransferSyntaxCheck;
01448 OFBool ConsistencyCheck;
01450 OFBool IconImageMode;
01452 OFBool FilesetUpdateMode;
01453
01455 OFString BackupFilename;
01457 OFBool BackupCreated;
01458
01460 unsigned int IconSize;
01462 OFString IconPrefix;
01464 OFString DefaultIcon;
01465
01467 OFBool RLESupport;
01469 OFBool JPEGSupport;
01471 OFBool JP2KSupport;
01472
01474 unsigned long AutoPatientNumber;
01476 unsigned long AutoStudyNumber;
01478 unsigned long AutoSeriesNumber;
01480 unsigned long AutoInstanceNumber;
01482 unsigned long AutoOverlayNumber;
01484 unsigned long AutoLutNumber;
01486 unsigned long AutoCurveNumber;
01487
01489 DicomDirInterface(const DicomDirInterface &obj);
01490
01492 DicomDirInterface &operator=(const DicomDirInterface &obj);
01493 };
01494
01495
01496 #endif
01497
01498
01499
01500
01501
01502
01503
01504
01505
01506
01507
01508
01509
01510
01511
01512
01513
01514
01515
01516
01517
01518
01519
01520
01521
01522
01523
01524
01525
01526
01527
01528
01529
01530
01531
01532
01533
01534
01535
01536
01537
01538
01539
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550
01551
01552
01553
01554
01555
01556
01557
01558
01559
01560
01561
01562
01563
01564
01565
01566
01567
01568
01569
01570
01571
01572
01573
01574
01575
01576
01577
01578
01579
01580
01581
01582
01583
01584
01585
01586
01587
01588
01589
01590
01591
01592