1 /*=========================================================================
4 Module: $RCSfile: gdcmDicomDirMeta.cxx,v $
6 Date: $Date: 2007/10/08 15:20:17 $
7 Version: $Revision: 1.40 $
9 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10 l'Image). All rights reserved. See Doc/License.txt or
11 http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
13 This software is distributed WITHOUT ANY WARRANTY; without even
14 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 PURPOSE. See the above copyright notices for more information.
17 =========================================================================*/
19 #include "gdcmDicomDirMeta.h"
20 #include "gdcmDocument.h"
21 #include "gdcmDocEntry.h"
22 #include "gdcmGlobal.h"
24 #include "gdcmDataEntry.h"
26 namespace GDCM_NAME_SPACE
28 //-----------------------------------------------------------------------------
29 // Constructor / Destructor
33 DicomDirMeta::DicomDirMeta(bool empty):
38 ListDicomDirStudyElem const &elemList =
39 Global::GetDicomDirElements()->GetDicomDirMetaElements();
45 * \brief Canonical destructor.
47 DicomDirMeta::~DicomDirMeta()
51 //-----------------------------------------------------------------------------
54 * \brief Writes the Meta Elements
55 * @param fp ofstream to write to
56 * @param filetype type of the file (ImplicitVR, ExplicitVR, JPEG, JPEG2000 ...)
59 void DicomDirMeta::WriteContent(std::ofstream *fp, FileType filetype,
62 // 'File Meta Information Version'
64 uint8_t fmiv[2] = {0x02,0x00};
65 // FIXME : the following doesn't make the job (?!?)
66 //SetEntryBinArea(fmiv, 0x0002,0x0001, 2);
67 DataEntry *e00002_0001 = GetDataEntry(0x0002,0x0001);
68 e00002_0001->CopyBinArea(fmiv, 2);
70 // 'Media Storage SOP Instance UID'
71 DataEntry *e00002_0003 = GetDataEntry(0x0002,0x0003);
72 e00002_0003->SetString(Util::CreateUniqueUID());
74 // 'Implementation Class UID'
75 DataEntry *e00002_0012 = GetDataEntry(0x0002,0x0012);
76 e00002_0012->SetString(Util::CreateUniqueUID());
78 // Entry : 0002|0000 = group length -> recalculated
79 DataEntry *e0000 = GetDataEntry(0x0002,0x0000);
80 std::ostringstream sLen;
81 sLen << ComputeGroup0002Length( );
82 e0000->SetString(sLen.str());
84 for (ListDocEntry::iterator i = DocEntries.begin();
88 // true : we are in MetaElements
89 (*i)->WriteContent(fp, filetype, true, false);
94 * \brief Re-computes the length of the Dicom group 0002 (in the DicomDirMeta)
96 int DicomDirMeta::ComputeGroup0002Length( )
102 bool found0002 = false;
104 // for each Tag in the DicomDirMeta
105 DocEntry *entry = GetFirstEntry();
108 gr = entry->GetGroup();
114 if ( entry->GetElement() != 0x0000 )
122 groupLength += 2 + 2 + 4 + entry->GetLength();
128 entry = GetNextEntry();
133 //-----------------------------------------------------------------------------
136 //-----------------------------------------------------------------------------
139 //-----------------------------------------------------------------------------
142 * \brief Prints the Meta Elements
143 * @param os ostream to write to
144 * @param indent Indentation string to be prepended during printing
146 void DicomDirMeta::Print(std::ostream &os, std::string const & )
148 os << "META" << std::endl;
149 // warning : META doesn't behave exactly like a Objet
150 for (ListDocEntry::iterator i = DocEntries.begin();
151 i != DocEntries.end();
154 (*i)->SetPrintLevel(PrintLevel);
160 //-----------------------------------------------------------------------------
161 } // end namespace gdcm