// autoans.cpp : implementation file
//
#include "stdafx.h"

#include "t3test.h"
#include "t3testd.h"
#include "confdlg.h"
#include "strings.h"
#include "resource.h"


#ifdef _DEBUG

#ifndef _WIN64 // mfc 4.2's heap debugging features generate warnings on win64
#define new DEBUG_NEW
#endif

#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


CConfDlg::CConfDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CConfDlg::IDD, pParent)
{
        m_bstrDestAddress = NULL;
}


void CConfDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BOOL CConfDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    PopulateConferences();
    return TRUE;
}

void CConfDlg::PopulateConferences()
{
    ITRendezvous *      pRend;
    IEnumDirectory *    pEnumDirectory;
    HRESULT             hr;
    ITDirectory *       pDirectory;
    LPWSTR *            ppServers;
    DWORD               dw;
    
    //
    // create the rendezvous control.
    //
    hr = ::CoCreateInstance(
                            CLSID_Rendezvous,
                            NULL,
                            CLSCTX_INPROC_SERVER,
                            IID_ITRendezvous,
                            (void **)&pRend
                           );
    
    if (FAILED(hr))
    {
        return;
    }


    hr = pRend->EnumerateDefaultDirectories(
        &pEnumDirectory
        );

    if (FAILED(hr))
    {
        pRend->Release();
    
        return;
    }

    while (TRUE)
    {

        DWORD dwFetched = 0;

        hr = pEnumDirectory->Next(
                                  1,
                                  &pDirectory,
                                  &dwFetched
                                 );

        if ( S_OK != hr )
        {
            break;
        }

        DIRECTORY_TYPE type;
        // print out the names of the conference found.
        hr = pDirectory->get_DirectoryType(&type);
        if ( FAILED(hr) )
        {
            pDirectory->Release();
            continue;
        }

        if (type == DT_ILS)
        {
            break;
        }

        pDirectory->Release();

    }

    pEnumDirectory->Release();

    //
    // if hr is s_false, we went through the enumerate
    // without finding an ils server
    //
    if ( S_OK == hr )
    {
        hr = pDirectory->Connect(FALSE);

        if ( SUCCEEDED(hr))
        {
            ListObjects( pDirectory );
        }

        pDirectory->Release();
    }

    hr = ListILSServers(
                        &ppServers,
                        &dw
                       );

    if ( !SUCCEEDED(hr) )
    {
        return;
    }
    
    while ( dw )
    {
        dw--;

        hr = pRend->CreateDirectory(
                                    DT_ILS,
                                    ppServers[dw],
                                    &pDirectory
                                   );

        if ( SUCCEEDED(hr) )
        {
            hr = pDirectory->Connect(FALSE);

            if ( SUCCEEDED(hr) )
            {
                ListObjects( pDirectory );
            }

            pDirectory->Release();
        }

        CoTaskMemFree( ppServers[dw] );
    }

    CoTaskMemFree( ppServers );

}

void
CConfDlg::ListObjects( ITDirectory * pDirectory )
{
    BSTR            bstrNameToSearch;
    BSTR            bstrDirName;
    HRESULT         hr;
    int             i;
    
    
    bstrNameToSearch = SysAllocString(L"*");

    if (bstrNameToSearch == NULL)
    {
        return;
    }

    IEnumDirectoryObject * pEnum;
    
    hr = pDirectory->EnumerateDirectoryObjects(
        OT_CONFERENCE,
        bstrNameToSearch,
        &pEnum
        );

    SysFreeString( bstrNameToSearch );

    if (FAILED(hr))
    {
        return;
    }

    pDirectory->get_DisplayName( &bstrDirName );

    // print out the names of all the users found.
    while (TRUE)
    {
        ITDirectoryObject *     pObject;
        BSTR                    bstrObjectName;
        WCHAR                   szBuffer[256];

        hr = pEnum->Next(
                         1,
                         &pObject,
                         NULL
                        );
        
        if ( S_OK != hr )
        {
            break;
        }

        hr = pObject->get_Name(&bstrObjectName);
        
        if (FAILED(hr))
        {
            continue;
        }

        wsprintf(szBuffer, L"%s: %s", bstrDirName, bstrObjectName );
        
        i = SendDlgItemMessage(
                               IDC_CONFLIST,
                               LB_ADDSTRING,
                               0,
                               (LPARAM)szBuffer
                              );

        SysFreeString(bstrObjectName);

        SendDlgItemMessage(
                           IDC_CONFLIST,
                           LB_SETITEMDATA,
                           i,
                           (LPARAM) pObject
                          );
    }

    SysFreeString( bstrDirName );
    
    pEnum->Release();
}

void CConfDlg::OnOK()
{
    DWORD       i;
    HRESULT     hr;
    
    i = SendDlgItemMessage(
                           IDC_CONFLIST,
                           LB_GETCURSEL,
                           0,
                           0
                          );

    if (LB_ERR != i)
    {
        ITDirectoryObject *     pObject;
        IEnumDialableAddrs *    pEnumAddress;

        
        pObject = (ITDirectoryObject *)SendDlgItemMessage(
            IDC_CONFLIST,
            LB_GETITEMDATA,
            i,
            0
            );

        hr = pObject->EnumerateDialableAddrs(
                                             LINEADDRESSTYPE_SDP,
                                             &pEnumAddress
                                            );

        if ( !SUCCEEDED(hr) )
        {
        }

        hr = pEnumAddress->Next(
                                1,
                                &m_bstrDestAddress,
                                NULL
                               );

        if ( S_OK != hr )
        {
        }

        pEnumAddress->Release();
    }

    
	CDialog::OnOK();
}


void CConfDlg::OnDestroy() 
{
    DWORD       count;

    CDialog::OnDestroy();

    count = SendDlgItemMessage(
                               IDC_CONFLIST,
                               LB_GETCOUNT,
                               0,
                               0
                              );

    while ( 0 != count )
    {
        ITDirectoryObject * pObject;

        count--;
        
        pObject = (ITDirectoryObject *)SendDlgItemMessage(
            IDC_CONFLIST,
            LB_GETITEMDATA,
            count,
            0
            );

        pObject->Release();
    }
}


BEGIN_MESSAGE_MAP(CConfDlg, CDialog)
	ON_WM_DESTROY()
END_MESSAGE_MAP()