/**
 * It implements the required functionality of the test step.
 * This step will open a shared phone
 * @return TVerdict - result of the test step
 * @leave - System wide error codes
 */
TVerdict CTestLtsyPhoneGetCurrentNetworkInfo::doTestStepL()
	{
	if(TestStepResult() == EPass)
		{
    	TRAPD(err,GetCurrentNetworkInfo());
    	if(err != KErrNone)
    		{
    		ERR_PRINTF2(_L("The error was returned %d!! when open Phone"),err);
    	    SetTestStepResult(EFail);
    		}
		}
	
	return TestStepResult();
	}
DWORD WINAPI BkgPingStatusCheckThread(LPVOID lpVoid)
{

	BBS_PING_OPTION pingOpt = {0,};
	BBS_CUR_NET_INFO netInfo;
	BBS_PING_RESULT pingResult;
	BBS_ADAPTER_INFO adapterInfo;
	DWORD dwPingFailCount = 0;
	CBBS_Ping ping;

	TCHAR tszLiteralIP[18] = {'\0',};

	memset(&pingOpt, 0, sizeof(BBS_PING_OPTION));
	memset(&netInfo, 0, sizeof(BBS_CUR_NET_INFO));
	memset(&pingResult, 0, sizeof(BBS_PING_RESULT));
	memset(&adapterInfo, 0, sizeof(BBS_ADAPTER_INFO));


	NKDbgPrintfW( _T("[NETUI] ===== [BkgPingStatusCheckThread Start] ===== \r\n") );

	g_bIsOperating = TRUE;

	while(g_bIsOperating == TRUE)
	{

		// 1초씩 g_dwBreakInterval 만큼 쉬어준다.
		// 1초씩 마다 스레드가 종료 조건이 걸려있는지 확인
		for(UINT i=1; i<=g_dwBreakInterval; i++)
		{
			// BreakTime Interval
			Sleep(1000);

			if(g_bIsOperating == FALSE)
			{
				return 0;
			}
		}

		// PIng 실패 횟수 초기화 필수!
		dwPingFailCount = 0;


		GetWlanDefaultInformation(&adapterInfo);

		GetCurrentNetworkInfo(adapterInfo.tszAdapterName, &netInfo);

		
		NKDbgPrintfW( _T("[NETUI] ---------- [Default Information] ---------- \r\n") );
		NKDbgPrintfW( _T("[NETUI] Adapter(%s), DHCP(%d) \r\n"), adapterInfo.tszAdapterName, adapterInfo.bDHCPEnabled );
		NKDbgPrintfW( _T("[NETUI] IPAddr(%s) \r\n"), adapterInfo.tszIPAddr );
		NKDbgPrintfW( _T("[NETUI] DefaultGateWay(%s) \r\n"), adapterInfo.tszDefaultGateWay );
		NKDbgPrintfW( _T("[NETUI] DnsAddr(%s) \r\n"), adapterInfo.tszDnsAddr );
		NKDbgPrintfW( _T("[NETUI] ---------------------------------------- \r\n\r\n") );



		// 아답터가 검색되었는지?
		if( _tcslen(adapterInfo.tszAdapterName) == 0 )
		{
			// 아답터가 검색되지 않았다면, 기본 대기시간만큼 다시 대기
			// ERROR
			NKDbgPrintfW( _T("[NETUI] [ERROR] Can't Find Adapter! \r\n") );
			continue;
		}


		NKDbgPrintfW( _T("[NETUI] SSID : %s \r\n"), netInfo.tszSSID );

		// 현재 접속된 SSID가 있을 때만 Ping 시도
		if( _tcslen(netInfo.tszSSID) != 0 )
		{
			
			// Custom Dest IP를 지정 되어있으면, 읽어온 값으로, 지정되지 않았다면, 기본 DefaultGateWay로 시도
			if( _tcslen(g_tszCustomDestAddr) > 0 )
			{
				_tcscpy(pingOpt.tszDestIP, g_tszCustomDestAddr);
			}
			else
			{
				_tcscpy(pingOpt.tszDestIP, adapterInfo.tszDefaultGateWay);
			}
			pingOpt.dwSendBufSize = 32;
			pingOpt.dwTimeOut = 1000;
			pingOpt.ucTos = 0;
			pingOpt.ucTtl = 32;


			NKDbgPrintfW( TEXT("[NETUI] Dest IP(%s) \r\n"), pingOpt.tszDestIP );

			

			if( ping.InitPing(pingOpt, tszLiteralIP) == TRUE)
			{
				HKEY hKey = NULL;
				DWORD dwDisposition = 0;


				NKDbgPrintfW( TEXT("[NETUI] Literal IP(%s) \r\n"), tszLiteralIP );

				for(DWORD dwLoop=0; dwLoop<g_dwMaxCheckCount; dwLoop++)
				{
					if( !ping.StartPing(&pingResult) )
					{
						NKDbgPrintfW( TEXT("[NETUI] Ping Failed!(%d) \r\n"), pingResult.dwErrCode );
						dwPingFailCount++;
					}
					else
					{
						NKDbgPrintfW( TEXT("[NETUI] Size(%d), Time(%d), TTL(%d) \r\n"), pingResult.dwDataSize, pingResult.dwTime, pingResult.ucTtl );
					}


					// 1초씩 g_dwBreakInterval 만큼 쉬어준다.
					// 1초씩 마다 스레드가 종료 조건이 걸려있는지 확인
					for(UINT i=1; i<=g_dwPingInterval; i++)
					{
						// Ping Interval
						Sleep(1000);

						if(g_bIsOperating == FALSE)
						{
							return 0;
						}
					}
				}

				ping.DeinitPing();


				NKDbgPrintfW( TEXT("[NETUI] Max[%d] / Fail[%d] \r\n"), g_dwMaxCheckCount, dwPingFailCount );

				// 최대 Ping 테스트 개수가 모두 Fail 되었을때!
				if( dwPingFailCount >= g_dwMaxCheckCount )
				{
					NKDbgPrintfW( TEXT("[NETUI] Rebind Adapter! \r\n") );

					if( DoNdis_RebindAdater(adapterInfo.tszAdapterName) == FALSE )
					{
						NKDbgPrintfW( TEXT("[NETUI] DoNdis_RebindAdater ERROR!! \r\n") );
					}
				}

			}
			else
			{
				NKDbgPrintfW( TEXT("[NETUI] Init Ping ERROR!! \r\n") );
			}

			

		}
		else
		{
			NKDbgPrintfW( TEXT("[NETUI] isn't be connected to any SSID \r\n") );
		}



	}

	return 0;
}