// DlgLink.cpp : implementation file
//

#include "stdafx.h"
#include "NetSdkDemo.h"
#include "DlgLink.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlgLink dialog
static CString s_szIPAddr = "192.168.5.5";

CDlgLink::CDlgLink(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgLink::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgLink)
	m_szIP = _T("192.168.5.183");
	m_szPassword = _T("admin");
	m_wPort = 3000;
	m_szStreamName = _T("live/av0");
	m_szUserName = _T("admin");
	m_nProtel = 0;
	//}}AFX_DATA_INIT
	m_lHandle = 0;
}

void CDlgLink::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgLink)
	DDX_Control(pDX, IDC_LST_DEV, m_lstDevs);
	DDX_Text(pDX, IDC_EDT_IP, m_szIP);
	DDX_Text(pDX, IDC_EDT_PASSWORD, m_szPassword);
	DDX_Text(pDX, IDC_EDT_PORT, m_wPort);
	DDX_Text(pDX, IDC_EDT_STRNAME, m_szStreamName);
	DDX_Text(pDX, IDC_EDT_USRNAME, m_szUserName);
	DDX_CBIndex(pDX, IDC_CMB_PROTEL, m_nProtel);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgLink, CDialog)
	//{{AFX_MSG_MAP(CDlgLink)
	ON_WM_DESTROY()
	ON_CBN_SELCHANGE(IDC_CMB_PROTEL, OnSelchangeCmbProtel)
	ON_BN_CLICKED(IDC_BTN_SEARCH, OnBtnSearch)
	ON_NOTIFY(NM_DBLCLK, IDC_LST_DEV, OnDblclkLstDev)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgLink message handlers

BOOL CDlgLink::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	m_lstDevs.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
	m_lstDevs.InsertColumn(0, "IP地址",		LVCFMT_CENTER, 100);
	m_lstDevs.InsertColumn(1, "子网掩码",	LVCFMT_CENTER, 100);
	m_lstDevs.InsertColumn(2, "数据端口",	LVCFMT_CENTER, 60);

	m_szIP = s_szIPAddr;
	UpdateData(FALSE);
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CDlgLink::OnDestroy() 
{
	CDialog::OnDestroy();
	CleanAllDevice();
}

void CDlgLink::OnOK() 
{
	int iRet;
	if(!UpdateData())
		return;
	if(m_szIP.IsEmpty())
	{
		AfxMessageBox("请输入IP地址!");
		return;
	}
	if(m_szUserName.IsEmpty())
	{
		AfxMessageBox("请输入用户名!");
		return;
	}
	if(m_szStreamName.IsEmpty())
	{
		AfxMessageBox("请输入流名称!");
		return;
	}

	iRet = MRNSDK_LiveSingle(&m_lHandle, m_szIP, (WORD)m_wPort, m_nProtel, 
			m_szUserName, m_szPassword, NULL, m_szStreamName, 2000);
	if(iRet)
	{
		AfxMessageBox("连接失败!");
		return;
	}
	s_szIPAddr = m_szIP;
	CDialog::OnOK();
}

void CDlgLink::OnSelchangeCmbProtel() 
{
	int nType = ((CComboBox*)GetDlgItem(IDC_CMB_PROTEL))->GetCurSel();
	UpdateData();
	if(nType == 0)
	{
		m_wPort = 3000;
	}
	else
	{
		m_wPort = 554;
	}
	UpdateData(FALSE);
}

void CDlgLink::CleanAllDevice()
{
	while(m_stDevList.GetSize())
	{
		NETSEARCH_INFO_T *pInfo = (NETSEARCH_INFO_T*)m_stDevList.GetAt(0);
		delete pInfo;
		m_stDevList.RemoveAt(0);
	}
}

NETSEARCH_INFO_T *CDlgLink::GetSelectDev()
{
	int nItem;
	if(!m_lstDevs.GetItemCount())
		return NULL;
	if(!m_lstDevs.GetSelectedCount())
	{
		AfxMessageBox("请选择设备!");
		return NULL;
	}
	nItem = m_lstDevs.GetNextItem(-1, LVNI_SELECTED);
	if(nItem == -1)
		return NULL;
	return (NETSEARCH_INFO_T*)m_stDevList.GetAt(nItem);
}

void CDlgLink::LoadDevToList()
{
	int i;
	CString szText;
	NETSEARCH_INFO_T *pInfo;
	for(i=0; i<m_stDevList.GetSize(); i++)
	{
		pInfo = (NETSEARCH_INFO_T *)m_stDevList.GetAt(i);
		
		m_lstDevs.InsertItem(i, pInfo->szIP);
		m_lstDevs.SetItemText(i, 1, pInfo->szSubMask);
		
		szText.Format("%d", pInfo->wDataPort);
		m_lstDevs.SetItemText(i, 2, szText);
		
		this->UpdateWindow();
	}
}
void CDlgLink::LoadDevice(json_t *pJsHead, NETSEARCH_INFO_T *pInfo)
{
	json_t *pJsItem;
	const char *szTempTxt;
	
	memset(pInfo, 0, sizeof(NETSEARCH_INFO_T));
	
	pJsItem = json_object_get(pJsHead, "szIP");
	szTempTxt = json_string_value(pJsItem);
	if(szTempTxt)
		strncpy(pInfo->szIP, szTempTxt, sizeof(pInfo->szIP) - 1 );

	pJsItem = json_object_get(pJsHead, "szSubMask");
	szTempTxt = json_string_value(pJsItem);
	if(szTempTxt)
		strncpy(pInfo->szSubMask, szTempTxt, sizeof(pInfo->szSubMask) - 1 );


	pJsItem = json_object_get(pJsHead, "wDataPort");
	if(pJsItem)
		pInfo->wDataPort = (WORD)json_integer_value(pJsItem);

	pJsItem = json_object_get(pJsHead, "wSoapPort");
	if(pJsItem)
		pInfo->wSoapPort = (WORD)json_integer_value(pJsItem);

	pJsItem = json_object_get(pJsHead, "wWebPort");
	if(pJsItem)
		pInfo->wWebPort = (WORD)json_integer_value(pJsItem);
	
	pJsItem = json_object_get(pJsHead, "wRtspPort");
	if(pJsItem)
		pInfo->wRtspPort = (WORD)json_integer_value(pJsItem);

	pJsItem = json_object_get(pJsHead, "wRtmpPort");
	if(pJsItem)
		pInfo->wRtmpPort = (WORD)json_integer_value(pJsItem);

	pJsItem = json_object_get(pJsHead, "wOnvifPort");
	if(pJsItem)
		pInfo->wOnvifPort = (WORD)json_integer_value(pJsItem);
	
}
static void fdMRSearchCB(const char *szDeviceID, const char *szInfo, void *context)
{
	json_t *pJsHead, *pJsSap;
	NETSEARCH_INFO_T *pInfo = NULL;
	CDlgLink *pDlg = (CDlgLink*)context;
	/*FILE *fpFile = fopen("search.json", "w");
	if(fpFile)
	{
		fwrite(szInfo, 1, strlen(szInfo), fpFile);
		fclose(fpFile);
	}*/
	pJsHead = json_loads(szInfo, 0, NULL);
	if(!pJsHead)
	{
		DPERROR(("invalid json format string\n"));
		return;
	}
	pJsSap = json_object_get(pJsHead, "SapSearch");
	if(!pJsSap)
	{
		DPERROR(("not net search\n"));
		json_delete(pJsHead);
		return;
	}

	pJsSap = json_object_get(pJsSap, "stNetInfo");
	if(!pJsSap)
	{
		DPERROR(("not net stNetInfo\n"));
		json_delete(pJsHead);
		return;
	}
	pInfo = new NETSEARCH_INFO_T();
	pDlg->LoadDevice(pJsSap, pInfo);
	json_delete(pJsHead);
	pDlg->m_stDevList.Add(pInfo);
}
void CDlgLink::OnBtnSearch() 
{
	int nDevices;
	m_lstDevs.DeleteAllItems();
	CleanAllDevice();
	nDevices = MRNSDK_SearchDevice(NULL, 1000, fdMRSearchCB, this);
	LoadDevToList();
}

void CDlgLink::OnDblclkLstDev(NMHDR* pNMHDR, LRESULT* pResult) 
{
	
	NETSEARCH_INFO_T *pNet = GetSelectDev();
	if(pNet)
	{
		m_szIP  = pNet->szIP;
		m_wPort = pNet->wDataPort;
		UpdateData(FALSE);
		OnOK();
	}
	*pResult = 0;
}
