# ReadAndDumpDICOMDIR.cxx

    /*=========================================================================

      Program: GDCM (Grassroots DICOM). A DICOM library
      Module:  $URL$

      Copyright (c) 2006-2010 Mathieu Malaterre
      All rights reserved.
      See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.

         This software is distributed WITHOUT ANY WARRANTY; without even
         the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
         PURPOSE.  See the above copyright notice for more information.

    =========================================================================*/
    /*
     * This example shows how to read and dump a DICOMDIR File
     *
     * Thanks:
     *   Tom Marynowski (lordglub gmail) for contributing this example
     */
    #include "gdcmReader.h"
    #include "gdcmMediaStorage.h"

    typedef std::set<gdcm::DataElement> DataElementSet;
    typedef DataElementSet::const_iterator ConstIterator;

    int main(int argc, char *argv [])
    {
      if( argc < 2 ) return 1;
      const char *filename = argv[1];

      gdcm::Reader reader;
      reader.SetFileName( filename);
      if( !reader.Read() )
        {
        std::cerr << "Could not read: " << filename << std::endl;
        return 1;
        }
      std::stringstream strm;

      gdcm::File &file = reader.GetFile();
      gdcm::DataSet &ds = file.GetDataSet();
      gdcm::FileMetaInformation &fmi = file.GetHeader();

      gdcm::MediaStorage ms;
      ms.SetFromFile(file);
      if( ms != gdcm::MediaStorage::MediaStorageDirectoryStorage )
        {
        std::cout << "This file is not a DICOMDIR" << std::endl;
        return 1;
        }

      if (fmi.FindDataElement( gdcm::Tag (0x0002, 0x0002)))
        {   strm.str("");
        fmi.GetDataElement( gdcm::Tag (0x0002, 0x0002) ).GetValue().Print(strm);
        }
      else
        {
        std::cerr << " Media Storage Sop Class UID not present" << std::cout;
        }

      //TODO il faut trimer strm.str() avant la comparaison au cas ou...
      if ("1.2.840.10008.1.3.10"!=strm.str())
        {
        std::cout << "This file is not a DICOMDIR" << std::endl;
        return 1;
        }

      ConstIterator it = ds.GetDES().begin();

      for( ; it != ds.GetDES().end(); ++it)
        {

        if (it->GetTag()==gdcm::Tag (0x0004, 0x1220))
          {

          const gdcm::DataElement &de = (*it);
          // ne pas utiliser GetSequenceOfItems pour extraire les items
          gdcm::SmartPointer<gdcm::SequenceOfItems> sqi =de.GetValueAsSQ();
          int itemused = 1;
          while (itemused<=sqi->GetNumberOfItems())

            {
            strm.str("");

            if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0004, 0x1430)))
              sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0004, 0x1430)).GetValue().Print(strm);

            //TODO il faut trimer strm.str() avant la comparaison
            while((strm.str()=="PATIENT")||((strm.str()=="PATIENT ")))
              {
              std::cout << strm.str() << std::endl;
              strm.str("");
              if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0010, 0x0010)))
                sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0010, 0x0010)).GetValue().Print(strm);
              std::cout << "PATIENT NAME : " << strm.str() << std::endl;

              //PATIENT ID
              strm.str("");
              if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0010, 0x0020)))
                sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0010, 0x0020)).GetValue().Print(strm);
              std::cout << "PATIENT ID : " << strm.str() << std::endl;

              /*ADD TAG TO READ HERE*/
              std::cout << "=========================== "  << std::endl;
              itemused++;
              strm.str("");
              if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0004, 0x1430)))
                sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0004, 0x1430)).GetValue().Print(strm);

              //TODO il faut trimer strm.str() avant la comparaison
              while((strm.str()=="STUDY")||((strm.str()=="STUDY ")))
                {
                std::cout << "  " << strm.str() << std::endl;
                //UID
                strm.str("");
                if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0020, 0x000d)))
                  sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0020, 0x000d)).GetValue().Print(strm);
                std::cout << "      STUDY UID : " << strm.str() << std::endl;

                //STUDY DATE
                strm.str("");
                if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0008, 0x0020)))
                  sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0008, 0x0020)).GetValue().Print(strm);
                std::cout << "      STUDY DATE : " << strm.str() << std::endl;

                //STUDY DESCRIPTION
                strm.str("");
                if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0008, 0x1030)))
                  sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0008, 0x1030)).GetValue().Print(strm);
                std::cout << "      STUDY DESCRIPTION : " << strm.str() << std::endl;

                /*ADD TAG TO READ HERE*/
                std::cout << "      " << "=========================== "  << std::endl;

                itemused++;
                strm.str("");
                if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0004, 0x1430)))
                  sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0004, 0x1430)).GetValue().Print(strm);

                //TODO il faut trimer strm.str() avant la comparaison
                while((strm.str()=="SERIES")||((strm.str()=="SERIES ")))
                  {
                  std::cout << "      " << strm.str() << std::endl;
                  strm.str("");
                  if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0020, 0x000e)))
                    sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0020, 0x000e)).GetValue().Print(strm);
                  std::cout << "          SERIE UID" << strm.str() << std::endl;

                  //SERIE MODALITY
                  strm.str("");
                  if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0008, 0x0060)))
                    sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0008, 0x0060)).GetValue().Print(strm);
                  std::cout << "          SERIE MODALITY" << strm.str() << std::endl;

                  //SERIE DESCRIPTION
                  strm.str("");
                  if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0008, 0x103e)))
                    sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0008, 0x103e)).GetValue().Print(strm);
                  std::cout << "          SERIE DESCRIPTION" << strm.str() << std::endl;

                  /*ADD TAG TO READ HERE*/

                  std::cout << "          " << "=========================== "  << std::endl;
                  itemused++;
                  strm.str("");
                  if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0004, 0x1430)))
                    sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0004, 0x1430)).GetValue().Print(strm);

                  //TODO il faut trimer strm.str() avant la comparaison
                  while ((strm.str()=="IMAGE")||((strm.str()=="IMAGE ")))
                    // if(tmp=="IMAGE")
                    {
                    std::cout << "          " << strm.str() << std::endl;

                    //UID
                    strm.str("");
                    if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0004, 0x1511)))
                      sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0004, 0x1511)).GetValue().Print(strm);
                    std::cout << "              IMAGE UID : " << strm.str() << std::endl;

                    //PATH de l'image
                    strm.str("");
                    if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0004, 0x1500)))
                      sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0004, 0x1500)).GetValue().Print(strm);
                    std::cout << "              IMAGE PATH : " << strm.str() << std::endl;
                    /*ADD TAG TO READ HERE*/

                    if(itemused <sqi->GetNumberOfItems())
                      {itemused++;
                      }else{break;}

                    strm.str("");

                    if (sqi->GetItem(itemused).FindDataElement(gdcm::Tag (0x0004, 0x1430)))
                      sqi->GetItem(itemused).GetDataElement(gdcm::Tag (0x0004, 0x1430)).GetValue().Print(strm);

                    }
                  }
                }
              }
            itemused++;
            }
          }
        }
      return 0;
    }