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