//#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