00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "gdcmDicomDirMeta.h"
00020 #include "gdcmDocument.h"
00021 #include "gdcmDocEntry.h"
00022 #include "gdcmGlobal.h"
00023 #include "gdcmUtil.h"
00024 #include "gdcmDataEntry.h"
00025
00026 namespace GDCM_NAME_SPACE
00027 {
00028
00029
00033 DicomDirMeta::DicomDirMeta(bool empty):
00034 DicomDirObject()
00035 {
00036 if ( !empty )
00037 {
00038 ListDicomDirStudyElem const &elemList =
00039 Global::GetDicomDirElements()->GetDicomDirMetaElements();
00040 FillObject(elemList);
00041 }
00042 }
00043
00047 DicomDirMeta::~DicomDirMeta()
00048 {
00049 }
00050
00051
00052
00059 void DicomDirMeta::WriteContent(std::ofstream *fp, FileType filetype,
00060 bool insideMetaElements)
00061 {
00062
00063
00064 uint8_t fmiv[2] = {0x02,0x00};
00065
00066
00067 DataEntry *e00002_0001 = GetDataEntry(0x0002,0x0001);
00068 e00002_0001->CopyBinArea(fmiv, 2);
00069
00070
00071 DataEntry *e00002_0003 = GetDataEntry(0x0002,0x0003);
00072 e00002_0003->SetString(Util::CreateUniqueUID());
00073
00074
00075 DataEntry *e00002_0012 = GetDataEntry(0x0002,0x0012);
00076 e00002_0012->SetString(Util::CreateUniqueUID());
00077
00078
00079 DataEntry *e0000 = GetDataEntry(0x0002,0x0000);
00080 std::ostringstream sLen;
00081 sLen << ComputeGroup0002Length( );
00082 e0000->SetString(sLen.str());
00083
00084 for (ListDocEntry::iterator i = DocEntries.begin();
00085 i!= DocEntries.end();
00086 ++i)
00087 {
00088
00089 (*i)->WriteContent(fp, filetype, true);
00090 }
00091 }
00092
00096 int DicomDirMeta::ComputeGroup0002Length( )
00097 {
00098 uint16_t gr;
00099 VRKey vr;
00100
00101 int groupLength = 0;
00102 bool found0002 = false;
00103
00104
00105 DocEntry *entry = GetFirstEntry();
00106 while( entry )
00107 {
00108 gr = entry->GetGroup();
00109
00110 if ( gr == 0x0002 )
00111 {
00112 found0002 = true;
00113
00114 if ( entry->GetElement() != 0x0000 )
00115 {
00116 vr = entry->GetVR();
00117
00118 if ( vr == "OB" )
00119 {
00120 groupLength += 4;
00121 }
00122 groupLength += 2 + 2 + 4 + entry->GetLength();
00123 }
00124 }
00125 else if (found0002 )
00126 break;
00127
00128 entry = GetNextEntry();
00129 }
00130 return groupLength;
00131 }
00132
00133
00134
00135
00136
00137
00138
00139
00140
00146 void DicomDirMeta::Print(std::ostream &os, std::string const & )
00147 {
00148 os << "META" << std::endl;
00149
00150 for (ListDocEntry::iterator i = DocEntries.begin();
00151 i != DocEntries.end();
00152 ++i)
00153 {
00154 (*i)->SetPrintLevel(PrintLevel);
00155 (*i)->Print();
00156 os << std::endl;
00157 }
00158 }
00159
00160
00161 }