# TraverseModules.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.

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

    #include "gdcmDefs.h"
    #include "gdcmGlobal.h"
    #include "gdcmIODs.h"
    #include "gdcmIOD.h"
    #include "gdcmMacros.h"
    #include "gdcmIODEntry.h"
    #include "gdcmModules.h"
    #include "gdcmModule.h"
    #include "gdcmAnonymizer.h"
    #include "gdcmDicts.h"

    int main(int argc, char *argv[])
    {
      using namespace gdcm;
      static Global &g = Global::GetInstance();

      if( !g.LoadResourcesFiles() )
        {
        return 1;
        }

      static const Defs &defs = g.GetDefs();
      static const Modules &modules = defs.GetModules();
      static const IODs &iods = defs.GetIODs();
      static const Macros &macros = defs.GetMacros();
      static const Dicts &dicts = g.GetDicts();

      std::vector<Tag> tags = gdcm::Anonymizer::GetBasicApplicationLevelConfidentialityProfileAttributes();
      for( std::vector<Tag>::const_iterator tit = tags.begin(); tit != tags.end(); ++tit )
        {
        const Tag &tag = *tit;
        const DictEntry &dictentry = dicts.GetDictEntry(tag);
        std::cout << "Processing Attribute: " << tag << " " << dictentry << std::endl;

        IODs::IODMapTypeConstIterator it = iods.Begin();
        for( ; it != iods.End(); ++it )
          {
          const IODs::IODName &name = it->first;
          const IOD &iod = it->second;

          const unsigned int niods = iod.GetNumberOfIODs();
          // Iterate over each iod entry in order:
          for(unsigned int idx = 0; idx < niods; ++idx)
            {
            const IODEntry &iodentry = iod.GetIODEntry(idx);
            const char *ref = iodentry.GetRef();
            //Usage::UsageType ut = iodentry.GetUsageType();

            const Module &module = modules.GetModule( ref );
            if( module.FindModuleEntryInMacros(macros, tag ) )
              {
              const ModuleEntry &module_entry = module.GetModuleEntryInMacros(macros,tag);
              Type type = module_entry.GetType();
              std::cout << "IOD Name: " << name << std::endl;
              std::cout << "Type: " << type << std::endl;
              }
            }

          }
        }

      return 0;
    }