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
00031
00032
00033
00034 #ifndef DCDICDIR_H
00035 #define DCDICDIR_H
00036
00037 #include "dcmtk/config/osconfig.h"
00038
00039 #include "dcmtk/ofstd/ofconsol.h"
00040 #include "dcmtk/dcmdata/dctypes.h"
00041 #include "dcmtk/dcmdata/dcitem.h"
00042 #include "dcmtk/dcmdata/dcfilefo.h"
00043 #include "dcmtk/dcmdata/dcsequen.h"
00044 #include "dcmtk/dcmdata/dcdirrec.h"
00045 #include "dcmtk/dcmdata/dcvrulup.h"
00046
00047
00048 #define DEFAULT_DICOMDIR_NAME "DICOMDIR"
00049 #define TEMPNAME_TEMPLATE "DDXXXXXX"
00050 #define DICOMDIR_BACKUP_SUFFIX ".$$$"
00051 #define DICOMDIR_DEFAULT_TRANSFERSYNTAX EXS_LittleEndianExplicit
00052
00053
00054 typedef struct
00055 {
00056 DcmItem *item;
00057 Uint32 fileOffset;
00058 } ItemOffset;
00059
00060
00061 class DcmDicomDir
00062 {
00063 private:
00064
00065
00066
00067 DcmDicomDir &operator=(const DcmDicomDir &);
00068 DcmDicomDir( const DcmDicomDir &newDir );
00069
00070 protected:
00071 OFCondition errorFlag;
00072 char * dicomDirFileName;
00073 OFBool modified;
00074 OFBool mustCreateNewDir;
00075 DcmFileFormat * DirFile;
00076 DcmDirectoryRecord * RootRec;
00077 DcmSequenceOfItems * MRDRSeq;
00078
00079
00080 OFCondition createNewElements(const char* fileSetID);
00081 DcmDataset& getDataset(void);
00082
00083
00084 DcmSequenceOfItems& getDirRecSeq( DcmDataset &dset );
00085 DcmUnsignedLongOffset* lookForOffsetElem( DcmObject *obj,
00086 const DcmTagKey &offsetTag );
00087 DcmDirectoryRecord* recurseMatchFile( DcmDirectoryRecord* startRec,
00088 char *filename );
00089 DcmDirectoryRecord* searchMatchFile( DcmSequenceOfItems& recSeq,
00090 char *filename );
00091 OFCondition resolveGivenOffsets( DcmObject *startPoint,
00092 ItemOffset *itOffsets,
00093 const unsigned long numOffsets,
00094 const DcmTagKey &offsetTag );
00095 OFCondition resolveAllOffsets( DcmDataset &dset );
00096 OFCondition linkMRDRtoRecord( DcmDirectoryRecord *dRec );
00097 OFCondition moveRecordToTree( DcmDirectoryRecord *startRec,
00098 DcmSequenceOfItems &fromDirSQ,
00099 DcmDirectoryRecord *toRecord );
00100 OFCondition moveMRDRbetweenSQs( DcmSequenceOfItems &fromSQ,
00101 DcmSequenceOfItems &toDirSQ );
00102 Uint32 lengthUntilSQ( DcmDataset &dset,
00103 E_TransferSyntax oxfer,
00104 E_EncodingType enctype );
00105 Uint32 lengthOfRecord( DcmItem *item,
00106 E_TransferSyntax oxfer,
00107 E_EncodingType enctype );
00108 OFCondition convertGivenPointer( DcmObject *startPoint,
00109 ItemOffset *itOffsets,
00110 const unsigned long numOffsets,
00111 const DcmTagKey &offsetTag );
00112 OFCondition convertAllPointer( DcmDataset &dset,
00113 Uint32 beginOfFileSet,
00114 E_TransferSyntax oxfer,
00115 E_EncodingType enctype );
00116 OFCondition copyRecordPtrToSQ( DcmDirectoryRecord *record,
00117 DcmSequenceOfItems &toDirSQ,
00118 DcmDirectoryRecord **firstRec,
00119 DcmDirectoryRecord **lastRec );
00120 OFCondition insertMediaSOPUID( DcmMetaInfo &metaInfo );
00121 OFCondition countMRDRRefs( DcmDirectoryRecord *startRec,
00122 ItemOffset *refCounter,
00123 const unsigned long numCounters );
00124 OFCondition checkMRDRRefCounter( DcmDirectoryRecord *startRec,
00125 ItemOffset *refCounter,
00126 const unsigned long numCounters );
00127
00128
00129 OFCondition convertLinearToTree();
00130 OFCondition convertTreeToLinear( Uint32 beginOfFileSet,
00131 E_TransferSyntax oxfer,
00132 E_EncodingType enctype,
00133 E_GrpLenEncoding glenc,
00134 DcmSequenceOfItems &unresRecs);
00135
00136 public:
00137 DcmDicomDir();
00138 DcmDicomDir( const char *fileName,
00139 const char *fileSetID = NULL );
00140 virtual ~DcmDicomDir();
00141
00142 virtual void print(ostream &out,
00143 const size_t flags = 0,
00144 const int level = 0,
00145 const char *pixelFileName = NULL,
00146 size_t *pixelCounter = NULL);
00147
00148 virtual OFCondition error();
00149 virtual DcmFileFormat& getDirFileFormat();
00150 virtual const char* getDirFileName();
00151 virtual DcmDirectoryRecord& getRootRecord();
00152 virtual DcmSequenceOfItems& getMRDRSequence();
00153 virtual DcmDirectoryRecord* matchFilename( char *filename );
00154 virtual DcmDirectoryRecord* matchOrCreateMRDR( char *filename );
00155 virtual OFCondition write(const E_TransferSyntax oxfer
00156 = DICOMDIR_DEFAULT_TRANSFERSYNTAX,
00157 const E_EncodingType enctype
00158 = EET_UndefinedLength,
00159 const E_GrpLenEncoding glenc
00160 = EGL_withoutGL );
00161
00162 virtual OFCondition verify( OFBool autocorrect = OFFalse );
00163 };
00164
00165 #endif // DCDICDIR_H
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248