# BasicAnonymizer.cs

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

      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.

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

    /*
     * Usage:
     * $ export LD_LIBRARY_PATH=$HOME/Projects/gdcm/debug-gcc/bin
     * $ mono bin/BasicAnonymizer.exe gdcmData/012345.002.050.dcm out.dcm
     */
    using System;
    using gdcm;

    public class MyWatcher : SimpleSubjectWatcher
    {
      public MyWatcher(Subject s):base(s,"Override String"){}
      protected override void StartFilter() {
        System.Console.WriteLine( "This is my start" );
      }
      protected override void EndFilter(){
        System.Console.WriteLine( "This is my end" );
      }
      protected override void ShowProgress(Subject caller, Event evt){
        ProgressEvent pe = ProgressEvent.Cast(evt);
        System.Console.WriteLine( "This is my progress: " + pe.GetProgress() );
      }
      protected override void ShowIteration(){
        System.Console.WriteLine( "This is my iteration" );
      }
      protected override void ShowAnonymization(Subject caller, Event evt){
    /*
     * A couple of explanation are necessary here to understand how SWIG work
     *  http://www.swig.org/Doc1.3/Java.html#adding_downcasts
     *
     *  System.Console.WriteLine( "This is my Anonymization. Type: " + evt.GetEventName() );
     *  System.Type type = evt.GetType();
     *  System.Console.WriteLine( "This is my Anonymization. System.Type: " + type.ToString() );
     *  System.Console.WriteLine( "This is my Anonymization. CheckEvent: " + ae.CheckEvent( evt ) );
     *  System.Console.WriteLine( "This is my Anonymization. Processing Tag #" + ae.GetTag().toString() );
     */
        AnonymizeEvent ae = AnonymizeEvent.Cast(evt);
        if( ae != null )
          {
          Tag t = ae.GetTag();
          System.Console.WriteLine( "This is my Anonymization. Processing Tag #" + t.toString() );
          }
        else
          {
          System.Console.WriteLine( "This is my Anonymization. Unhandled Event type: " + evt.GetEventName() );
          }
      }
      protected override void ShowAbort(){
        System.Console.WriteLine( "This is my abort" );
      }
    }

    public class BasicAnonymizer
    {
      public static int Main(string[] args)
        {
        gdcm.Global global = gdcm.Global.GetInstance();
        if( !global.LoadResourcesFiles() )
          {
          System.Console.WriteLine( "Could not LoadResourcesFiles" );
          return 1;
          }

        string file1 = args[0];
        string file2 = args[1];
        Reader reader = new Reader();
        reader.SetFileName( file1 );
        bool ret = reader.Read();
        if( !ret )
          {
          return 1;
          }

        string certpath = gdcm.Filename.Join(gdcm.Testing.GetSourceDirectory(), "/Testing/Source/Data/certificate.pem" );
        gdcm.CryptographicMessageSyntax cms = new gdcm.CryptographicMessageSyntax();
        if( !cms.ParseCertificateFile( certpath ) )
          {
          return 1;
          }

        //Anonymizer ano = new Anonymizer();
        SmartPtrAno sano = Anonymizer.New();
        Anonymizer ano = sano.__ref__();

        //SimpleSubjectWatcher watcher = new SimpleSubjectWatcher(ano, "Anonymizer");
        MyWatcher watcher = new MyWatcher(ano);

        ano.SetFile( reader.GetFile() );
        ano.SetCryptographicMessageSyntax( cms );
        if( !ano.BasicApplicationLevelConfidentialityProfile() )
          {
          return 1;
          }

        Writer writer = new Writer();
        writer.SetFileName( file2 );
        writer.SetFile( ano.GetFile() );
        ret = writer.Write();
        if( !ret )
          {
          return 1;
          }

        return 0;
        }
    }