#include "isignup.h" #include "dialutil.h" #include "autodial.h" #define NUMRETRIES 3 #define MAXHANGUPDELAY 20 #define ONE_SECOND 1000 #define TIMER_ID 0 #define SMALLBUFLEN 80 static HRASCONN g_hRasConn = NULL; static UINT g_cDialAttempts = 0; static UINT g_cHangupDelay = 0; static TCHAR g_szEntryName[RAS_MaxEntryName + 1] = TEXT(""); static const TCHAR szBrowserClass1[] = TEXT("IExplorer_Frame"); static const TCHAR szBrowserClass2[] = TEXT("Internet Explorer_Frame"); static const TCHAR szBrowserClass3[] = TEXT("IEFrame"); static DWORD AutoDialConnect(HWND hDlg, LPRASDIALPARAMS lpDialParams); static BOOL AutoDialEvent(HWND hDlg, RASCONNSTATE state, LPDWORD lpdwError); static VOID SetDialogTitle(HWND hDlg, LPCTSTR pszConnectoidName); static HWND FindBrowser(void); static UINT RetryMessage(HWND hDlg, DWORD dwError); #ifdef WIN16 extern "C" BOOL CALLBACK __export AutoDialDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM Param); extern "C" BOOL CALLBACK __export PhoneNumberDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM Param); extern "C" BOOL CALLBACK __export RetryDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM Param); #else INT_PTR CALLBACK AutoDialDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM Param); INT_PTR CALLBACK PhoneNumberDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM Param); INT_PTR CALLBACK RetryDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM Param); #endif #ifdef UNICODE BOOL WINAPI AutoDialSignupW(HWND, LPCTSTR, DWORD, LPDWORD); BOOL WINAPI AutoDialSignupA ( HWND hwndParent, LPCSTR lpszEntry, DWORD dwFlags, LPDWORD pdwRetCode ) { TCHAR szEntry[RAS_MaxEntryName + 1]; mbstowcs(szEntry, lpszEntry, lstrlenA(lpszEntry)+1); return AutoDialSignupW(hwndParent, szEntry, dwFlags, pdwRetCode); } BOOL WINAPI AutoDialSignupW #else BOOL WINAPI AutoDialSignupA #endif ( HWND hwndParent, LPCTSTR lpszEntry, DWORD dwFlags, LPDWORD pdwRetCode ) { LoadRnaFunctions(hwndParent); lstrcpyn(g_szEntryName, lpszEntry, SIZEOF_TCHAR_BUFFER(g_szEntryName)); if (DialogBoxParam( ghInstance, TEXT("AutoDial"), hwndParent, AutoDialDlgProc, (DWORD_PTR)pdwRetCode) == -1) { *pdwRetCode = ERROR_CANCELLED; } if (ERROR_SUCCESS != *pdwRetCode) { HWND hwndBrowser; hwndBrowser = FindBrowser(); if (NULL != hwndBrowser) { SendMessage(hwndBrowser, WM_CLOSE, 0, 0); } } UnloadRnaFunctions(); return TRUE; } #ifdef WIN16 extern "C" BOOL CALLBACK __export AutoDialDlgProc( #else INT_PTR CALLBACK AutoDialDlgProc( #endif HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { static LPDWORD lpdwRet; static UINT uEventMsg; static LPRASDIALPARAMS lpDialParams = NULL; BOOL fPassword; switch (uMsg) { case WM_INITDIALOG: lpdwRet = (LPDWORD)lParam; SetWindowPos( hDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); g_cDialAttempts = 0; SetDialogTitle(hDlg, g_szEntryName); CenterWindow(hDlg, GetParent(hDlg)); uEventMsg = RegisterWindowMessageA( RASDIALEVENT ); if (0 == uEventMsg) { uEventMsg = WM_RASDIALEVENT; } g_hRasConn = NULL; lpDialParams = (LPRASDIALPARAMS)LocalAlloc(LPTR, sizeof(RASDIALPARAMS)); if (NULL == lpDialParams) { *lpdwRet = ERROR_OUTOFMEMORY; return FALSE; } lpDialParams->dwSize = sizeof(RASDIALPARAMS); lstrcpyn(lpDialParams->szEntryName, g_szEntryName, SIZEOF_TCHAR_BUFFER(lpDialParams->szEntryName)); *lpdwRet = lpfnRasGetEntryDialParams( NULL, lpDialParams, &fPassword); if (ERROR_SUCCESS == *lpdwRet) { lstrcpyn(lpDialParams->szPassword, GetPassword(), SIZEOF_TCHAR_BUFFER(lpDialParams->szPassword)); GetPhoneNumber(g_szEntryName, lpDialParams->szPhoneNumber); if (DialogBoxParam( ghInstance, TEXT("PhoneNumber"), hDlg, PhoneNumberDlgProc, (LPARAM)GetDisplayPhone(lpDialParams->szPhoneNumber)) != IDOK) { *lpdwRet = ERROR_USER_DISCONNECTION; EndDialog(hDlg, 0); } else { PostMessage(hDlg, WM_COMMAND, IDC_CONNECT, 0); *lpdwRet = ERROR_SUCCESS; } } if (ERROR_SUCCESS != *lpdwRet) { if (NULL != lpDialParams) { LocalFree(lpDialParams); lpDialParams = NULL; } EndDialog(hDlg, 0); } return TRUE; case WM_COMMAND: switch (wParam) { case IDC_CONNECT: ++g_cDialAttempts; ShowWindow(hDlg, SW_NORMAL); *lpdwRet = lpfnRasDial( NULL, NULL, lpDialParams, (DWORD) -1, (LPVOID)hDlg, &g_hRasConn); if (ERROR_SUCCESS != *lpdwRet) { EndDialog(hDlg, 0); } return TRUE; case IDCANCEL: if (NULL != g_hRasConn) { lpfnRasHangUp(g_hRasConn); g_hRasConn = NULL; } *lpdwRet = ERROR_USER_DISCONNECTION; EndDialog(hDlg, 0); return TRUE; case IDOK: ShowWindow(hDlg, SW_HIDE); if (MinimizeRNAWindow(g_szEntryName)) { EndDialog(hDlg, 0); } else { // try again later SetTimer(hDlg, TIMER_ID, ONE_SECOND, NULL); } return TRUE; default: break; } case WM_TIMER: if (ERROR_SUCCESS == *lpdwRet) { // try to minimize one more time MinimizeRNAWindow(g_szEntryName); EndDialog(hDlg, 0); } else if (NULL != g_hRasConn) { DWORD dwRet; RASCONNSTATUS status; status.dwSize = sizeof(RASCONNSTATUS); dwRet = lpfnRasGetConnectStatus(g_hRasConn, &status); if (ERROR_INVALID_HANDLE != dwRet) { if (0 == --g_cHangupDelay) { // wait no longer EndDialog(hDlg, 0); } return TRUE; } // hang up is complete g_hRasConn = NULL; PostMessage(hDlg, WM_COMMAND, IDC_CONNECT, 0); } KillTimer(hDlg, TIMER_ID); return TRUE; case WM_DESTROY: if (NULL != lpDialParams) { LocalFree(lpDialParams); lpDialParams = NULL; } return TRUE; default: if (uMsg == uEventMsg) { *lpdwRet = (DWORD)lParam; // AutoDialEvent returns TRUE if complete if (AutoDialEvent(hDlg, (RASCONNSTATE)wParam, lpdwRet)) { if (ERROR_SUCCESS == *lpdwRet) { // we can't just exit, if we do we won't minimize window PostMessage(hDlg, WM_COMMAND, IDOK, 0); } else { EndDialog(hDlg, 0); } } return TRUE; } } return FALSE; } static BOOL AutoDialEvent(HWND hDlg, RASCONNSTATE state, LPDWORD lpdwError) { TCHAR szMessage[SMALLBUFLEN + 1]; _RasGetStateString(state, szMessage, SIZEOF_TCHAR_BUFFER(szMessage)); SetDlgItemText(hDlg, IDC_STATUS, szMessage); if (ERROR_SUCCESS == *lpdwError) { if (state & RASCS_DONE) { // we're done dialing return TRUE; } } else { // looks like we got an error // if we haven't hungup already, hangup if (NULL != g_hRasConn) { g_cHangupDelay = MAXHANGUPDELAY; lpfnRasHangUp(g_hRasConn); } if ((ERROR_LINE_BUSY == *lpdwError) && (g_cDialAttempts < NUMRETRIES)) { LoadString(ghInstance, IDS_BUSYREDIAL, szMessage, SIZEOF_TCHAR_BUFFER(szMessage)); SetDlgItemText(hDlg, IDC_STATUS, szMessage); SetTimer(hDlg, TIMER_ID, ONE_SECOND, NULL); } else { TCHAR szError[160]; TCHAR szFmt[80]; TCHAR szMessage[240]; ShowWindow(hDlg, SW_HIDE); #if 1 lpfnRasGetErrorString( (int)*lpdwError, szError, sizeof(szError)); LoadString(ghInstance, IDS_RETRY, szFmt, SIZEOF_TCHAR_BUFFER(szFmt)); wsprintf(szMessage, szFmt, szError); if (MessageBox( hDlg, szMessage, g_szEntryName, MB_ICONEXCLAMATION | MB_RETRYCANCEL) == IDRETRY) #else if (DialogBoxParam( ghInstance, TEXT("Retry"), hDlg, RetryDlgProc, (LPARAM)*lpdwError) == IDRETRY) #endif { ShowWindow(hDlg, SW_SHOW); LoadString(ghInstance, IDS_REDIAL, szMessage, SIZEOF_TCHAR_BUFFER(szMessage)); SetDlgItemText(hDlg, IDC_STATUS, szMessage); g_cDialAttempts = 0; SetTimer(hDlg, TIMER_ID, ONE_SECOND, NULL); } else { // user cancelled *lpdwError = ERROR_USER_DISCONNECTION; return TRUE; } } } // keep dialing return FALSE; } static VOID SetDialogTitle(HWND hDlg, LPCTSTR lpszConnectoidName) { TCHAR szFmt[SMALLBUFLEN + 1]; TCHAR szTitle[RAS_MaxEntryName + SMALLBUFLEN + 1]; // load the title format ("connecting to " from resource LoadString(ghInstance, IDS_CONNECTING_TO, szFmt, SIZEOF_TCHAR_BUFFER(szFmt)); // build the title wsprintf(szTitle, szFmt, lpszConnectoidName); SetWindowText(hDlg, szTitle); } static HWND FindBrowser(void) { HWND hwnd; //look for all the microsoft browsers under the sun if ((hwnd = FindWindow(szBrowserClass1, NULL)) == NULL) { if ((hwnd = FindWindow(szBrowserClass2, NULL)) == NULL) { hwnd = FindWindow(szBrowserClass3, NULL); } } return hwnd; } #ifdef WIN16 extern "C" BOOL CALLBACK __export RetryDlgProc( #else INT_PTR CALLBACK RetryDlgProc( #endif HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_INITDIALOG: { TCHAR szMessage[SMALLBUFLEN + 1]; lpfnRasGetErrorString( (int)lParam, szMessage, sizeof(szMessage)); SetDlgItemText(hDlg, IDC_ERROR, szMessage); SetWindowText(hDlg, g_szEntryName); CenterWindow(hDlg, GetParent(hDlg)); return TRUE; } case WM_COMMAND: switch (wParam) { case IDRETRY: case IDCANCEL: EndDialog(hDlg, wParam); return TRUE; default: break; } default: break; } return FALSE; } #ifdef WIN16 extern "C" BOOL CALLBACK __export PhoneNumberDlgProc( #else INT_PTR CALLBACK PhoneNumberDlgProc( #endif HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { static LPTSTR lpszPhone; switch (uMsg) { case WM_INITDIALOG: lpszPhone = (LPTSTR)lParam; SetDlgItemText( hDlg, IDC_PHONENUMBER, lpszPhone); SetWindowText(hDlg, g_szEntryName); CenterWindow(hDlg, GetParent(hDlg)); return TRUE; case WM_COMMAND: switch (wParam) { case IDOK: GetDlgItemText( hDlg, IDC_PHONENUMBER, lpszPhone, RAS_MaxPhoneNumber - 5); case IDCANCEL: EndDialog(hDlg, wParam); return TRUE; default: break; } default: break; } return FALSE; }