// CnctDlg.cpp : implementation file
//

#include "stdafx.h"
#include "resource.h"

#include "KeyObjs.h"
#include "CmnKey.h"
#include "W3Key.h"
#include "W3Serv.h"

#include "CnctDlg.h"
#include "IPDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CConnectionDlg dialog


CConnectionDlg::CConnectionDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CConnectionDlg::IDD, pParent),
    m_pKey( NULL )
    {
    //{{AFX_DATA_INIT(CConnectionDlg)
    m_int_connection_type = -1;
    //}}AFX_DATA_INIT
    }


void CConnectionDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CConnectionDlg)
    DDX_Control(pDX, IDC_BTN_SELECT_IPADDRESS, m_cbutton_choose_ip);
    DDX_Radio(pDX, IDC_BTN_KEYVIEW_NONE, m_int_connection_type);
    //}}AFX_DATA_MAP

    // do the ip address field by hand
    if ( pDX->m_bSaveAndValidate )
        m_szIPAddress = GetIPAddress();
    else
        FSetIPAddress( m_szIPAddress );
    }


BEGIN_MESSAGE_MAP(CConnectionDlg, CDialog)
    //{{AFX_MSG_MAP(CConnectionDlg)
    ON_BN_CLICKED(IDC_BTN_KEYVIEW_DEFAULT, OnBtnKeyviewDefault)
    ON_BN_CLICKED(IDC_BTN_KEYVIEW_IPADDR, OnBtnKeyviewIpaddr)
    ON_BN_CLICKED(IDC_BTN_KEYVIEW_NONE, OnBtnKeyviewNone)
    ON_BN_CLICKED(IDC_BTN_SELECT_IPADDRESS, OnBtnSelectIpaddress)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CConnectionDlg message handlers
//----------------------------------------------------------------
// override virtual oninitdialog
BOOL CConnectionDlg::OnInitDialog( )
    {
    // call the base oninit
    CDialog::OnInitDialog();

    // set enable the ip address as appropriate to start with
    switch( m_int_connection_type )
        {
        case CONNECTION_NONE:
            m_cbutton_choose_ip.EnableWindow( FALSE );
            GetDlgItem(IDC_IPA_IPADDRESS)->EnableWindow(FALSE);
            break;
        case CONNECTION_DEFAULT:
            m_cbutton_choose_ip.EnableWindow( FALSE );
            GetDlgItem(IDC_IPA_IPADDRESS)->EnableWindow(FALSE);
            break;
        case CONNECTION_IPADDRESS:
            m_cbutton_choose_ip.EnableWindow( TRUE );
            GetDlgItem(IDC_IPA_IPADDRESS)->EnableWindow(TRUE);
            break;
        };

    // return 0 to say we set the default item
    // return 1 to just select the default default item
    return 1;
    }

//------------------------------------------------------------------------------
void CConnectionDlg::OnBtnKeyviewNone()
    {
    // clear the address field
    UpdateData( TRUE );
    m_szIPStorage = m_szIPAddress;
    ClearIPAddress();

    // disable the address field and chooser
    m_cbutton_choose_ip.EnableWindow( FALSE );
    GetDlgItem(IDC_IPA_IPADDRESS)->EnableWindow(FALSE);
    }

//------------------------------------------------------------------------------
void CConnectionDlg::OnBtnKeyviewDefault()
    {
    // get the data from the form
    UpdateData( TRUE );
    m_szIPStorage = m_szIPAddress;
    ClearIPAddress();

    // disable the address field and chooser
    m_cbutton_choose_ip.EnableWindow( FALSE );
    GetDlgItem(IDC_IPA_IPADDRESS)->EnableWindow(FALSE);
    }

//------------------------------------------------------------------------------
void CConnectionDlg::OnBtnKeyviewIpaddr()
    {
    // enable the address field and chooser
    m_cbutton_choose_ip.EnableWindow( TRUE );
    GetDlgItem(IDC_IPA_IPADDRESS)->EnableWindow(TRUE);

    // ip address field
    UpdateData( TRUE );
    m_szIPAddress = m_szIPStorage;
    UpdateData( FALSE );
    }


//------------------------------------------------------------------------------
void CConnectionDlg::OnBtnSelectIpaddress()
    {
    // run the choose ip dialog here
    CChooseIPDlg    dlg;

    // set up the ip dialog member variables
    dlg.m_szIPAddress = m_szIPAddress;
    dlg.m_pKey = m_pKey;

    // run the dialog
    if ( dlg.DoModal() == IDOK )
        {
        UpdateData( TRUE );
        m_szIPAddress = dlg.m_szIPAddress;
        UpdateData( FALSE );
        }
    }

//------------------------------------------------------------------------------
// Set and get the ip STRING from the ip edit control
BOOL CConnectionDlg::FSetIPAddress( CString& szAddress )
    {
    DWORD   dword, b1, b2, b3, b4;

    // break the string into 4 numerical bytes (reading left to right)
    dword = sscanf( szAddress, "%d.%d.%d.%d", &b1, &b2, &b3, &b4 );

    // if we didn't get all four, fail
    if ( dword != 4 )
        return FALSE;

    // make the numerical ip address out of the bytes
    dword = (DWORD)MAKEIPADDRESS(b1,b2,b3,b4);

    // set the ip address into the control
    SendDlgItemMessage( IDC_IPA_IPADDRESS, IPM_SETADDRESS, 0, dword );

#ifdef _DEBUG
    dword = 0;
//  dword = SendDlgItemMessage( IDC_IPA_IPADDRESS, IPM_GETADDRESS, 0, 0 );
#endif

    // return success
    return TRUE;
    }

//------------------------------------------------------------------------------
CString CConnectionDlg::GetIPAddress()
    {
    CString szAnswer;
    DWORD   dword, b1, b2, b3, b4;

    // get the ip address from the control
    SendDlgItemMessage( IDC_IPA_IPADDRESS, IPM_GETADDRESS, 0, (LPARAM)&dword );


    // get the constituent parts
    b1 = FIRST_IPADDRESS( dword );
    b2 = SECOND_IPADDRESS( dword );
    b3 = THIRD_IPADDRESS( dword );
    b4 = FOURTH_IPADDRESS( dword );

    // format the string
    if ( dword )
        szAnswer.Format( "%d.%d.%d.%d", b1, b2, b3, b4 );
    else
        szAnswer.Empty();

    return szAnswer;
    }

//------------------------------------------------------------------------------
// Set and get the ip STRING from the ip edit control
void CConnectionDlg::ClearIPAddress()
    {
    // clear the ip address control
    SendDlgItemMessage( IDC_IPA_IPADDRESS, IPM_CLEARADDRESS, 0, 0 );
    }