/**********************************************************************/
/**                       Microsoft Windows/NT                       **/
/**                Copyright(c) Microsoft Corporation, 1997 - 1998 **/
/**********************************************************************/

/*
	drivers.cpp
        Tapi drivers config dialog

    FILE HISTORY:
        
*/

#include "stdafx.h"
#include "drivers.h"
#include "tapidb.h"
#include "server.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDriverSetup dialog


CDriverSetup::CDriverSetup(ITFSNode * pServerNode, ITapiInfo * pTapiInfo, CWnd* pParent /*=NULL*/)
	: CBaseDialog(CDriverSetup::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDriverSetup)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT

    m_spServerNode.Set(pServerNode);
    m_spTapiInfo.Set(pTapiInfo);

	m_fDriverAdded = FALSE;
}


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


BEGIN_MESSAGE_MAP(CDriverSetup, CBaseDialog)
	//{{AFX_MSG_MAP(CDriverSetup)
	ON_BN_CLICKED(IDC_BUTTON_ADD_DRIVER, OnButtonAdd)
	ON_BN_CLICKED(IDC_BUTTON_EDIT_DRIVER, OnButtonEdit)
	ON_BN_CLICKED(IDC_BUTTON_REMOVE_DRIVER, OnButtonRemove)
	ON_LBN_DBLCLK(IDC_LIST_DRIVERS, OnDblclkListDrivers)
	ON_LBN_SELCHANGE(IDC_LIST_DRIVERS, OnSelchangeListDrivers)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDriverSetup message handlers

BOOL CDriverSetup::OnInitDialog() 
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

    CBaseDialog::OnInitDialog();

    CTapiProvider   tapiProvider;
	int             i, nIndex;

    // fill in the listbox with the providers that are installed.
    for (i = 0; i < m_spTapiInfo->GetProviderCount(); i++)
    {
	    // add this provider to the listbox.
        m_spTapiInfo->GetProviderInfo(&tapiProvider, i);

        nIndex = ((CListBox *) GetDlgItem(IDC_LIST_DRIVERS))->AddString(tapiProvider.m_strName);
        ((CListBox *) GetDlgItem(IDC_LIST_DRIVERS))->SetItemData(nIndex, tapiProvider.m_dwProviderID);
    }
	
    ((CListBox *) GetDlgItem(IDC_LIST_DRIVERS))->SetCurSel(0);

    EnableButtons();

    return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CDriverSetup::OnButtonAdd() 
{
    CAddDriver  dlgAddDriver(m_spTapiInfo);
    if (dlgAddDriver.DoModal() == IDOK)
    {
        CTapiServer * pServer = GETHANDLER(CTapiServer, m_spServerNode);

        // add to listbox
        int nIndex = ((CListBox *) GetDlgItem(IDC_LIST_DRIVERS))->AddString(dlgAddDriver.m_tapiProvider.m_strName);
        ((CListBox *) GetDlgItem(IDC_LIST_DRIVERS))->SetItemData(nIndex, dlgAddDriver.m_tapiProvider.m_dwProviderID);

        // add to MMC UI
        pServer->AddProvider(m_spServerNode, &dlgAddDriver.m_tapiProvider);

		m_fDriverAdded = TRUE;
    }

    EnableButtons();
}

void CDriverSetup::OnButtonEdit() 
{
    HRESULT     hr = hrOK;
    int         nCurSel;
    DWORD       dwProviderID;

	nCurSel = ((CListBox *) GetDlgItem(IDC_LIST_DRIVERS))->GetCurSel();
    dwProviderID = (DWORD) ((CListBox *) GetDlgItem(IDC_LIST_DRIVERS))->GetItemData(nCurSel);

    hr = m_spTapiInfo->ConfigureProvider(dwProviderID, GetSafeHwnd());
    if (FAILED(hr))
    {
        ::TapiMessageBox(WIN32_FROM_HRESULT(hr));
    }
}

void CDriverSetup::OnButtonRemove() 
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

    HRESULT         hr = hrOK;
    int             nCurSel, nCount;
    DWORD           dwProviderID;
    CString         strMessage;
    CTapiProvider   tapiProvider;
    CTapiServer * pServer = GETHANDLER(CTapiServer, m_spServerNode);

	nCurSel = ((CListBox *) GetDlgItem(IDC_LIST_DRIVERS))->GetCurSel();
    dwProviderID = (DWORD) ((CListBox *) GetDlgItem(IDC_LIST_DRIVERS))->GetItemData(nCurSel);

    m_spTapiInfo->GetProviderInfo(&tapiProvider, dwProviderID);

    AfxFormatString2(strMessage, IDS_WARN_PROVIDER_DELETE, tapiProvider.m_strName, pServer->GetName());
    
	if (AfxMessageBox(strMessage, MB_YESNO) == IDYES)
	{
        Assert(m_spTapiInfo);

        BEGIN_WAIT_CURSOR;

        hr = m_spTapiInfo->RemoveProvider(dwProviderID, GetSafeHwnd());
        if (FAILED(hr))
        {
            ::TapiMessageBox(WIN32_FROM_HRESULT(hr));
        }
        else
        {
            // remove from the list box
            ((CListBox *) GetDlgItem(IDC_LIST_DRIVERS))->DeleteString(nCurSel);
                
            // now remove from the MMC UI
            pServer->RemoveProvider(m_spServerNode, dwProviderID);

            // update the list of installed providers
            m_spTapiInfo->EnumProviders();
        }

        END_WAIT_CURSOR;
    }

    // select another item in the listbox
    nCount = ((CListBox *) GetDlgItem(IDC_LIST_DRIVERS))->GetCount();
    ((CListBox *) GetDlgItem(IDC_LIST_DRIVERS))->SetCurSel((nCurSel == nCount) ? nCount - 1 : nCurSel);

    EnableButtons();
}

void CDriverSetup::OnDblclkListDrivers() 
{
    OnButtonEdit();	
}

void CDriverSetup::OnCancel() 
{
	// TODO: Add extra cleanup here
	
	CBaseDialog::OnCancel();
}

void CDriverSetup::OnSelchangeListDrivers() 
{
    EnableButtons();
}

void CDriverSetup::EnableButtons()
{
    int nIndex = ((CListBox *) GetDlgItem(IDC_LIST_DRIVERS))->GetCurSel();

    if (nIndex != LB_ERR)
    {
        DWORD dwProviderID = (DWORD) ((CListBox *) GetDlgItem(IDC_LIST_DRIVERS))->GetItemData(nIndex);

        CTapiProvider tapiProvider;

        m_spTapiInfo->GetProviderInfo(&tapiProvider, dwProviderID);

        // enable the appropriate buttons
        GetDlgItem(IDC_BUTTON_REMOVE_DRIVER)->EnableWindow(tapiProvider.m_dwFlags & AVAILABLEPROVIDER_REMOVABLE);
        GetDlgItem(IDC_BUTTON_EDIT_DRIVER)->EnableWindow(tapiProvider.m_dwFlags & AVAILABLEPROVIDER_CONFIGURABLE);
    }
    else
    {
        GetDlgItem(IDC_BUTTON_REMOVE_DRIVER)->EnableWindow(FALSE);
        GetDlgItem(IDC_BUTTON_EDIT_DRIVER)->EnableWindow(FALSE);
    }
}

/////////////////////////////////////////////////////////////////////////////
// CAddDriver dialog


CAddDriver::CAddDriver(ITapiInfo * pTapiInfo, CWnd* pParent /*=NULL*/)
	: CBaseDialog(CAddDriver::IDD, pParent)
{
	//{{AFX_DATA_INIT(CAddDriver)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT

    m_spTapiInfo.Set(pTapiInfo);
}


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


BEGIN_MESSAGE_MAP(CAddDriver, CBaseDialog)
	//{{AFX_MSG_MAP(CAddDriver)
	ON_BN_CLICKED(IDC_BUTTON_ADD_NEW_DRIVER, OnButtonAdd)
	ON_LBN_DBLCLK(IDC_LIST_NEW_DRIVERS, OnDblclkListNewDrivers)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAddDriver message handlers

BOOL CAddDriver::OnInitDialog() 
{
	CBaseDialog::OnInitDialog();

    CTapiProvider   tapiProvider;
    int             i, j, nIndex;

    m_spTapiInfo->EnumAvailableProviders();

    for (i = 0; i < m_spTapiInfo->GetAvailableProviderCount(); i++)
    {
	    // add this provider to the listbox.
        m_spTapiInfo->GetAvailableProviderInfo(&tapiProvider, i);

        if (tapiProvider.m_dwFlags & AVAILABLEPROVIDER_INSTALLABLE)
        {
            BOOL bInstalled = FALSE;

            /* some TAPI providers can be installed mutliple times, so just add to the list
               and let the server return an error if it fails.

            for (j = 0; j < m_spTapiInfo->GetProviderCount(); j++)
            {
                CTapiProvider tapiProviderInstalled;

                m_spTapiInfo->GetProviderInfo(&tapiProviderInstalled, j);
                if (tapiProviderInstalled.m_strFilename.CompareNoCase(tapiProvider.m_strFilename) == 0)
                {
                    // this provider is already installed... don't add
                    bInstalled = TRUE;
                    break;
                }
            }
            */

            if (!bInstalled)
            {
                // this provider isn't installed yet... make it available to the user
                nIndex = ((CListBox *) GetDlgItem(IDC_LIST_NEW_DRIVERS))->AddString(tapiProvider.m_strName);
                ((CListBox *) GetDlgItem(IDC_LIST_NEW_DRIVERS))->SetItemData(nIndex, i);
            }
        }
    }
	
    ((CListBox *) GetDlgItem(IDC_LIST_NEW_DRIVERS))->SetCurSel(0);

    EnableButtons();

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CAddDriver::OnButtonAdd() 
{
    int     nCurSel, nIndex;
    HRESULT hr = hrOK;

    // get the info on the currently selected provider
    nCurSel = ((CListBox *) GetDlgItem(IDC_LIST_NEW_DRIVERS))->GetCurSel();
    nIndex = (int) ((CListBox *) GetDlgItem(IDC_LIST_NEW_DRIVERS))->GetItemData(nCurSel);

    m_spTapiInfo->GetAvailableProviderInfo(&m_tapiProvider, nIndex);

    BEGIN_WAIT_CURSOR;

    // try to add the provider to the server
    hr = m_spTapiInfo->AddProvider(m_tapiProvider.m_strFilename, &m_tapiProvider.m_dwProviderID, GetSafeHwnd());	
    if (FAILED(hr))
    {
        ::TapiMessageBox(WIN32_FROM_HRESULT(hr));
    }
    else
    {
        // success... we're done here
        // update our installed provider list
        hr = m_spTapiInfo->EnumProviders();	

        EndDialog(IDOK);
    }

    END_WAIT_CURSOR;
}

void CAddDriver::OnDblclkListNewDrivers() 
{
    OnButtonAdd();
}

void CAddDriver::EnableButtons()
{
    int nCount = ((CListBox *) GetDlgItem(IDC_LIST_NEW_DRIVERS))->GetCount();
    
    GetDlgItem(IDC_BUTTON_ADD_NEW_DRIVER)->EnableWindow(nCount > 0);
}