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