// UPnPDlg.cpp : Implementation file
//

#include "stdafx.h"
#include "RemoteTest.h"
#include "UPnPDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CUPnPDlg  dialog


CUPnPDlg::CUPnPDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CUPnPDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CUPnPDlg)
	//}}AFX_DATA_INIT
}


void CUPnPDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CUPnPDlg)
	DDX_Control(pDX, IDC_PROGRESS, m_progress);
	DDX_Control(pDX, IDC_LIST_DEVICE, m_listDevice);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CUPnPDlg, CDialog)
	//{{AFX_MSG_MAP(CUPnPDlg)
	ON_BN_CLICKED(IDC_BTN_SEARCH, OnBtnSearch)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUPnPDlg message handlers

BOOL CUPnPDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	pThread = NULL;

	m_listDevice.InsertColumn( 0, "Name", LVCFMT_LEFT, 200 );
	m_listDevice.InsertColumn( 1, "IP Address", LVCFMT_LEFT, 100 );
	m_listDevice.SetExtendedStyle(LVS_EX_FULLROWSELECT);

    m_progress.SetRange(0,100);
    m_progress.SetStep(10);
    m_progress.SetPos(0);

	return TRUE; 
}

void CUPnPDlg::OnOK() 
{
	CRemoteTestApp	*pApp = (CRemoteTestApp*)AfxGetApp();

	int	nIndex = m_listDevice.GetNextItem( -1, LVNI_SELECTED );

	if ( nIndex >= 0 ) {
		pApp->m_aiboIP = m_listDevice.GetItemText( nIndex, 1 );
	}
	CDialog::OnOK();
}

UINT DiscoveryThread(LPVOID pParam)
{
	CUPnPDlg* pDlg = (CUPnPDlg*)pParam;

	int nResult = DiscoveryAIBOByUPnP(pDlg->m_dev_ip);
	TRACE("DiscoveryThread Found AIBO:%d\n", nResult);
	
    pDlg->m_nAIBONum = nResult;
	pDlg->m_bFinding = FALSE;
	return 0; 
}

void CUPnPDlg::OnBtnSearch() 
{
	GetDlgItem(IDOK)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_SEARCH)->EnableWindow(FALSE);

    m_nAIBONum = -1;
	m_bFinding = TRUE;
	memset( m_dev_ip, 0, sizeof(m_dev_ip) );
	pThread = AfxBeginThread(DiscoveryThread, this);

	SetTimer( 999, 500, NULL );
}

void CUPnPDlg::OnTimer(UINT nIDEvent) 
{
	if ( nIDEvent == 999 ) {
		if ( m_bFinding == FALSE ) {
			KillTimer( 999 );
			m_progress.SetPos( 0 );
			if ( m_nAIBONum == -1 ) {
				AfxMessageBox( "AIBO wasn't found." );
			}
			SetAIBOList();
		} else {
			m_progress.StepIt();
		}
	}
	CDialog::OnTimer(nIDEvent);
}

void CUPnPDlg::SetAIBOList()
{
	m_listDevice.DeleteAllItems();

	LV_ITEM			item;
	for ( int i=0; i<m_nAIBONum;i++ ){
        item.mask = LVIF_TEXT;
		item.iItem = i;
		item.pszText = m_dev_ip[i].strDeviceName;
		item.iSubItem = 0;
		m_listDevice.InsertItem( &item );
		item.iSubItem = 1;
		item.pszText = m_dev_ip[i].strIP;
		m_listDevice.SetItem( &item );
    }

	GetDlgItem(IDOK)->EnableWindow(TRUE);
	GetDlgItem(IDC_BTN_SEARCH)->EnableWindow(TRUE);
}
