//#define STRICT
//   Include Files
//
#include <tchar.h>
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
//#include <wininet.h>
#include  <ATKInternet.h>

#include "rwpost.h"
#include "rw_common.h"

#ifdef _DEBUG
#include <iostream.h>
#endif



static void _stdcall  myCallback(
    IN HINTERNET hInternet,
    IN DWORD_PTR dwContext,
    IN DWORD dwInternetStatus,
    IN LPVOID lpvStatusInformation OPTIONAL,
    IN DWORD dwStatusInformationLength
	);

//
// returns
// #define  RWZ_SITE_CONNECTED   1
// #define  RWZ_FAIL_TOCONNECTTOSITE  0
// #define  RWZ_SITE_REQUIRES_AUTHENTICATION 2
//
DWORD   ChkSiteAvailability( HWND hwndProxyParent, LPCTSTR szIISServer,DWORD   dwTimeOut,LPTSTR szProxyServer ,LPTSTR	szUserName,
				LPTSTR  szPassword)
				
{
	DWORD						dwRet ;
	DWORD						dwLen=1024;
	DWORD						dwAccessType ;
	HANDLE						hEvent;		
	HINTERNET					hSession;
	HINTERNET					hConnect;
	HINTERNET					hHttpFile;
	INTERNET_STATUS_CALLBACK	hI;
	char  bufQuery[32]="" ;

	DWORD dwbufQuery;
	DWORD dwLengthBufQuery;
	BOOL bQuery;

	// Date : 2/4/98
	// The below var are added for incorporatinf IE Auth Dlg
	// We are changing the Connectivity Check Via Proxy using
	// INTERNET_OPEN_PRECONFIG
	DWORD	dwProxyAuthError; // Store error returned by InternetErrorDlg
	LPTSTR  pUserName;
	LPTSTR  pPassword;
	LPTSTR  pProxyServerName;


	
	pUserName		 =_T("");
	pPassword		 =_T("");
	pProxyServerName =NULL;
	

	if(_tcscmp(szProxyServer,_T(""))){
		dwAccessType = INTERNET_OPEN_TYPE_PRECONFIG;
	}else{
		dwAccessType = INTERNET_OPEN_TYPE_DIRECT;
	}

	#ifdef _DEBUG
		RW_DEBUG << "\nServer   is :" << ConvertToANSIString(szIISServer) <<"\n" <<flush;
		RW_DEBUG << "\nTimeout  is :" << dwTimeOut <<"\n" <<flush;
		if(_tcscmp(szProxyServer,_T(""))){
			RW_DEBUG << "Proxy    is :" << ConvertToANSIString(szProxyServer) <<"\n" <<flush;
		}else{
			RW_DEBUG << "Proxy    is : NULL" <<"\n" <<flush;
		}
	#endif
	
	hSession = ATK_InternetOpen	(	_T("Registration Wizard"),
										dwAccessType,
						                pProxyServerName,
										NULL, // List of Addesss to ByPass
										INTERNET_FLAG_ASYNC
				   					);

	if (hSession == NULL){
		dwRet = RWZ_FAIL_TOCONNECTTOSITE;
		#ifdef _DEBUG
			RW_DEBUG << "InternetOpen Failed\n" << flush;
		#endif
		return dwRet;
	}
    hConnect = ATK_InternetConnect(	hSession,
									szIISServer,
									INTERNET_INVALID_PORT_NUMBER,
									pUserName,
									pPassword,
									INTERNET_SERVICE_HTTP,
									0,
									1
								   );
	if(hConnect == NULL){
		::InternetCloseHandle(hSession);
		#ifdef _DEBUG
		RW_DEBUG << "InternetConnect Failed\n" << flush;
		#endif
		dwRet = RWZ_FAIL_TOCONNECTTOSITE;
		return dwRet;
	}
	hEvent		= CreateEvent(NULL, FALSE,FALSE,_T("HTTPConnect"));
	hHttpFile	= ATK_HttpOpenRequest(	hConnect,
										_T("GET"),
										_T("/register.asp"),	
										HTTP_VERSION,
										NULL,
										0,
										INTERNET_FLAG_DONT_CACHE,
										(DWORD_PTR)hEvent
										);
	if (hHttpFile == NULL){
	#ifdef _DEBUG
			RW_DEBUG << "HttpOpenRequest Failed\n" << flush;
	#endif
		dwRet =  RWZ_FAIL_TOCONNECTTOSITE;
		CloseHandle(hEvent);
		::InternetCloseHandle(hConnect);
		::InternetCloseHandle(hSession);
		return dwRet;
	}
	//
	// Http Open is Success so continue further
	hI = InternetSetStatusCallback(hHttpFile,myCallback);
	BOOL bSendRequest = ATK_HttpSendRequest(hHttpFile, NULL, 0, 0, 0);
	DWORD dwWaitStatus = WaitForSingleObject(hEvent,dwTimeOut) ;
	// Time out Error
	if( dwWaitStatus == WAIT_TIMEOUT ){
		#ifdef _DEBUG
		RW_DEBUG << "Timeout Happened\n" << flush;
		#endif
		RW_DEBUG << "Timeout Happened\n" << flush;
		dwRet = RWZ_FAIL_TOCONNECTTOSITE;
		goto FinishFn;
	}
	if(dwWaitStatus == WAIT_FAILED){
	#ifdef _DEBUG
		RW_DEBUG << "WAIT_FAILED returned from WaitForSingleObject\n" << flush;
	#endif
		dwRet = RWZ_FAIL_TOCONNECTTOSITE;
		goto FinishFn;
	}

	dwLengthBufQuery = sizeof (dwbufQuery);
	//DWORD dwLengthBufQuery = sizeof ( bufQuery);
	bQuery = ATK_HttpQueryInfo(	hHttpFile,
										HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
										//HTTP_QUERY_CONTENT_DESCRIPTION ,
										//HTTP_QUERY_CONTENT_LENGTH ,
										&dwbufQuery,
										//bufQuery ,
				                        &dwLengthBufQuery,
										NULL) ;
	RW_DEBUG << "\nChecking Connection  To Site  via Proxy Returns[" << dwbufQuery << "]" <<flush;
	switch(dwbufQuery) {
		case HTTP_STATUS_OK:
		case HTTP_STATUS_SERVICE_UNAVAIL:
		dwRet = RWZ_SITE_CONNECTED;
		break;
		case HTTP_STATUS_PROXY_AUTH_REQ:
		// Invoking the IE Proxy Server Authentication Dialog
				dwProxyAuthError = 	InternetErrorDlg(hwndProxyParent,hHttpFile,
				ERROR_INTERNET_INCORRECT_PASSWORD,
				FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
				NULL);
				RW_DEBUG << "\nInetErrorDialog REturns " << dwProxyAuthError << flush;
				dwRet = RWZ_SITE_REQUIRES_AUTHENTICATION;
				//
				// We are not checking  for the return value because
				// connection has to be reestablished to really check
				// the info provided is valid
				/**
				02/07/98
				switch (dwProxyAuthError) {
					case ERROR_SUCCESS:
						dwRet = RWZ_SITE_CONNECTED;
						break;
					case ERROR_CANCELLED :
					case ERROR_INTERNET_FORCE_RETRY:
						dwRet = RWZ_SITE_REQUIRES_AUTHENTICATION;
						default:
						break;
					}
					**/
			break; // End of Proxy Auth
		case 0:
		case HTTP_STATUS_SERVER_ERROR:
			dwRet = RWZ_FAIL_TOCONNECTTOSITE;
			RW_DEBUG << "\n Problem in Proxy Server With connection Via Proxy " << dwbufQuery << flush;
			break;
		default:
		dwRet = RWZ_SITE_CONNECTED;
		break;	
	}			

FinishFn :
	CloseHandle(hEvent);
	::InternetCloseHandle(hHttpFile);
	::InternetCloseHandle(hConnect);
	::InternetCloseHandle(hSession);
	return dwRet;
}

void _stdcall myCallback(
						    IN HINTERNET hInternet,
						    IN DWORD_PTR dwContext,
						    IN DWORD dwInternetStatus,
						    IN LPVOID lpvStatusInformation OPTIONAL,
						    IN DWORD dwStatusInformationLength
						)
{

switch(dwInternetStatus)
	{
	case INTERNET_STATUS_RESOLVING_NAME :

#ifdef _DEBUG
			 RW_DEBUG << "\nCallback: RESOLVING_NAME\n" << flush;
#endif //_DEBUG
		 break;
	case INTERNET_STATUS_NAME_RESOLVED :

#ifdef _DEBUG
			 RW_DEBUG << "\nCallback: INTERNET_STATUS_NAME_RESOLVED\n" << flush;
#endif //_DEBUG
		 break;

	case INTERNET_STATUS_CONNECTING_TO_SERVER :

#ifdef _DEBUG
			 RW_DEBUG << "\nCallback: INTERNET_STATUS_CONNECTING_TO_SERVER\n" << flush;
#endif //_DEBUG
		 break;

	case INTERNET_STATUS_CONNECTED_TO_SERVER :

#ifdef _DEBUG
			 RW_DEBUG << "\nCallback: INTERNET_STATUS_CONNECTED_TO_SERVER\n" << flush;
#endif //_DEBUG
		 //::InternetCloseHandle(hInternet);
 		 break;

	case INTERNET_STATUS_SENDING_REQUEST :

#ifdef _DEBUG
			 RW_DEBUG << "\nCallback: INTERNET_STATUS_SENDING_REQUEST\n" << flush;
#endif //_DEBUG
		 break;

	case INTERNET_STATUS_REQUEST_SENT :

#ifdef _DEBUG
			 RW_DEBUG << "\nCallback: INTERNET_STATUS_REQUEST_SENT\n" << flush;
#endif //_DEBUG
		 break;

	case INTERNET_STATUS_RECEIVING_RESPONSE :

#ifdef _DEBUG
			 RW_DEBUG << "\nCallback: INTERNET_STATUS_RECEIVING_RESPONSE\n" << flush;
#endif //_DEBUG
		 break;

	case INTERNET_STATUS_RESPONSE_RECEIVED :

#ifdef _DEBUG
			 RW_DEBUG << "\nCallback: INTERNET_STATUS_RESPONSE_RECEIVED\n" << flush;
#endif //_DEBUG
		 break;

	case INTERNET_STATUS_REDIRECT :

#ifdef _DEBUG
			 RW_DEBUG << "\nCallback: INTERNET_STATUS_REDIRECT\n" << flush;
#endif //_DEBUG
		 break;

	case INTERNET_STATUS_CLOSING_CONNECTION :

#ifdef _DEBUG
			 RW_DEBUG << "\nCallback: INTERNET_STATUS_CLOSING_CONNECTION\n" << flush;
#endif //_DEBUG
		 break;

	case INTERNET_STATUS_CONNECTION_CLOSED :

#ifdef _DEBUG
			 RW_DEBUG << "\nCallback: INTERNET_STATUS_CONNECTION_CLOSED\n" << flush;
#endif //_DEBUG
		 break;
	case INTERNET_STATUS_HANDLE_CREATED :

#ifdef _DEBUG
			 RW_DEBUG << "\nCallback: INTERNET_STATUS_HANDLE_CREATED\n" << flush;
#endif //_DEBUG
		 break;
	case INTERNET_STATUS_REQUEST_COMPLETE :

#ifdef _DEBUG
		 RW_DEBUG << "\nCallback: INTERNET_STATUS_REQUEST_COMPLETE\n\n" << flush;

		 INTERNET_ASYNC_RESULT *x;
		 x = (INTERNET_ASYNC_RESULT *)lpvStatusInformation;
		 if(x->dwError == ERROR_SUCCESS)
		 {
			RW_DEBUG << "\nERROR_SUCCESS\n" << flush;
		 }
		 else
		 {
			RW_DEBUG << "\nERROR \ndwResult: " << (DWORD)x->dwResult <<flush;
		 }

		 if(dwStatusInformationLength == ERROR_INTERNET_EXTENDED_ERROR)
		 {
			RW_DEBUG << "\n-NO EXTENDED_ERROR\n" << flush;
		 }
			DWORD dwError;
			DWORD dwErrorLen;
			_TCHAR szErrorInfo[256];	
			dwErrorLen = 256;
			
			ATK_InternetGetLastResponseInfo(&dwError,szErrorInfo,&dwErrorLen) ;
			RW_DEBUG << "\nErrorNo:" << dwError ;
			RW_DEBUG << "\nErrorInfo:"<<szErrorInfo<<flush;
			RW_DEBUG << "\n\n" << flush;
#endif //_DEBUG
			
		 SetEvent((HANDLE)dwContext);
		 break;
	case INTERNET_STATUS_HANDLE_CLOSING :

#ifdef _DEBUG
			 RW_DEBUG << "\nCallback: INTERNET_STATUS_HANDLE_CLOSING\n" << flush;
#endif //_DEBUG
		 SetEvent((HANDLE)dwContext);
		 break;
#ifdef _DEBUG
	default :
		 RW_DEBUG <<"\n Callback : default " << flush;
#endif //_DEBUG

	}
}

#if  0
void main(int argc , char ** argv)
{

	if(argc < 2 )
	{
		RW_DEBUG << "\n\n\nThe Executable Requires the following parameters : \n" << endl;
		RW_DEBUG << " \t\tServer Name \n\t\tTimeout value \n\t\tProxyServer name\n\t\tUserName \n\t\tPassword\n\n" << endl;
		RW_DEBUG << "Following Parameters are mandatory\n\t\tServer Name \n\t\tTimeout value \n" << endl;
		return;
	}
	BOOL bRet = ChkSiteAvailability(	argv[1],atol(argv[2]),
			argv[3],argv[4],argv[5]	);

	if(bRet == TRUE)
	{
		RW_DEBUG << "Returned TRUE" << flush;
	}
	else
	{
		RW_DEBUG << "Returned FALSE" << flush;
	}

}
#endif