]> Creatis software - gdcm.git/blobdiff - src/gdcmDicomDir.cxx
* Added Doc/Website/CodingStyle.html, Developpers.html,
[gdcm.git] / src / gdcmDicomDir.cxx
index fb5f55595e9b6c02e46af3dd2708d528e5a973ba..e920abfe2464db1cd6dba1299aec3e3bfa574962 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDicomDir.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/08/26 15:29:52 $
-  Version:   $Revision: 1.64 $
+  Date:      $Date: 2004/09/23 10:47:10 $
+  Version:   $Revision: 1.68 $
   
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -53,16 +53,14 @@ gdcmDicomDir::gdcmDicomDir()
    :gdcmDocument( )
 { 
    Initialize();  // sets all private fields to NULL
-
-   std::string pathBidon = "Bidon"; // Sorry, NULL not allowed ...
-   SetElement(pathBidon, GDCM_DICOMDIR_META, NULL); // Set the META elements
-   AddDicomDirMeta();
+   std::string pathBidon = "Bidon"; // Sorry, NULL not allowed ...   
+   metaElems = NewMeta();
 }
 
 /**
  * \brief Constructor Parses recursively the directory and creates the DicomDir
  *        or uses an already built DICOMDIR, depending on 'parseDir' value.
- * @param FileName        name 
+ * @param fileName        name 
  *                      - of the root directory (parseDir = true)
  *                      - of the DICOMDIR       (parseDir = false)
  * @param parseDir boolean
@@ -74,12 +72,11 @@ gdcmDicomDir::gdcmDicomDir()
 gdcmDicomDir::gdcmDicomDir(std::string const & fileName, bool parseDir ):
    gdcmDocument( fileName )
 {
-   // que l'on ai passe un root directory ou un DICOMDIR
-   // et quelle que soit la valeur de parseDir,
-   // on a deja lance gdcmDocument 
+   // Whatever user passed (a root directory or a DICOMDIR)
+   // and whatever the value of parseDir was,
+   // gdcmDocument is already executed
    Initialize();  // sets all private fields to NULL
 
-   // gdcmDocument already executed
    // if user passed a root directory, sure we didn't get anything
 
    if ( TagHT.begin() == TagHT.end() ) // when user passed a Directory to parse
@@ -339,10 +336,10 @@ void gdcmDicomDir::SetEndMethodArgDelete(gdcmMethod *method)
  * @return false only when fail to open
  */
  
-bool gdcmDicomDir::Write(std::string const & fileName) 
+bool gdcmDicomDir::WriteDicomDir(std::string const & fileName) 
 {  
-   uint16_t sq[5] = { 0x0004, 0x1220, 0x0000, 0xffff, 0xffff };
-   uint16_t sqt[3]= { 0xfffe, 0xe0dd, 0x0000 };
+   uint16_t sq[4] = { 0x0004, 0x1220, 0xffff, 0xffff };
+   uint16_t sqt[4]= { 0xfffe, 0xe0dd, 0xffff, 0xffff };
 
    FILE * fp = fopen(fileName.c_str(), "wb");
    if( !fp ) 
@@ -356,23 +353,21 @@ bool gdcmDicomDir::Write(std::string const & fileName)
    fwrite(filePreamble,128,1,fp);
    fwrite("DICM",4,1,fp);
    delete[] filePreamble;
- //  UpdateDirectoryRecordSequenceLength(); // TODO (if *really* usefull)
    gdcmDicomDirMeta *ptrMeta = GetDicomDirMeta();
    ptrMeta->Write(fp, gdcmExplicitVR);
    
    // force writing 0004|1220 [SQ ], that CANNOT exist within gdcmDicomDirMeta
-   fwrite(&sq[0],4,1,fp);  // 0004 1220 
-   fwrite("SQ"  ,2,1,fp);  // SQ
-   fwrite(&sq[2],6,1,fp);  // 00 ffffffff
-      
+   fwrite(&sq[0],8,1,fp);  // 0004 1220 ffff ffff
+        
    for(ListDicomDirPatient::iterator cc = patients.begin();cc!=patients.end();++cc)
    {
       (*cc)->Write( fp, gdcmExplicitVR );
    }
+   
    // force writing Sequence Delimitation Item
-   fwrite(&sqt[0],4,1,fp);  // fffe e0dd 
-   fwrite("UL"   ,2,1,fp);  // UL
-   fwrite(&sqt[2],1,1,fp);  // 00 
+   fwrite(&sqt[0],8,1,fp);  // fffe e0dd ffff ffff 
+
    fclose( fp );
    return true;
 }
@@ -415,6 +410,7 @@ void gdcmDicomDir::CreateDicomDirChainedList(std::string const & path)
                       "failure in new Header ",
                       it->c_str() );
       }
+      
       if( header->IsReadable() )
       {
          // Add the file header to the chained list:
@@ -422,6 +418,7 @@ void gdcmDicomDir::CreateDicomDirChainedList(std::string const & path)
          dbg.Verbose( 1,
                       "gdcmDicomDir::CreateDicomDirChainedList: readable ",
                       it->c_str() );
+
        }
        else
        {
@@ -429,14 +426,12 @@ void gdcmDicomDir::CreateDicomDirChainedList(std::string const & path)
        }
        count++;
    }
-
    // sorts Patient/Study/Serie/
    std::sort(list.begin(), list.end(), gdcmDicomDir::HeaderLessThan );
-
-   std::string tmp = fileList.GetDirName();
-      
+   
+   std::string tmp = fileList.GetDirName();      
    //for each Header of the chained list, add/update the Patient/Study/Serie/Image info
-   SetElements(tmp, list);      
+   SetElements(tmp, list);
    CallEndMethod();
 }
 
@@ -453,7 +448,7 @@ gdcmDicomDirMeta * gdcmDicomDir::NewMeta()
    { 
       TagDocEntryHT::iterator lastOneButSequence = TagHT.end();
       lastOneButSequence --;
-      // This works because ALL the 'out of Sequence' Tags belong to Meta Elems
+      // ALL the 'out of Sequence' Tags belong to Meta Elems
       // (we skip 0004|1220 [Directory record sequence] )
       for ( TagDocEntryHT::iterator cc  = TagHT.begin(); 
                                     cc != lastOneButSequence;
@@ -464,19 +459,14 @@ gdcmDicomDirMeta * gdcmDicomDir::NewMeta()
    }
    else  // after root directory parsing
    {
-     //cout << "gdcmDicomDir::NewMeta avec FillObject" << endl;
      std::list<gdcmElement> elemList;
      elemList=gdcmGlobal::GetDicomDirElements()->GetDicomDirMetaElements();
      m->FillObject(elemList);
-     // we create the Sequence manually
-     //gdcmSeqEntry *se =NewSeqEntryByNumber(0x0004, 0x1220); // NOT YET!
-     //m->AddEntry(se);
     }
    m->SetSQItemNumber(0); // To avoid further missprinting
    return m;  
 }
 
-
 /**
  * \brief   adds a new Patient (with the basic elements) to a partially created DICOMDIR
  */
@@ -489,13 +479,6 @@ gdcmDicomDirPatient * gdcmDicomDir::NewPatient()
 
    std::list<gdcmElement> elemList;   
    elemList=gdcmGlobal::GetDicomDirElements()->GetDicomDirPatientElements(); 
-// Looks nice, but gdcmDicomDir IS NOT a gdcmObject ... 
-//   gdcmDicomDirPatient *p = new gdcmDicomDirPatient(ptagHT);
-//   FillObject(elemList);
-//   patients.push_front( p );
-//   return p;    
-/// \todo TODO : find a trick to use FillObject !!!
-
    gdcmSQItem *s = new gdcmSQItem(0);
 
    // for all the DicomDirPatient Elements      
@@ -543,7 +526,7 @@ gdcmDicomDirPatient * gdcmDicomDir::NewPatient()
  * \brief   adds to the HTable 
  *          the gdcmEntries (Dicom Elements) corresponding to the given type
  * @param   path full path file name (only used when type = GDCM_DICOMDIR_IMAGE
- * @param   type gdcmObject type to create (GDCM_DICOMDIR_PATIENT,
+ * @param   type gdcmDicomDirObject type to create (GDCM_DICOMDIR_PATIENT,
  *          GDCM_DICOMDIR_STUDY, GDCM_DICOMDIR_SERIE ...)
  * @param   header gdcmHeader of the current file
  */
@@ -577,7 +560,6 @@ void gdcmDicomDir::SetElement(std::string &path,gdcmDicomDirType type,
   
       case GDCM_DICOMDIR_META:
          elemList = gdcmGlobal::GetDicomDirElements()->GetDicomDirMetaElements();
-         // add already done ?
          break;
 
       default:
@@ -666,7 +648,10 @@ void gdcmDicomDir::SetElement(std::string &path,gdcmDicomDirType type,
       }
 
       if ( type == GDCM_DICOMDIR_META ) // fusible : should never print !
-         std::cout << " special Treatment for GDCM_DICOMDIR_META" << std::endl;
+      {
+         std::cout << "GDCM_DICOMDIR_META ?!? should never print that" 
+                   << std::endl;
+      }
       si->AddEntry(entry);
    }
    switch( type )
@@ -919,8 +904,6 @@ void gdcmDicomDir::SetElements(std::string &path, VectDocument &list)
    std::string studCurInstanceUID, studCurID;
    std::string serCurInstanceUID,  serCurID;
 
-   //SetElement( path, GDCM_DICOMDIR_META,NULL); // already done (NewMeta) 
-
    for( VectDocument::iterator it = list.begin();
                               it != list.end(); ++it )
    {
@@ -970,36 +953,4 @@ bool gdcmDicomDir::HeaderLessThan(gdcmDocument *header1, gdcmDocument *header2)
    return *header1 < *header2;
 }
 
-/**
- * \brief   Sets the accurate value for the (0x0004,0x1220) element of a DICOMDIR
- */
-void gdcmDicomDir::UpdateDirectoryRecordSequenceLength()
-{
-
-/// \todo FIXME : to go on compiling
-///
-/// to be re written !
-///   int offset = 0;
-///   ListTag::iterator it;
-///   uint16_t gr, el;
-///   std::string vr;
-///   for(it=listEntries.begin();it!=listEntries.end();++it) {
-///      gr = (*it)->GetGroup();
-///      el = (*it)->GetElement();
-///      vr = (*it)->GetVR();      
-///      if (gr !=0xfffe) {
-///         if ( (vr == "OB") || (vr == "OW") || (vr == "SQ") ) {    
-///            offset +=  4; // explicit VR AND OB, OW, SQ : 4 more bytes
-///         }         
-///         offset += 2 + 2 + 4 + (*it)->GetLength(); 
-///      } else {
-///         offset +=  4; // delimiters don't have a value.     
-///      }            
-///   }   
-///   //bool res=SetEntryLengthByNumber(offset, 0x0004, 0x1220); // Hope there is no dupps.
-///    SetEntryLengthByNumber(offset, 0x0004, 0x1220); // Hope there is no dupps.
-///   return;
-///
-}
-
 //-----------------------------------------------------------------------------