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 "osconfig.h"
00038
00039 #include "ofconsol.h"
00040 #include "dctypes.h"
00041 #include "dcitem.h"
00042 #include "dcfilefo.h"
00043 #include "dcsequen.h"
00044 #include "dcdirrec.h"
00045 #include "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
00069 protected:
00070 OFCondition errorFlag;
00071 char * dicomDirFileName;
00072 OFBool modified;
00073 OFBool mustCreateNewDir;
00074 DcmFileFormat * DirFile;
00075 DcmDirectoryRecord * RootRec;
00076 DcmSequenceOfItems * MRDRSeq;
00077
00078
00079 OFCondition createNewElements(const char* fileSetID);
00080 DcmDataset& getDataset(void);
00081
00082
00083 DcmSequenceOfItems& getDirRecSeq( DcmDataset &dset );
00084 DcmUnsignedLongOffset* lookForOffsetElem( DcmObject *obj,
00085 const DcmTagKey &offsetTag );
00086 DcmDirectoryRecord* recurseMatchFile( DcmDirectoryRecord* startRec,
00087 char *filename );
00088 DcmDirectoryRecord* searchMatchFile( DcmSequenceOfItems& recSeq,
00089 char *filename );
00090 OFCondition resolveGivenOffsets( DcmObject *startPoint,
00091 ItemOffset *itOffsets,
00092 const unsigned long numOffsets,
00093 const DcmTagKey &offsetTag );
00094 OFCondition resolveAllOffsets( DcmDataset &dset );
00095 OFCondition linkMRDRtoRecord( DcmDirectoryRecord *dRec );
00096 OFCondition moveRecordToTree( DcmDirectoryRecord *startRec,
00097 DcmSequenceOfItems &fromDirSQ,
00098 DcmDirectoryRecord *toRecord );
00099 OFCondition moveMRDRbetweenSQs( DcmSequenceOfItems &fromSQ,
00100 DcmSequenceOfItems &toDirSQ );
00101 Uint32 lengthUntilSQ( DcmDataset &dset,
00102 E_TransferSyntax oxfer,
00103 E_EncodingType enctype );
00104 Uint32 lengthOfRecord( DcmItem *item,
00105 E_TransferSyntax oxfer,
00106 E_EncodingType enctype );
00107 OFCondition convertGivenPointer( DcmObject *startPoint,
00108 ItemOffset *itOffsets,
00109 const unsigned long numOffsets,
00110 const DcmTagKey &offsetTag );
00111 OFCondition convertAllPointer( DcmDataset &dset,
00112 Uint32 beginOfFileSet,
00113 E_TransferSyntax oxfer,
00114 E_EncodingType enctype );
00115 OFCondition copyRecordPtrToSQ( DcmDirectoryRecord *record,
00116 DcmSequenceOfItems &toDirSQ,
00117 DcmDirectoryRecord **firstRec,
00118 DcmDirectoryRecord **lastRec );
00119 OFCondition insertMediaSOPUID( DcmMetaInfo &metaInfo );
00120 OFCondition countMRDRRefs( DcmDirectoryRecord *startRec,
00121 ItemOffset *refCounter,
00122 const unsigned long numCounters );
00123 OFCondition checkMRDRRefCounter( DcmDirectoryRecord *startRec,
00124 ItemOffset *refCounter,
00125 const unsigned long numCounters );
00126
00127
00128 OFCondition convertLinearToTree();
00129 OFCondition convertTreeToLinear( Uint32 beginOfFileSet,
00130 E_TransferSyntax oxfer,
00131 E_EncodingType enctype,
00132 E_GrpLenEncoding glenc,
00133 DcmSequenceOfItems &unresRecs);
00134
00135 public:
00136 DcmDicomDir();
00137 DcmDicomDir( const char *fileName,
00138 const char *fileSetID = NULL );
00139 DcmDicomDir( const DcmDicomDir &newDir );
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