/*----------------------------------------------------------------------------- main.cpp Main entry and code for ICWCONN2 Copyright (C) 1996 Microsoft Corporation All rights reserved Authors: ChrisK Chris Kauffman VetriV Vellore Vetrivelkumaran Histroy: 7/22/96 ChrisK Cleaned and formatted 8/5/96 VetriV Added WIN16 code 4/29/98 donaldm removed WIN16 code -----------------------------------------------------------------------------*/ #include "pch.hpp" #include "globals.h" #include "..\inc\semaphor.h" #define IEAPPPATHKEY TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\IEXPLORE.EXE") DWORD CallCMConfig(LPCTSTR lpszINSFile, LPTSTR lpszConnectoidName); TCHAR pszINSFileName[MAX_PATH+2]; TCHAR pszFinalConnectoid[MAX_PATH+1]; HRASCONN hrasconn; TCHAR pszSetupClientURL[1024]; UINT uiSetupClientNewPhoneCall; ShowProgressParams SPParams; RECT rect; HBRUSH hbBackBrush; BOOL fUserCanceled; TCHAR szBuff256[256]; HANDLE hThread; DWORD dwThreadID; DWORD_PTR dwDownLoad; DWORD g_fNeedReboot; BOOL g_bProgressBarVisible; BOOL g_bINSFileExists; TCHAR szStrTable[irgMaxSzs][256]; int iSzTable; extern HWND g_hDialDlgWnd; // The following two functions are for My[16|32]ShellExecute BOOL fStrNCmpI (LPTSTR lp1, LPTSTR lp2, UINT iNum) { UINT i; for (i = 0; (i < iNum) && (toupper(lp1[i]) == toupper(lp2[i])); i++) {} return (i == iNum); } //+---------------------------------------------------------------------------- // // Function: IsURL // // Synopsis: Determines whether a string is URL // // Arguments: lpszCommand - the string to check // // Returns: TRUE - For our purposes, it's a URL // FALSE - Do not treat as a URL // // History: jmazner Created 10/23/96 // //----------------------------------------------------------------------------- BOOL IsURL( LPTSTR lpszCommand ) { return (fStrNCmpI(lpszCommand, TEXT("HTTP:"), 5) || fStrNCmpI(lpszCommand, TEXT("HTTPS:"), 6) || fStrNCmpI(lpszCommand, TEXT("FTP:"), 4) || fStrNCmpI(lpszCommand, TEXT("GOPHER:"), 7) || fStrNCmpI(lpszCommand, TEXT("FILE:"), 5)); } int FindFirstWhiteSpace( LPTSTR szString ); //declared below //+---------------------------------------------------------------------------- // // Function: My32ShellExecute // // Synopsis: ShellExecute a command in such a way that browsers other than // IE won't get called to handle URLs. // // If command is a URL, explicitly ShellExec IE on it, // if it's empty, shellExec IE with no parameters, and // if it's anything else, assume it's a command followed by a // parameter list, and shellExec that. // // Arguments: lpszCommand - the command to execute // // Returns: TRUE - For our purposes, it's a URL // FALSE - Do not treat as a URL // // History: 10/23/96 jmazner Created // 11/5/96 jmazner updated to use ShellExec in all cases, // to mimick behavior of start->run, // rather than dos box command line. // 4/30/97 jmazner updated to use IE AppPath reg key // (Olympus bug #200) // //----------------------------------------------------------------------------- void My32ShellExecute(LPTSTR lpszCommand) { HINSTANCE hInst = NULL; TCHAR * szParameter = NULL; TCHAR * pszIEAppPath = NULL; const TCHAR * cszGenericIE = TEXT("IEXPLORE.EXE"); DWORD dwErr = ERROR_GEN_FAILURE; LONG lSize = 0; Assert( lpszCommand ); dwErr = RegQueryValue(HKEY_LOCAL_MACHINE,IEAPPPATHKEY,NULL,&lSize); if ((ERROR_SUCCESS == dwErr || ERROR_MORE_DATA == dwErr) && (0 != lSize)) { // // add 1 for null and 10 for slop // pszIEAppPath = (LPTSTR)LocalAlloc(LPTR,lSize+2+1+10); if( pszIEAppPath ) { dwErr = RegQueryValue(HKEY_LOCAL_MACHINE,IEAPPPATHKEY, pszIEAppPath,&lSize); if( ERROR_SUCCESS != dwErr ) { LocalFree( pszIEAppPath ); pszIEAppPath = NULL; } else { Dprintf(TEXT("ICWCONN2: got IE Path of %s\n"), pszIEAppPath); } } } if( !pszIEAppPath ) { pszIEAppPath = (TCHAR *) cszGenericIE; Dprintf(TEXT("ICWCONN2: Couldn't find IE appPath, using generic %s"), pszIEAppPath); } if( IsURL(lpszCommand) ) { // If the command looks like a URL, explicitly call IE to open it // (don't want to rely on default browser) hInst = ShellExecute(NULL,TEXT("open"),pszIEAppPath,lpszCommand,NULL,SW_SHOWNORMAL); } else if( !lpszCommand[0] ) { // If there is no command, just exec IE hInst = ShellExecute(NULL,TEXT("open"),pszIEAppPath,NULL,NULL,SW_SHOWNORMAL); } else { int i = FindFirstWhiteSpace( lpszCommand ); if( 0 == i ) { hInst = ShellExecute(NULL, TEXT("open"), lpszCommand, NULL, NULL, SW_SHOWNORMAL); } else { lpszCommand[i] = '\0'; // now skip past all consecutive white space while( ' ' == lpszCommand[++i] ); szParameter = lpszCommand + i; hInst = ShellExecute(NULL, TEXT("open"), lpszCommand, szParameter, NULL, SW_SHOWNORMAL); } } if (hInst < (HINSTANCE)32) { Dprintf(TEXT("ICWCONN2: Couldn't execute the command '%s %s'\n"), lpszCommand, szParameter ? szParameter : TEXT("\0")); MessageBox(NULL,GetSz(IDS_CANTEXECUTE),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR); } } //+---------------------------------------------------------------------------- // // Function: FindFirstWhiteSpace // // Synopsis: Return the index of the first whtie space character in the // string that's not enclosed in a double quote substring // // eg: "iexplore foo.htm" should return 8, // ""c:\program files\ie" foo.htm" should return 21 // // Arguments: szString - the string to search through // // Returns: index of first qualifying white space. // if no qualifying character exists, returns 0 // // History: 11/5/96 jmazner Created for Normandy #9867 // //----------------------------------------------------------------------------- int FindFirstWhiteSpace( LPTSTR szString ) { int i = 0; Assert( szString ); if( '\"' == szString[0] ) { // Don't look for spaces within a double quoted string // (example string "c:\Program Files\bob.exe" foo.bob) i++; while( '\"' != szString[i] ) { if( NULL == szString[i] ) { AssertSz(0, "ExploreNow command has unmatched quotes!\n"); Dprintf(TEXT("ICWCONN2: FindFirstWhiteSpace discovered unmatched quote.\n")); return( 0 ); } i++; } } while( ' ' != szString[i] ) { if( NULL == szString[i] ) //there is no white space to be found return 0; i++; } return( i ); } //+--------------------------------------------------------------------------- // // Function: WaitForConnectionTermination // // Synopsis: Waits for the given Ras Connection to complete termination // // Arguments: hConn - Connection handle of the RAS connection being terminated // // Returns: TRUE if wait till connection termination was successful // FALSE otherwise // // History: 6/30/96 VetriV Created // 8/19/96 ValdonB Moved from duplicate in icwconn1\dialdlg.cpp // 8/29/96 VetriV Added code to sleep for a second on WIN 3.1 //---------------------------------------------------------------------------- // Normandy #12547 Chrisk 12-18-96 #define MAX_TIME_FOR_TERMINATION 5 BOOL WaitForConnectionTermination(HRASCONN hConn) { RASCONNSTATUS RasConnStatus; DWORD dwRetCode; INT cnt = 0; // // Get Connection status for hConn in a loop until // RasGetConnectStatus returns ERROR_INVALID_HANDLE // do { // // Intialize RASCONNSTATUS struct // GetConnectStatus API will fail if dwSize is not set correctly!! // ZeroMemory(&RasConnStatus, sizeof(RASCONNSTATUS)); RasConnStatus.dwSize = sizeof(RASCONNSTATUS); // // Sleep for a second and then get the connection status // Sleep(1000L); // Normandy #12547 Chrisk 12-18-96 cnt++; dwRetCode = RasGetConnectStatus(hConn, &RasConnStatus); if (0 != dwRetCode) return FALSE; // Normandy #12547 Chrisk 12-18-96 } while ((ERROR_INVALID_HANDLE != RasConnStatus.dwError) && (cnt < MAX_TIME_FOR_TERMINATION)); return TRUE; } // ############################################################################ // NAME: GetSz // // Load strings from resources // // Created 1/28/96, Chris Kauffman // ############################################################################ LPTSTR GetSz(WORD wszID) { LPTSTR psz = &szStrTable[iSzTable][0]; iSzTable++; if (iSzTable >= irgMaxSzs) iSzTable = 0; if (!LoadString(GetModuleHandle(NULL), wszID, psz, 256)) { Dprintf(TEXT("CONNECT2:LoadString failed %d\n"), (DWORD) wszID); *psz = 0; } return (psz); } // ############################################################################ HRESULT ReleaseBold(HWND hwnd) { HFONT hfont = NULL; hfont = (HFONT)SendMessage(hwnd,WM_GETFONT,0,0); if (hfont) DeleteObject(hfont); return ERROR_SUCCESS; } // ############################################################################ HRESULT MakeBold (HWND hwnd, BOOL fSize, LONG lfWeight) { HRESULT hr = ERROR_SUCCESS; HFONT hfont = NULL; HFONT hnewfont = NULL; LOGFONT* plogfont = NULL; if (!hwnd) goto MakeBoldExit; hfont = (HFONT)SendMessage(hwnd,WM_GETFONT,0,0); if (!hfont) { hr = GetLastError(); goto MakeBoldExit; } plogfont = (LOGFONT*)GlobalAlloc(GPTR,sizeof(LOGFONT)); if (!plogfont) { hr = GetLastError(); goto MakeBoldExit; } if (!GetObject(hfont,sizeof(LOGFONT),(LPVOID)plogfont)) { hr = GetLastError(); goto MakeBoldExit; } if (abs(plogfont->lfHeight) < 24 && fSize) { plogfont->lfHeight = plogfont->lfHeight + (plogfont->lfHeight / 4); } plogfont->lfWeight = (int)lfWeight; if (!(hnewfont = CreateFontIndirect(plogfont))) { hr = GetLastError(); goto MakeBoldExit; } SendMessage(hwnd,WM_SETFONT,(WPARAM)hnewfont,MAKELPARAM(TRUE,0)); MakeBoldExit: // if (hfont) DeleteObject(hfont); // BUG:? Do I need to delete hnewfont at some time? return hr; } // ############################################################################ extern "C" INT_PTR CALLBACK FAR PASCAL DoneDlgProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { BOOL bRet = TRUE; switch(uMsg) { case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_CMDCLOSE: case IDC_CMDEXPLORE: EndDialog(hwnd,LOWORD(wParam)); break; } break; case WM_INITDIALOG: MakeBold(GetDlgItem(hwnd,IDC_LBLTITLE),TRUE,FW_BOLD); GetPrivateProfileString( INSFILE_APPNAME,INFFILE_DONE_MESSAGE, NULLSZ,szBuff256,255,pszINSFileName); SetDlgItemText(hwnd,IDC_LBLEXPLORE,szBuff256); break; case WM_DESTROY: ReleaseBold(GetDlgItem(hwnd,IDC_LBLTITLE)); bRet = FALSE; break; case WM_CLOSE: EndDialog(hwnd,IDC_CMDCLOSE); break; default: bRet = FALSE; break; } return bRet; } // ############################################################################ extern "C" INT_PTR CALLBACK FAR PASCAL DoneRebootDlgProc(HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL bRet = TRUE; switch(uMsg) { case WM_COMMAND: switch(LOWORD(wParam)) { case WM_CLOSE: case IDC_CMDEXPLORE: EndDialog(hwnd,LOWORD(wParam)); break; } break; case WM_INITDIALOG: MakeBold(GetDlgItem(hwnd,IDC_LBLTITLE),TRUE,FW_BOLD); GetPrivateProfileString( INSFILE_APPNAME,INFFILE_DONE_MESSAGE, NULLSZ,szBuff256,255,pszINSFileName); SetDlgItemText(hwnd,IDC_LBLEXPLORE,szBuff256); break; case WM_DESTROY: ReleaseBold(GetDlgItem(hwnd,IDC_LBLTITLE)); bRet = FALSE; break; default: bRet = FALSE; break; } return bRet; } // ############################################################################ extern "C" BOOL CALLBACK FAR PASCAL StepTwoDlgProc(HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL bRet = TRUE; switch(uMsg) { default: bRet = FALSE; break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_CMDNEXT: EndDialog(hwnd,IDC_CMDNEXT); break; case IDC_CMDCANCEL: EndDialog(hwnd,IDC_CMDCANCEL); break; } break; case WM_INITDIALOG: MakeBold(GetDlgItem(hwnd,IDC_LBLTITLE),TRUE,FW_BOLD); break; case WM_DESTROY: ReleaseBold(GetDlgItem(hwnd,IDC_LBLTITLE)); bRet = FALSE; break; } return bRet; } /* // ############################################################################ BOOL CALLBACK ContextDlgProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { LRESULT lRet = TRUE; switch(uMsg) { case WM_INITDIALOG: MakeBold (GetDlgItem(hwnd, IDC_LBLARROW3NUM), FALSE, FW_BOLD); MakeBold (GetDlgItem(hwnd, IDC_LBLARROW3TEXT), FALSE, FW_BOLD); break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_CMDHELP: WinHelp(hwnd,TEXT("connect.hlp>proc4"),HELP_CONTEXT,(DWORD)idh_icwoverview); break; } break; case WM_QUIT: PostQuitMessage(0); break; default: lRet = FALSE; break; } return lRet; } */ /* // ############################################################################ BOOL CALLBACK BackDlgProc( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { HDC hdc; LRESULT lRet = TRUE; switch (uMsg) { case WM_INITDIALOG: // SET WINDOW TEXT HERE hbBackBrush = (HBRUSH)(COLOR_BACKGROUND + 1); break; case WM_SIZE: GetClientRect(hwndDlg,&rect); lRet = FALSE; // enable default processing break; case WM_CLOSE: //PostQuitMessage(0); //EndDialog(hwndDlg,FALSE); break; case WM_PAINT: hdc = GetDC(hwndDlg); FillRect(hdc,&rect,hbBackBrush); ReleaseDC(hwndDlg,hdc); lRet = 0; break; default: // let the system process the message lRet = FALSE; } return lRet; } */ // ############################################################################ void CALLBACK ProgressCallBack( HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength ) { LPTSTR pszStatus = NULL; int prc; static BOOL bMessageSet = FALSE; switch(dwInternetStatus) { case 99: prc = *(int*)lpvStatusInformation; if (!g_bProgressBarVisible) { ShowWindow(GetDlgItem(SPParams.hwnd,IDC_PROGRESS),SW_SHOW); g_bProgressBarVisible = TRUE; } SendDlgItemMessage(SPParams.hwnd, IDC_PROGRESS, PBM_SETPOS, (WPARAM)prc, 0); if (!bMessageSet) { bMessageSet = TRUE; pszStatus = GetSz(IDS_RECEIVING_RESPONSE); } break; } if (pszStatus) SetDlgItemText(SPParams.hwnd,IDC_LBLSTATUS,pszStatus); } // ############################################################################ DWORD WINAPI ThreadInit() { HINSTANCE hDLDLL; HINSTANCE hADDll = NULL; FARPROC fp; HRESULT hr; hDLDLL = LoadLibrary(DOWNLOAD_LIBRARY); if (!hDLDLL) { hr = GetLastError(); goto ThreadInitExit; } // Set up for download // fp = GetProcAddress(hDLDLL,DOWNLOADINIT); AssertSz(fp,"DownLoadInit API missing"); dwDownLoad = 0; hr = ((PFNDOWNLOADINIT)fp)(pszSetupClientURL, &dwDownLoad, g_hDialDlgWnd); if (hr != ERROR_SUCCESS) goto ThreadInitExit; // Set up progress call back // fp = GetProcAddress(hDLDLL,DOWNLOADSETSTATUS); Assert(fp); hr = ((PFNDOWNLOADSETSTATUS)fp)(dwDownLoad, &ProgressCallBack); // Download stuff // fp = GetProcAddress(hDLDLL,DOWNLOADEXECUTE); Assert(fp); hr = ((PFNDOWNLOADEXECUTE)fp)(dwDownLoad); // if there is an error, we still have to take down the window and // release the WinInet Internet handle. if (hr == ERROR_SUCCESS) { fp = GetProcAddress(hDLDLL,DOWNLOADPROCESS); Assert(fp); hr = ((PFNDOWNLOADPROCESS)fp)(dwDownLoad); } fp = GetProcAddress(hDLDLL,DOWNLOADCLOSE); Assert(fp); ((PFNDOWNLOADCLOSE)fp)(dwDownLoad); dwDownLoad = 0; ThreadInitExit: PostMessage(SPParams.hwnd,WM_DOWNLOAD_DONE,0,0); if (hDLDLL) FreeLibrary(hDLDLL); if (hADDll) FreeLibrary(hADDll); return hr; } HRESULT HangUpAll() { LPRASCONN lprasconn; DWORD cb; DWORD cConnections; DWORD idx; HRESULT hr; hr = ERROR_NOT_ENOUGH_MEMORY; lprasconn = (LPRASCONN)GlobalAlloc(GPTR,sizeof(RASCONN)); if (!lprasconn) goto SkipHangUp; cb = sizeof(RASCONN); cConnections = 0; lprasconn->dwSize = cb; //if(RasEnumConnections(lprasconn,&cb,&cConnections)) { GlobalFree(lprasconn); lprasconn = (LPRASCONN)GlobalAlloc(GPTR,(size_t)cb); if (!lprasconn) goto SkipHangUp; lprasconn->dwSize = cb; RasEnumConnections(lprasconn,&cb,&cConnections); } if (cConnections) { for (idx = 0; idx hr || RASBASEEND < hr) hr = ERROR_DOWNLOADDIDNT; hr = ShowDialErrDialog(&gi, hr, pszConnectoid, hInst, NULL); if (hr == ERROR_USERNEXT) goto TryDial; else { hr = ShowDialReallyCancelDialog(hInst, NULL, szCallHomeMsg); if (hr == ERROR_USERNEXT) goto TryDial; else if (hr == ERROR_USERCANCEL) goto CallDownLoadExit; } } } // // Determine if we should hang up // ShowExploreNow: if (0 == uiSetupClientNewPhoneCall) { HangUpAll(); } // // 1/8/96 jmazner Normanmdy #12930 // function moved to isign32.dll // // // 5/9/97 jmazner Olympus #416 // dwCMRet = CallCMConfig(pszINSFileName, pszConnectoid); switch( dwCMRet ) { case ERROR_SUCCESS: break; case ERROR_MOD_NOT_FOUND: case ERROR_DLL_NOT_FOUND: Dprintf(TEXT("ICWCONN2: CMCFG32 DLL not found, I guess CM ain't installed.\n")); break; default: //ErrorMsg(hwnd, IDS_SBSCFGERROR); break; } if (g_fNeedReboot){ int iReturnCode = 0; iReturnCode = (int)DialogBox(hInst,MAKEINTRESOURCE(IDD_DONEREBOOT), NULL,DoneRebootDlgProc); switch(iReturnCode) { case IDC_CMDEXPLORE: ExitWindowsEx(EWX_REBOOT,0); break; case IDC_CMDCLOSE: HangUpAll(); break; } } else { int iReturnCode = 0; iReturnCode = (int)DialogBox(hInst,MAKEINTRESOURCE(IDD_DONE), NULL,DoneDlgProc); switch(iReturnCode) { case IDC_CMDEXPLORE: GetPrivateProfileString( INSFILE_APPNAME,INFFILE_EXPLORE_CMD, NULLSZ,szBuff256,255,pszINSFileName); My32ShellExecute(szBuff256); break; case IDC_CMDCLOSE: HangUpAll(); break; } } CallDownLoadExit: if (pszConnectoid) GlobalFree(pszConnectoid); pszConnectoid = NULL; return hr; } // ############################################################################ HRESULT FindCurrentConn () { LPRASCONN lprasconn = NULL; DWORD cb = sizeof(RASCONN); DWORD cConnections = 0; HRESULT hr = ERROR_NOT_ENOUGH_MEMORY; unsigned int idx; lprasconn = (LPRASCONN)GlobalAlloc(GPTR,sizeof(RASCONN)); if (!lprasconn) goto FindCurrentConnExit; lprasconn[0].dwSize = sizeof(RASCONN); if(RasEnumConnections(lprasconn,&cb,&cConnections)) { GlobalFree(lprasconn); lprasconn = (LPRASCONN)GlobalAlloc(GPTR,(size_t)cb); if (!lprasconn) goto FindCurrentConnExit; RasEnumConnections(lprasconn,&cb,&cConnections); } if (pszFinalConnectoid[0] != '\0') { if (cConnections) { for (idx = 0; idxRasDeleteEntry(NULL, szRasEntry); } if (hKey) RegCloseKey(hKey); //if (hDLL) FreeLibrary(hDLL); if (pRnaapi) { delete pRnaapi; pRnaapi = NULL; } hKey = NULL; return hr; } // ############################################################################ int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nShowCmd // show state of window ) { int irc = 1; BOOL fHangUp = TRUE; HKEY hkey = NULL; RNAAPI *pRnaapi = NULL; #ifdef UNICODE // Initialize the C runtime locale to the system locale. setlocale(LC_ALL, ""); #endif // Initialize globals // ZeroMemory(pszINSFileName,MAX_PATH+1); ZeroMemory(pszFinalConnectoid,MAX_PATH+1); ZeroMemory(pszSetupClientURL,1024); // 12/3/96 jmazner Normandy #12140, 12088 // create a semaphore to signal other icw components that we're running // Since conn2 is not single instance (see semaphor.h), we don't care if // the semaphore already exists. HANDLE hSemaphore = NULL; hSemaphore = CreateSemaphore(NULL, 1, 1, ICW_ELSE_SEMAPHORE); hrasconn = NULL; uiSetupClientNewPhoneCall = FALSE; fUserCanceled = FALSE; dwDownLoad = 0; g_bProgressBarVisible =FALSE; // // Delete referal service connectoid // DeleteIRN(); // // Parse command line // if (ParseCommandLine(GetCommandLine()) != ERROR_SUCCESS) { irc = 2; Dprintf(TEXT("ICWCONN2: Malformed cmd line '%s'\n"), lpCmdLine); AssertSz(0,"Command Line parsing failed\r\n."); //CHAR szTemp[2048] = "not initialized\0"; //wsprintf(szTemp, GetSz(IDS_BAD_CMDLINE), lpCmdLine); MessageBox(NULL,GetSz(IDS_BAD_CMDLINE),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR); goto WinMainExit; } g_bINSFileExists = TRUE; if( !FileExists(pszINSFileName) ) { g_bINSFileExists = FALSE; irc = 2; TCHAR *pszTempBuff = NULL; TCHAR *pszErrString = NULL; DWORD dwBuffSize = 0; pszErrString = GetSz(IDS_MISSING_FILE); // If we can't access a resource string, we may as well just give up and quit silently if( !pszErrString ) goto WinMainExit; dwBuffSize = MAX_PATH + lstrlen( pszErrString ) + 3; //two quotes and terminating null pszTempBuff = (TCHAR *)GlobalAlloc( GPTR, dwBuffSize ); if( !pszTempBuff ) { MessageBox(NULL,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR); goto WinMainExit; } wsprintf(pszTempBuff, pszErrString); lstrcat(pszTempBuff, TEXT("\"")); lstrcat(pszTempBuff, pszINSFileName); lstrcat(pszTempBuff, TEXT("\"")); MessageBox(NULL,pszTempBuff,GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR); GlobalFree(pszTempBuff); pszTempBuff = NULL; goto WinMainExit; } // // Find the handle to the current connection // if (FindCurrentConn() != ERROR_SUCCESS) { irc = 2; AssertSz(0,"Finding current connection failed\r\n."); goto WinMainExit; } // // Get SetUp Client URL // GetPrivateProfileString( INSFILE_APPNAME,INFFILE_SETUP_CLIENT_URL, NULLSZ,pszSetupClientURL,1024,pszINSFileName); //if (pszSetupClientURL[0]) //{ uiSetupClientNewPhoneCall = GetPrivateProfileInt( INSFILE_APPNAME,INFFILE_SETUP_NEW_CALL,0,pszINSFileName); if (uiSetupClientNewPhoneCall == 1 && hrasconn) { RasHangUp(hrasconn); WaitForConnectionTermination(hrasconn); pRnaapi = new RNAAPI; if(!pRnaapi) { MessageBox(NULL,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR); goto WinMainExit; } pRnaapi->RasDeleteEntry(NULL,pszFinalConnectoid); pszFinalConnectoid[0] = '\0'; hrasconn = NULL; } CallDownLoad(&pszSetupClientURL[0],hInstance); //} //else //{ // if (hrasconn) // { // RasHangUp(hrasconn); // Sleep(3000); // } //} WinMainExit: hkey = NULL; if ((RegOpenKey(HKEY_LOCAL_MACHINE,SIGNUPKEY,&hkey)) == ERROR_SUCCESS) { RegDeleteValue(hkey,GATHERINFOVALUENAME); RegCloseKey(hkey); } if (g_bINSFileExists && pszINSFileName) { if (pszINSFileName[0] != '\0') { DeleteFileKindaLikeThisOne(pszINSFileName); } } Dprintf(TEXT("CONNECT2:Quitting WinMain.\n")); if (hrasconn) { RasHangUp(hrasconn); if (pszFinalConnectoid[0]) { if(!pRnaapi) { pRnaapi = new RNAAPI; if(!pRnaapi) { // no point in notifying user with message, we're quitting anyways Dprintf(TEXT("ICWCONN2: couldn't allocate pRnaapi memory in WinMainExit\n")); } else { pRnaapi->RasDeleteEntry(NULL,pszFinalConnectoid); } } } pszFinalConnectoid[0] = '\0'; WaitForConnectionTermination(hrasconn); hrasconn = NULL; } if (g_pdevice) GlobalFree(g_pdevice); ExitProcess(0); if (pRnaapi) { delete pRnaapi; pRnaapi = NULL; } if( hSemaphore ) CloseHandle( hSemaphore ); return irc; } static const TCHAR cszBrandingSection[] = TEXT("Branding"); static const TCHAR cszBrandingServerless[] = TEXT("Serverless"); // ############################################################################ // This function serve the single function of cleaning up after IE3.0, because // IE3.0 will issue multiple POST and get back multiple .INS files. These files // contain sensative data that we don't want lying arround, so we are going out, // guessing what their names are, and deleting them. HRESULT DeleteFileKindaLikeThisOne(LPTSTR lpszFileName) { LPTSTR lpNext = NULL; HRESULT hr = ERROR_SUCCESS; WORD wRes = 0; HANDLE hFind = NULL; WIN32_FIND_DATA sFoundFile; TCHAR szPath[MAX_PATH]; TCHAR szSearchPath[MAX_PATH + 1]; LPTSTR lpszFilePart = NULL; // Validate parameter // if (!lpszFileName || lstrlen(lpszFileName) <= 4) { hr = ERROR_INVALID_PARAMETER; goto DeleteFileKindaLikeThisOneExit; } // Check for serverless signup if (0 != GetPrivateProfileInt(cszBrandingSection,cszBrandingServerless,0,lpszFileName)) goto DeleteFileKindaLikeThisOneExit; // Determine the directory name where the INS files are located // ZeroMemory(szPath,MAX_PATH); if (GetFullPathName(lpszFileName,MAX_PATH,szPath,&lpszFilePart)) { *lpszFilePart = '\0'; } else { hr = GetLastError(); goto DeleteFileKindaLikeThisOneExit; }; // Munge filename into search parameters // lpNext = &lpszFileName[lstrlen(lpszFileName)-4]; if (CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE,lpNext,4,TEXT(".INS"),4) != 2) goto DeleteFileKindaLikeThisOneExit; ZeroMemory(szSearchPath,MAX_PATH + 1); lstrcpyn(szSearchPath,szPath,MAX_PATH); lstrcat(szSearchPath,TEXT("*.INS")); // Start wiping out files // ZeroMemory(&sFoundFile,sizeof(sFoundFile)); hFind = FindFirstFile(szSearchPath,&sFoundFile); if (hFind) { do { lstrcpy(lpszFilePart,sFoundFile.cFileName); SetFileAttributes(szPath,FILE_ATTRIBUTE_NORMAL); DeleteFile(szPath); ZeroMemory(&sFoundFile,sizeof(sFoundFile)); } while (FindNextFile(hFind,&sFoundFile)); FindClose(hFind); } hFind = NULL; DeleteFileKindaLikeThisOneExit: return hr; } //+---------------------------------------------------------------------------- // // Function: StrDup // // Synopsis: Duplicate given string // // Arguments: ppszDest - pointer to pointer that will point to string // pszSource - pointer to the string to be copied // // Returns: NULL - failure // Pointer to duplicate - success // // History: 7/26/96 ChrisK Created // //----------------------------------------------------------------------------- LPTSTR StrDup(LPTSTR *ppszDest,LPCTSTR pszSource) { if (ppszDest && pszSource) { *ppszDest = (LPTSTR)GlobalAlloc(NONZEROLPTR,lstrlen(pszSource)+1); if (*ppszDest) return (lstrcpy(*ppszDest,pszSource)); } return NULL; } //+---------------------------------------------------------------------------- // // Function: FileExists // // Synopsis: Uses FindFirstFile to determine whether a file exists on disk // // Arguments: None // // Returns: TRUE - Found the file on disk // FALSE - No file found // // History: jmazner Created 9/11/96 (as fix for Normandy #7020) // //----------------------------------------------------------------------------- BOOL FileExists(TCHAR *pszINSFileName) { Assert (pszINSFileName); HANDLE hFindResult; WIN32_FIND_DATA foundData; hFindResult = FindFirstFile( (LPCTSTR)pszINSFileName, &foundData ); FindClose( hFindResult ); if (INVALID_HANDLE_VALUE == hFindResult) { return( FALSE ); } else { return(TRUE); } } //+---------------------------------------------------------------------------- // // Function: CallCMConfig // // Synopsis: Call into the CMCFG32 dll's Configure function to allow Connection // manager to process the .ins file as needed // // Arguements: hwnd -- hwnd of parent, in case sbs wants to put up messages // lpszINSFile -- full path to the .ins file // // Returns: windows error code that cmcfg32 returns. // // History: 2/19/97 jmazner Created for Olympus #1106 (as CallSBSCfg ) // 5/9/97 jmazner Stolen from isign32 for Olympus #416 // //----------------------------------------------------------------------------- DWORD CallCMConfig(LPCTSTR lpszINSFile, LPTSTR lpszConnectoidName) { HINSTANCE hCMDLL = NULL; DWORD dwRet = ERROR_SUCCESS; TCHAR FAR cszCMCFG_DLL[] = TEXT("CMCFG32.DLL\0"); CHAR FAR cszCMCFG_CONFIGURE[] = "_CMConfig@8\0"; typedef DWORD (WINAPI * CMCONFIGURE) (LPTSTR lpszINSFile, LPTSTR lpszConnectoidName); CMCONFIGURE lpfnConfigure = NULL; Dprintf(TEXT("ICWCONN2: Calling LoadLibrary on %s\n"), cszCMCFG_DLL); hCMDLL = LoadLibrary(cszCMCFG_DLL); // // Load DLL and entry point // if (NULL != hCMDLL) { Dprintf(TEXT("ICWCONN2: Calling GetProcAddress on %s\n"), cszCMCFG_CONFIGURE); lpfnConfigure = (CMCONFIGURE)GetProcAddress(hCMDLL,cszCMCFG_CONFIGURE); } else { // // 4/2/97 ChrisK Olympus 2759 // If the DLL can't be loaded, pick a specific error message to return. // dwRet = ERROR_DLL_NOT_FOUND; goto CallCMConfigExit; } // // Call function // if( hCMDLL && lpfnConfigure ) { Dprintf(TEXT("ICWCONN2: Calling the %d entry point\n"), cszCMCFG_CONFIGURE); dwRet = lpfnConfigure((TCHAR *)lpszINSFile, lpszConnectoidName); } else { Dprintf(TEXT("ICWCONN2: Unable to call the Configure entry point\n")); dwRet = GetLastError(); } CallCMConfigExit: if( hCMDLL ) FreeLibrary(hCMDLL); if( lpfnConfigure ) lpfnConfigure = NULL; Dprintf(TEXT("ICWCONN2: CallCMConfig exiting with error code %d \n"), dwRet); return dwRet; }