]> Creatis software - gdcm.git/commitdiff
- Set a decent value to 'Media Storage SOP Instance UID' and
authorjpr <jpr>
Thu, 3 Nov 2005 14:29:23 +0000 (14:29 +0000)
committerjpr <jpr>
Thu, 3 Nov 2005 14:29:23 +0000 (14:29 +0000)
  'Implementation Class UID' for DICOMDIR

- Add DicomDirMeta::ComputeGroup0002Length() to fix (now variable)
  group 0002 length

src/gdcmDicomDirMeta.cxx
src/gdcmDicomDirMeta.h

index b6dec1c957d0535556bb00c673040b55ef22d263..1c4e45b04a35d402a80086c919f9afcfac617403 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDicomDirMeta.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/11/03 11:08:18 $
-  Version:   $Revision: 1.29 $
+  Date:      $Date: 2005/11/03 14:29:23 $
+  Version:   $Revision: 1.30 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -20,6 +20,7 @@
 #include "gdcmDocument.h"
 #include "gdcmDocEntry.h"
 #include "gdcmGlobal.h"
+#include "gdcmUtil.h"
 #include "gdcmDataEntry.h"
 namespace gdcm 
 {
@@ -37,9 +38,7 @@ DicomDirMeta::DicomDirMeta(bool empty):
       ListDicomDirStudyElem const &elemList = 
          Global::GetDicomDirElements()->GetDicomDirMetaElements();
       FillObject(elemList);
-
       SetEntryBinArea(fmiv, 0x0002,0x0001, 2); 
-             
    }
 }
 
@@ -60,6 +59,20 @@ DicomDirMeta::~DicomDirMeta()
  */ 
 void DicomDirMeta::WriteContent(std::ofstream *fp, FileType filetype)
 {   
+   // 'Media Storage SOP Instance UID'   
+   DataEntry *e00002_0013 = GetDataEntry(0x0002,0x0013);
+   e00002_0013->SetString(Util::CreateUniqueUID());
+
+   // 'Implementation Class UID'
+   DataEntry *e00002_0012 = GetDataEntry(0x0002,0x0012);
+   e00002_0012->SetString(Util::CreateUniqueUID());   
+   
+   // Entry : 0002|0000 = group length -> recalculated
+   DataEntry *e0000 = GetDataEntry(0x0002,0x0000);
+   std::ostringstream sLen;
+   sLen << ComputeGroup0002Length( );
+   e0000->SetString(sLen.str());
+   
    for (ListDocEntry::iterator i = DocEntries.begin();  
                               i != DocEntries.end();
                               ++i)
@@ -68,6 +81,46 @@ void DicomDirMeta::WriteContent(std::ofstream *fp, FileType filetype)
    }
 }
 
+/**
+ * \brief Re-computes the length of the Dicom group 0002 (in the DicomDirMeta)
+ */
+int DicomDirMeta::ComputeGroup0002Length( ) 
+{
+   uint16_t gr;
+   VRKey vr;
+   
+   int groupLength = 0;
+   bool found0002 = false;   
+  
+   // for each Tag in the DicomDirMeta
+   DocEntry *entry = GetFirstEntry();
+   while( entry )
+   {
+      gr = entry->GetGroup();
+
+      if ( gr == 0x0002 )
+      {
+         found0002 = true;
+
+         if ( entry->GetElement() != 0x0000 )
+         {
+            vr = entry->GetVR();
+
+            if ( vr == "OB" ) 
+            {
+               groupLength +=  4;
+            }
+            groupLength += 2 + 2 + 4 + entry->GetLength();   
+         }
+      }
+      else if (found0002 )
+         break;
+
+      entry = GetNextEntry();
+   }
+   return groupLength; 
+}
+
 //-----------------------------------------------------------------------------
 // Protected
 
index 96403f23c0ecb8c15ab61ce017bd8352a540ff93..b8015d1ce5919c8eeb060dfa20b55ad37312f675 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDicomDirMeta.h,v $
   Language:  C++
-  Date:      $Date: 2005/10/25 14:52:33 $
-  Version:   $Revision: 1.19 $
+  Date:      $Date: 2005/11/03 14:29:23 $
+  Version:   $Revision: 1.20 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -37,7 +37,8 @@ public:
 
    virtual void Print(std::ostream &os = std::cout, std::string const &indent = "" );
    virtual void WriteContent(std::ofstream *fp, FileType t);
-
+   int ComputeGroup0002Length( );
+   
 protected:
    DicomDirMeta(bool empty=false); 
    ~DicomDirMeta();