// KeyStringDlg.cpp : implementation file
//

#include "stdafx.h"
#include "KeyString.h"
#include "KeyStringDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CKeyStringDlg dialog

CKeyStringDlg::CKeyStringDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CKeyStringDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CKeyStringDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_hIcon     = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  m_hFileIcon = AfxGetApp()->LoadIcon(IDI_FILEOPEN );
  m_hSaveIcon = AfxGetApp()->LoadIcon(IDI_FILESAVE );
}

void CKeyStringDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CKeyStringDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CKeyStringDlg, CDialog)
	//{{AFX_MSG_MAP(CKeyStringDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDB_SEARCH, OnSearch)
	ON_BN_CLICKED(IDB_FILESELECT, OnFileselect)
	ON_EN_UPDATE(IDC_FILE, OnUpdateFile)
	ON_BN_CLICKED(IDB_LOGFILESELECT, OnLogfileselect)
	ON_EN_UPDATE(IDC_LOGFILE, OnUpdateLogfile)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CKeyStringDlg message handlers

BOOL CKeyStringDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
  ((CButton *)GetDlgItem( IDB_FILESELECT    ) )->SetIcon(    m_hFileIcon );	
  ((CButton *)GetDlgItem( IDB_LOGFILESELECT ) )->SetIcon(    m_hSaveIcon );	
  ((CWnd    *)GetDlgItem( IDC_PROGRESS      ) )->ShowWindow( SW_HIDE     );	
  ((CWnd    *)GetDlgItem( IDC_VIEW          ) )->ShowWindow( SW_SHOW     );	
  ((CButton *)GetDlgItem( IDC_VIEW          ) )->SetCheck(   TRUE        );



  return TRUE;  // return TRUE  unless you set the focus to a control
}

void CKeyStringDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CKeyStringDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

HCURSOR CKeyStringDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CKeyStringDlg::OnFileselect() 
{
  CFileDialog	  oFileDlg( TRUE );

  oFileDlg.DoModal();

  m_szFileName = oFileDlg.GetPathName();
  GetDlgItem( IDC_FILE )->SetWindowText( m_szFileName );
}

void InsertTabs( FILE * pFile, int Nb )
{
  int i;

  for( i=0 ; i<Nb ; i++ )
    fprintf( pFile, "  " );
}

void CKeyStringDlg::OnSearch() 
{
  FILE  * pDataFile;
  FILE  * pLogFile;
  char    szSequence[ 256 ];
  long    d_lPositions[ 256 ];
  char    iSeqLength, iSeqPos;
  long    iPos, iCpt;
  
  CProgressCtrl * pProgress;
  
  //--- Opening files ---
  if( pDataFile = fopen( m_szFileName,    "rb" ) )
  {
    if( pLogFile  = fopen( m_szLogFileName, "w"  ) )
    {
      ((CWnd *)   GetDlgItem( IDC_PROGRESS      ) )->ShowWindow( SW_SHOW );	
      ((CWnd *)   GetDlgItem( IDC_VIEW          ) )->ShowWindow( SW_HIDE );	
     
      fprintf( pLogFile, "--------------------------------------------\n" );
      fprintf( pLogFile, "              Key Positions                 \n" );
      fprintf( pLogFile, "--------------------------------------------\n" );
      fprintf( pLogFile, "[File       ]> %s\n", m_szFileName );
      fprintf( pLogFile, "[Key String ]> " );
      
      ((CEdit *) GetDlgItem( IDE_STRING ))->GetWindowText( szSequence, 255); 
      pProgress = ((CProgressCtrl *) GetDlgItem( IDC_PROGRESS ));
      iSeqLength = strlen( szSequence );
      iPos = 0;
      iSeqPos = 0;
      
      pProgress->SetRange( 0, iSeqLength );
      
      fseek( pDataFile, -1, SEEK_END );
      iPos = ftell( pDataFile );
      
      while( (iSeqPos < iSeqLength) && (iPos > 0) )
      {
        if( fgetc( pDataFile ) == szSequence[ iSeqPos ] )
        {
          fprintf( pLogFile, "%c", szSequence[ iSeqPos ] );
          d_lPositions[ iSeqPos ] = iPos;
          iSeqPos ++;
          pProgress->SetPos( iSeqPos );
        }
        
        fseek( pDataFile, -2, SEEK_CUR );
        iPos = ftell( pDataFile );
      }
      fprintf( pLogFile, "\n--------------------------------------------\n" );
      fprintf( pLogFile, "\n" );
      
      //--- Creating IA-Like file ---
      fprintf( pLogFile, "TestProtection := faux\n" );
      for( iCpt = 0 ; iCpt < iSeqLength ; iCpt++ )
      {
        fprintf( pLogFile, "si ( PRO_LitValeurPositionCle( %i ) = %i )\n", d_lPositions[ iCpt ], szSequence[ iCpt ] );
        InsertTabs( pLogFile, iCpt );
        fprintf( pLogFile, "alors\t" );
      }
      fprintf( pLogFile, "TestProtection := vrai\n" );
      
      for( iCpt = iSeqLength ; iCpt > 0 ; iCpt-- )
      {
        InsertTabs( pLogFile, iCpt-1 );
        fprintf( pLogFile, "finsi\n" );
      }
      
      if( iSeqPos < iSeqLength )   
        MessageBox( "Unable to find the full KeyString in file.", "Error", MB_OK | MB_ICONSTOP );
      else
        MessageBox( "The full KeyString has been found.", "Operation Successful", MB_OK | MB_ICONEXCLAMATION );
      
      fclose( pLogFile  );
      fclose( pDataFile );
      pProgress->SetPos( 0 );
    
      ((CWnd *)   GetDlgItem( IDC_PROGRESS      ) )->ShowWindow( SW_HIDE );	
      ((CWnd *)   GetDlgItem( IDC_VIEW          ) )->ShowWindow( SW_SHOW );	

      if( ((CButton *)GetDlgItem( IDC_VIEW          ) )->GetCheck() )
        ShellExecute( NULL, NULL, "Notepad.exe", m_szLogFileName, NULL, SW_SHOW );

    }
  }
}

void CKeyStringDlg::OnUpdateFile() 
{
  ((CEdit *)GetDlgItem(IDC_FILE))->GetWindowText( m_szFileName );
}

void CKeyStringDlg::OnLogfileselect() 
{
  CFileDialog	  oFileDlg( FALSE, "*.log", "KeyString.log", OFN_OVERWRITEPROMPT, "Log Files (*.log) |*.log| All Files (*.*) |*.*||", NULL );
  oFileDlg.DoModal();

  m_szLogFileName = oFileDlg.GetPathName();
  GetDlgItem( IDC_LOGFILE )->SetWindowText( m_szLogFileName );
}

void CKeyStringDlg::OnUpdateLogfile() 
{
  ((CEdit *)GetDlgItem(IDC_LOGFILE))->GetWindowText( m_szLogFileName );
}
