]> Creatis software - gdcm.git/blobdiff - src/gdcmDicomDir.cxx
* DEVELOPPER spread out in Doc/Website/Developpers.html, CodingStyle.html,
[gdcm.git] / src / gdcmDicomDir.cxx
index 6ad223049f8f724052dc0e40e82d92ce34367fec..196156a7d7c8010705cd44eb6d631f88a1dc9509 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDicomDir.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/08/27 15:48:44 $
-  Version:   $Revision: 1.65 $
+  Date:      $Date: 2004/09/24 11:39:21 $
+  Version:   $Revision: 1.69 $
   
   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
@@ -236,8 +233,8 @@ void gdcmDicomDir::ParseDirectory()
  * @param   argDelete    Argument 
  * \warning In python : the arg parameter isn't considered
  */
-void gdcmDicomDir::SetStartMethod(gdcmMethod *method, void *arg, 
-                                  gdcmMethod *argDelete )
+void gdcmDicomDir::SetStartMethod(gdcmMethod* method, void* arg, 
+                                  gdcmMethodargDelete )
 {
    if( startArg && startMethodArgDelete )
    {
@@ -256,7 +253,7 @@ void gdcmDicomDir::SetStartMethod(gdcmMethod *method, void *arg,
  *          class is destroyed
  * @param   method Method to call to delete the argument
  */
-void gdcmDicomDir::SetStartMethodArgDelete(gdcmMethod *method) 
+void gdcmDicomDir::SetStartMethodArgDelete(gdcmMethodmethod) 
 {
    startMethodArgDelete = method;
 }
@@ -269,8 +266,8 @@ void gdcmDicomDir::SetStartMethodArgDelete(gdcmMethod *method)
  * @param   argDelete    Argument  
  * \warning In python : the arg parameter isn't considered
  */
-void gdcmDicomDir::SetProgressMethod(gdcmMethod *method, void *arg, 
-                                     gdcmMethod *argDelete )
+void gdcmDicomDir::SetProgressMethod(gdcmMethod* method, void* arg, 
+                                     gdcmMethodargDelete )
 {
    if( progressArg && progressMethodArgDelete )
    {
@@ -289,7 +286,7 @@ void gdcmDicomDir::SetProgressMethod(gdcmMethod *method, void *arg,
  *          class is destroyed          
  * @param   method Method to call to delete the argument
  */
-void gdcmDicomDir::SetProgressMethodArgDelete(gdcmMethod *method)
+void gdcmDicomDir::SetProgressMethodArgDelete(gdcmMethodmethod)
 {
    progressMethodArgDelete = method;
 }
@@ -302,8 +299,8 @@ void gdcmDicomDir::SetProgressMethodArgDelete(gdcmMethod *method)
  * @param   argDelete    Argument 
  * \warning In python : the arg parameter isn't considered
  */
-void gdcmDicomDir::SetEndMethod(gdcmMethod *method, void *arg, 
-                                gdcmMethod *argDelete )
+void gdcmDicomDir::SetEndMethod(gdcmMethod* method, void* arg, 
+                                gdcmMethodargDelete )
 {
    if( endArg && endMethodArgDelete )
    {
@@ -322,7 +319,7 @@ void gdcmDicomDir::SetEndMethod(gdcmMethod *method, void *arg,
  *          is destroyed
  * @param   method Method to call to delete the argument
  */
-void gdcmDicomDir::SetEndMethodArgDelete(gdcmMethod *method)
+void gdcmDicomDir::SetEndMethodArgDelete(gdcmMethodmethod)
 {
    endMethodArgDelete = method;
 }
@@ -339,12 +336,12 @@ 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 sq[4] = { 0x0004, 0x1220, 0xffff, 0xffff };
    uint16_t sqt[4]= { 0xfffe, 0xe0dd, 0xffff, 0xffff };
 
-   FILE * fp = fopen(fileName.c_str(), "wb");
+   FILE* fp = fopen(fileName.c_str(), "wb");
    if( !fp ) 
    {
       printf("Failed to open(write) File [%s] \n", fileName.c_str());
@@ -356,17 +353,12 @@ 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  // VR no written for 'No length' Sequences !
-   //fwrite(&sq[2],6,1,fp);  // 00 ffffffff
-   fwrite(&sq[3],4,1,fp);  // ffffffff 
+   fwrite(&sq[0],8,1,fp);  // 0004 1220 ffff ffff
         
    for(ListDicomDirPatient::iterator cc = patients.begin();cc!=patients.end();++cc)
    {
@@ -418,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:
@@ -425,6 +418,7 @@ void gdcmDicomDir::CreateDicomDirChainedList(std::string const & path)
          dbg.Verbose( 1,
                       "gdcmDicomDir::CreateDicomDirChainedList: readable ",
                       it->c_str() );
+
        }
        else
        {
@@ -432,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();
 }
 
@@ -456,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;
@@ -467,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
  */
@@ -492,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      
@@ -546,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
  */
@@ -580,7 +560,6 @@ void gdcmDicomDir::SetElement(std::string &path,gdcmDicomDirType type,
   
       case GDCM_DICOMDIR_META:
          elemList = gdcmGlobal::GetDicomDirElements()->GetDicomDirMetaElements();
-         // add already done ?
          break;
 
       default:
@@ -670,8 +649,8 @@ 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;
-         entry->Print(); // just to see 
+         std::cout << "GDCM_DICOMDIR_META ?!? should never print that" 
+                   << std::endl;
       }
       si->AddEntry(entry);
    }
@@ -925,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 )
    {
@@ -976,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;
-///
-}
-
 //-----------------------------------------------------------------------------