1 /* 2 * 3 * Copyright (C) 1994-2001, OFFIS 4 * 5 * This software and supporting documentation were developed by 6 * 7 * Kuratorium OFFIS e.V. 8 * Healthcare Information and Communication Systems 9 * Escherweg 2 10 * D-26121 Oldenburg, Germany 11 * 12 * THIS SOFTWARE IS MADE AVAILABLE, AS IS, AND OFFIS MAKES NO WARRANTY 13 * REGARDING THE SOFTWARE, ITS PERFORMANCE, ITS MERCHANTABILITY OR 14 * FITNESS FOR ANY PARTICULAR USE, FREEDOM FROM ANY COMPUTER DISEASES OR 15 * ITS CONFORMITY TO ANY SPECIFICATION. THE ENTIRE RISK AS TO QUALITY AND 16 * PERFORMANCE OF THE SOFTWARE IS WITH THE USER. 17 * 18 * Module: dcmdata 19 * 20 * Author: Gerd Ehlers, Andreas Barth 21 * 22 * Purpose: Interface of class DcmDicomDir 23 * 24 */ 25 26 #ifndef DCDICDIR_H 27 #define DCDICDIR_H 28 29 #include "osconfig.h" /* make sure OS specific configuration is included first */ 30 31 #include "ofconsol.h" 32 #include "dctypes.h" 33 #include "dcitem.h" 34 #include "dcfilefo.h" 35 #include "dcsequen.h" 36 #include "dcdirrec.h" 37 #include "dcvrulup.h" 38 39 40 #define DEFAULT_DICOMDIR_NAME "DICOMDIR" 41 #define TEMPNAME_TEMPLATE "DDXXXXXX" 42 #define DICOMDIR_BACKUP_SUFFIX "." 43 #define DICOMDIR_DEFAULT_TRANSFERSYNTAX EXS_LittleEndianExplicit 44 45 46 typedef struct 47 { 48 DcmItem *item; 49 Uint32 fileOffset; 50 } ItemOffset; 51 52 53 class DcmDicomDir 54 { 55 private: 56 57 // --- declarations to avoid compiler warnings 58 59 DcmDicomDir &operator=(const DcmDicomDir &); 60 61 protected: 62 OFCondition errorFlag; 63 char * dicomDirFileName; 64 OFBool modified; // wird wo gebraucht ? 65 OFBool mustCreateNewDir; 66 DcmFileFormat * DirFile; 67 DcmDirectoryRecord * RootRec; 68 DcmSequenceOfItems * MRDRSeq; 69 70 // Manipulation der internen Datenelemente: 71 OFCondition createNewElements(const char* fileSetID); // in 72 DcmDataset& getDataset(void); 73 74 // Seiteneffekt-freie Methoden zur Manipulation und Konversion: 75 DcmSequenceOfItems& getDirRecSeq( DcmDataset &dset ); // inout 76 DcmUnsignedLongOffset* lookForOffsetElem( DcmObject *obj, // in 77 const DcmTagKey &offsetTag );// in 78 DcmDirectoryRecord* recurseMatchFile( DcmDirectoryRecord* startRec,// in 79 char *filename ); // in 80 DcmDirectoryRecord* searchMatchFile( DcmSequenceOfItems& recSeq, // in 81 char *filename ); // in 82 OFCondition resolveGivenOffsets( DcmObject *startPoint, // inout 83 ItemOffset *itOffsets, // in 84 const unsigned long numOffsets, // in 85 const DcmTagKey &offsetTag ); // in 86 OFCondition resolveAllOffsets( DcmDataset &dset ); // inout 87 OFCondition linkMRDRtoRecord( DcmDirectoryRecord *dRec ); // inout 88 OFCondition moveRecordToTree( DcmDirectoryRecord *startRec, // in 89 DcmSequenceOfItems &fromDirSQ, // inout 90 DcmDirectoryRecord *toRecord );// inout 91 OFCondition moveMRDRbetweenSQs( DcmSequenceOfItems &fromSQ, // in 92 DcmSequenceOfItems &toDirSQ ); // inout 93 Uint32 lengthUntilSQ( DcmDataset &dset, // in 94 E_TransferSyntax oxfer, // in 95 E_EncodingType enctype ); // in 96 Uint32 lengthOfRecord( DcmItem *item, // in 97 E_TransferSyntax oxfer, // in 98 E_EncodingType enctype ); // in 99 OFCondition convertGivenPointer( DcmObject *startPoint, // inout 100 ItemOffset *itOffsets, // in 101 const unsigned long numOffsets, // in 102 const DcmTagKey &offsetTag ); // in 103 OFCondition convertAllPointer( DcmDataset &dset, // inout 104 Uint32 beginOfFileSet, // in 105 E_TransferSyntax oxfer, // in 106 E_EncodingType enctype ); // in 107 OFCondition copyRecordPtrToSQ( DcmDirectoryRecord *record, // in 108 DcmSequenceOfItems &toDirSQ, // inout 109 DcmDirectoryRecord **firstRec, // out 110 DcmDirectoryRecord **lastRec );// out 111 OFCondition insertMediaSOPUID( DcmMetaInfo &metaInfo ); // inout 112 OFCondition countMRDRRefs( DcmDirectoryRecord *startRec, // in 113 ItemOffset *refCounter, // inout 114 const unsigned long numCounters ); // in 115 OFCondition checkMRDRRefCounter( DcmDirectoryRecord *startRec, // in 116 ItemOffset *refCounter, // inout 117 const unsigned long numCounters ); // in 118 119 // komplette Reorganisation der verwalteten Directory Records (Seiteneffekt) 120 OFCondition convertLinearToTree(); 121 OFCondition convertTreeToLinear( Uint32 beginOfFileSet, // in 122 E_TransferSyntax oxfer, // in 123 E_EncodingType enctype, // in 124 E_GrpLenEncoding glenc, // in 125 DcmSequenceOfItems &unresRecs);// inout 126 127 public: 128 DcmDicomDir(); 129 DcmDicomDir( const char *fileName, 130 const char *fileSetID = (char*)NULL ); // only used for new DICOMDIR 131 DcmDicomDir( const DcmDicomDir &newDir ); 132 virtual ~DcmDicomDir(); 133 134 virtual void print(ostream &out, 135 const size_t flags = 0, 136 const int level = 0, 137 const char *pixelFileName = NULL, 138 size_t *pixelCounter = NULL); 139 140 virtual OFCondition error(); 141 virtual DcmFileFormat& getDirFileFormat(); 142 virtual const char* getDirFileName(); 143 virtual DcmDirectoryRecord& getRootRecord(); 144 virtual DcmSequenceOfItems& getMRDRSequence(); 145 virtual DcmDirectoryRecord* matchFilename( char *filename ); 146 virtual DcmDirectoryRecord* matchOrCreateMRDR( char *filename ); 147 virtual OFCondition write(const E_TransferSyntax oxfer 148 = DICOMDIR_DEFAULT_TRANSFERSYNTAX, 149 const E_EncodingType enctype 150 = EET_UndefinedLength, 151 const E_GrpLenEncoding glenc 152 = EGL_withoutGL ); 153 // PENDING: DICOM-konform, aber unvollstaendig 154 virtual OFCondition verify( OFBool autocorrect = OFFalse ); 155 }; 156 157 #endif // DCDICDIR_H 158