DWORD WINAPI CIEBrowserEngine::NavigationTimeoutThread( LPVOID lpParameter )
{
	CIEBrowserEngine* pIEEng = reinterpret_cast<CIEBrowserEngine*>(lpParameter);

    if (pIEEng->m_dwNavigationTimeout != 0)
    {
        LOG(TRACE) + "Mobile NavThread Started\n";

	    if(pIEEng->m_hNavigated==NULL)
		    pIEEng->m_hNavigated = CreateEvent(NULL, TRUE, FALSE, L"PB_IEENGINE_NAVIGATION_IN_PROGRESS");

	    if(WaitForSingleObject(pIEEng->m_hNavigated, pIEEng->m_dwNavigationTimeout) != WAIT_OBJECT_0)
	    {
		    //no point in doing anything as there is no event handler
		    pIEEng->StopOnTab(0);
		    CloseHandle(pIEEng->m_hNavigated);
		    pIEEng->m_hNavigated = NULL;

            SendMessage(pIEEng->m_parentHWND, WM_BROWSER_ONNAVIGATIONTIMEOUT, 
                (WPARAM)pIEEng->m_tabID, (LPARAM)pIEEng->m_tcNavigatedURL);
	    }

	    LOG(TRACE) + "NavThread Ended\n";
    }

	return 0;
}
DWORD WINAPI CIEBrowserEngine::RegisterWndProcThread(LPVOID lpParameter)
{
    //  We are passed a pointer to the engine we are interested in.
    CIEBrowserEngine* pEngine = (CIEBrowserEngine*)lpParameter;

    //  The window tree appears as follows on CE:
    //  +--m_htmlHWND
    //     |
    //     +--child of m_htmlHWND
    //        |
    //        +--child which receives Windows Messages

    //  The window tree appears as follows on WM:
    //  +--m_htmlHWND
    //     |
    //     +--child of m_htmlHWND which receives Windows Messages

    //  Obtain the created HTML HWND
    HWND hwndHTML = NULL;
    HWND hwndHTMLMessageWindow = NULL;

    while (hwndHTMLMessageWindow == NULL)
    {
        hwndHTML = pEngine->GetHTMLWND(0);

        if (hwndHTML != NULL)
        {
            hwndHTMLMessageWindow = GetWindow(hwndHTML, GW_CHILD);
        }

        //  Failed to find the desired child window, take a short nap before 
        //  trying again as the window is still creating.
        Sleep(100);
    }

    PostMessage(rho_wmimpl_get_mainwnd(), PB_ONTOPMOSTWINDOW,(LPARAM)0, (WPARAM)hwndHTMLMessageWindow);

    return 0;
}
/**
* \author	Darryn Campbell (DCC, JRQ768)
* \date		October 2009
*/
LRESULT CIEBrowserEngine::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	LRESULT lResult = S_OK;

    switch (uMsg) 
	{
		case WM_NOTIFY:
		{
			//  Received a message from the Pocket Internet Explorer component
			//  to indicate something has happened (BeforeNavigate / DocumentComplete etc).
			//  The lParam contains an NM_HTMLVIEWW containing information about
			//  the event, parse it.
			NM_HTMLVIEWW * pnmHTML;
			LPNMHDR pnmh;
			pnmHTML = (NM_HTMLVIEWW *) lParam;
			pnmh    = (LPNMHDR) &(pnmHTML->hdr);
			
			//  The message has originated from one of the tabs we created, determine
			//  the tab ID from the hwnd
			//IETab* tab = GetSpecificTab(hwndParentOfOriginator);
            CIEBrowserEngine* mobileTab = CIEBrowserEngine::getInstance();

			//  Invoke the appropriate tab with the event.  The data will vary
			//  depending on which event has been received
			TCHAR tcTarget[MAX_URL + 1];
			memset (tcTarget, 0, sizeof(TCHAR) * MAX_URL + 1);
			switch (pnmh->code)
			{
			case NM_PIE_TITLE:
				//  The Page Title has been received from the Page, convert 
				//  the content to a wide string
				if (pnmHTML->szTarget)
					mbstowcs(tcTarget, (LPSTR)pnmHTML->szTarget, MAX_URL);
				if (tcTarget)
					mobileTab->InvokeEngineEventTitleChange(tcTarget);
				break;
			case NM_PIE_META:

				//  A Meta Tag has been received from the Page, convert the content
				//  and data to wide strings.
				if (pnmHTML->szTarget)
					mbstowcs(tcTarget, (LPSTR)pnmHTML->szTarget, MAX_URL);
				TCHAR tcData[MAX_URL+1];
				memset(tcData, 0, sizeof(TCHAR) * MAX_URL + 1);
				if (pnmHTML->szData)
					mbstowcs(tcData, (LPSTR)pnmHTML->szData, MAX_URL);
				//  If there is both an HTTP Equiv and some Content to the Meta
				//  tag then invoke it
				if (tcTarget && tcData)
					mobileTab->InvokeEngineEventMetaTag(tcTarget, tcData);			
				break;
			case NM_PIE_BEFORENAVIGATE:
				if (pnmHTML->szTarget)
					mbstowcs(tcTarget, (LPSTR)pnmHTML->szTarget, MAX_URL);

				// GD - stop navigation if target starts with file:// and ends with '\'.
				// This is the generated target when using <a href=""> from a local page.
				// If we don't stop it then the File Explorer is launched.
				if (wcslen (tcTarget) >= 8)
					if (!wcsnicmp (tcTarget, L"file://", 7))
						if (tcTarget [wcslen (tcTarget) - 1] == '\\')
						{
							LOG(TRACE) + "Navigation to file folder aborted\n";
							return S_FALSE;
						}
				if (tcTarget)
					mobileTab->InvokeEngineEventLoad(tcTarget, EEID_BEFORENAVIGATE);
				break;
			case NM_PIE_DOCUMENTCOMPLETE:
				if (pnmHTML->szTarget)
					mbstowcs(tcTarget, (LPSTR)pnmHTML->szTarget, MAX_URL);
				//  If the network is available but the server being reached
				//  is inaccessible the browser component appears to immediately
				//  give a document complete with the current page URL (not the
				//  page being navigated to) which is hiding the hourglass, 
				//  stop this behaviour.
				if (tcTarget && !wcsicmp(tcTarget, mobileTab->m_tcNavigatedURL))
					mobileTab->InvokeEngineEventLoad(tcTarget, EEID_DOCUMENTCOMPLETE);
				break;
			case NM_PIE_NAVIGATECOMPLETE:
				if (pnmHTML->szTarget)
					mbstowcs(tcTarget, (LPSTR)pnmHTML->szTarget, MAX_URL);
				if (tcTarget)
					mobileTab->InvokeEngineEventLoad(tcTarget, EEID_NAVIGATECOMPLETE);
				break;
			case NM_PIE_KEYSTATE:
			case NM_PIE_ALPHAKEYSTATE:
				//  Not Used
				break;

			}
		}	

		lResult = DefWindowProc(hwnd, uMsg, wParam, lParam);
	}

	return lResult;
}
DWORD WINAPI CIEBrowserEngine::NavigationTimeoutThread( LPVOID lpParameter )
{
    CIEBrowserEngine* pIEEng = reinterpret_cast<CIEBrowserEngine*>(lpParameter);
    DWORD dwWaitResult;
    
    bool flag=false;
    HWND authwindowhandle;
    if (pIEEng->m_dwNavigationTimeout != 0)
    {
        LOG(TRACE) + "Mobile NavThread Started\n";
        
        	do
        	{

			dwWaitResult = WaitForSingleObject(pIEEng->m_hNavigated, pIEEng->m_dwNavigationTimeout);

			switch (dwWaitResult) 
			{
				// Event object was signaled
				case WAIT_OBJECT_0: 
					//
					// TODO: Read from the shared buffer
					//
					LOG(INFO) + "NavigationTimeoutThread:Event object was signaled\n";
									
					CloseHandle(pIEEng->m_hNavigated);
					pIEEng->m_hNavigated = NULL;
					flag=false;
					break; 
				case WAIT_TIMEOUT: 
					//
					// TODO: Read from the shared buffer
					//
					LOG(INFO) + "NavigationTimeoutThread:timeout\n";
				
					HWND currentForeGroundWindowHandle;
					currentForeGroundWindowHandle = GetForegroundWindow();
					wchar_t szBuf[200];
					if(currentForeGroundWindowHandle!=NULL)
					{
					GetWindowText(currentForeGroundWindowHandle,szBuf,199);
					LOG(INFO) + szBuf;
					}
					
					authwindowhandle = FindWindow(null,L"Enter Network Password");
	
					if(authwindowhandle)
					{
					LOG(INFO) + "Authentication window present";
					LOG(INFO) + "NavigationTimeoutThread:Authentication popup\n";
					flag=true;
					break;
					}
					else
					{
					flag=false;
					LOG(INFO) + "NavigationTimeoutThread:Navigation Timed out\n";
					LOG(INFO) + "Authentication window not present";
					}
					pIEEng->StopOnTab(0);
						
					CloseHandle(pIEEng->m_hNavigated);
					pIEEng->m_hNavigated = NULL;
					SendMessage(pIEEng->m_parentHWND, WM_BROWSER_ONNAVIGATIONTIMEOUT, 
					(WPARAM)pIEEng->m_tabID, (LPARAM)_tcsdup(pIEEng->m_tcNavigatedURL));

					break; 

				// An error occurred
				default: 
					LOG(INFO) + "Wait error  GetLastError()=\n"+ GetLastError();
					flag=false;
					return 0; 
			}
        	

			 LOG(TRACE) + "NavThread Ended\n";
        	}while(flag);
    }

	return 0;
}