//********************************************************************* //* Microsoft Windows ** //* Copyright(c) Microsoft Corp., 1994 ** //********************************************************************* // // INIT.C - WinMain and initialization code for Internet setup/signup wizard // // HISTORY: // // 11/20/94 jeremys Created. // 96/03/07 markdu Added gpEnumModem // 96/03/09 markdu Added gpRasEntry // 96/03/23 markdu Replaced CLIENTINFO references with CLIENTCONFIG. // 96/03/26 markdu Put #ifdef __cplusplus around extern "C" // 96/04/24 markdu NASH BUG 19289 Added /NOMSN command line flag // 96/05/14 markdu NASH BUG 21706 Removed BigFont functions. // 96/05/14 markdu NASH BUG 22681 Took out mail and news pages. // #include "wizard.h" #include "icwextsn.h" #include "imnext.h" #ifdef __cplusplus extern "C" { #endif // __cplusplus // // The LaunchSignupWizard APIs have a PBOOL argument also which gets // info to the calling APP whether they need to reboot // MKarki (5/4/97) - Fix for Bug #3111 // VOID WINAPI LaunchSignupWizard(LPTSTR lpCmdLine,int nCmdShow, PBOOL pReboot); DWORD WINAPI LaunchSignupWizardEx(LPTSTR lpCmdLine,int nReserved, PBOOL pReboot); #ifdef __cplusplus } #endif // __cplusplus BOOL ParseCommandLine(LPTSTR lpszCommandLine,DWORD * pdwFlags); TCHAR * GetTextToNextSpace(LPTSTR pszText,TCHAR * pszOutBuf,UINT cbOutBuf); #pragma data_seg(".data") WIZARDSTATE * gpWizardState=NULL; // pointer to global wizard state struct USERINFO * gpUserInfo=NULL; // pointer to global user info struct ENUM_MODEM * gpEnumModem=NULL; // pointer modem enumeration object LPRASENTRY gpRasEntry = NULL; // pointer to RASENTRY struct to hold all data DWORD gdwRasEntrySize = 0; BOOL gfFirstNewConnection = TRUE; // // set the reboot flag to FALSE // MKarki - 5/2/97 - Fix for Bug#3111 // BOOL g_bReboot = FALSE; BOOL g_bRebootAtExit = FALSE; #pragma data_seg() /******************************************************************* NAME: LaunchSignupWizard SYNOPSIS: Entry point for Internet Setup Wizard UI ********************************************************************/ extern "C" VOID WINAPI LaunchSignupWizard ( LPTSTR lpCmdLine, int nCmdShow, PBOOL pReboot ) { BOOL fOK=TRUE; // allocate global structures gpWizardState = new WIZARDSTATE; gpUserInfo = new USERINFO; gdwRasEntrySize = sizeof(RASENTRY); gpRasEntry = (LPRASENTRY) GlobalAlloc(GPTR,gdwRasEntrySize); if (!gpWizardState || !gpUserInfo || !gpRasEntry) { // display an out of memory error MsgBox(NULL,IDS_ERROutOfMemory,MB_ICONEXCLAMATION,MB_OK); fOK = FALSE; // fall through and clean up any successful allocs below } if (fOK) { DWORD dwFlags = 0; ParseCommandLine(lpCmdLine,&dwFlags); if (dwFlags & RSW_UNINSTALL) { // do uninstall if we got /uninstall on command line DoUninstall(); } else { RunSignupWizard(dwFlags); } } // free global structures if (gpWizardState) delete gpWizardState; if (gpUserInfo) delete gpUserInfo; if (gpEnumModem) delete gpEnumModem; if (gpRasEntry) GlobalFree(gpRasEntry); // // pass back the info, that the app needs to reboot or not // MKarki - 5/2/97 - Fix for Bug#3111 // *pReboot = g_bReboot; } //end of LaunchSignupWizard API call /******************************************************************* NAME: LaunchSignupWizardEx SYNOPSIS: Entry point for Internet Setup Wizard UI with back capabilities. It will retain previous information if called multiple times. The caller *MUST* call FreeSignupWizard when done. PARAMETERS: lpCmdLine - Command line with instructions nReserved - Reserved for future use RETURNS: ERROR_SUCCESS Everything's okay, wizard finished ERROR_CONTINUE User pressed back on first page ERROR_CANCELLED User cancelled out of wizard Deadly error (message already displayed) ********************************************************************/ extern "C" DWORD WINAPI LaunchSignupWizardEx ( LPTSTR lpCmdLine, int nReserved, PBOOL pReboot ) { DWORD dwRet = ERROR_SUCCESS; BOOL fFirstTime = FALSE; // allocate global structures if needed if (!gpWizardState) { gpWizardState = new WIZARDSTATE; fFirstTime = TRUE; } else { gpWizardState->uCurrentPage = ORD_PAGE_HOWTOCONNECT; gpWizardState->uPagesCompleted = 0; } if (!gpUserInfo) { gpUserInfo = new USERINFO; fFirstTime = TRUE; } if (!gpRasEntry) { gdwRasEntrySize = sizeof(RASENTRY); gpRasEntry = (LPRASENTRY) GlobalAlloc(GPTR,gdwRasEntrySize); fFirstTime = TRUE; } if (!gpWizardState || !gpUserInfo || !gpRasEntry) { MsgBox(NULL,IDS_ERROutOfMemory,MB_ICONEXCLAMATION,MB_OK); dwRet = ERROR_NOT_ENOUGH_MEMORY; } if (ERROR_SUCCESS == dwRet) { DWORD dwFlags = 0; ParseCommandLine(lpCmdLine,&dwFlags); if (dwFlags & RSW_UNINSTALL) { // do uninstall if we got /uninstall on command line DoUninstall(); } else { gfUserFinished = FALSE; gfUserBackedOut = FALSE; gfUserCancelled = FALSE; gfQuitWizard = FALSE; // On the first call, don't free the globals, we // may be called again. On subsequent calls, don't // initialize the globals either. dwFlags |= RSW_NOFREE; if (!fFirstTime) dwFlags |= RSW_NOINIT; RunSignupWizard(dwFlags); if (gfUserFinished) dwRet = ERROR_SUCCESS; else if (gfUserBackedOut) dwRet = ERROR_CONTINUE; else if (gfUserCancelled) dwRet = ERROR_CANCELLED; else dwRet = ERROR_GEN_FAILURE; } } // // pass back the info, that the app needs to reboot or not // MKarki (5/2/97) Fix for Bug #3111 // *pReboot = g_bReboot; return dwRet; } // end of LaunchSignupWizardEx API /**************************************************************************** NAME: FreeSignupWizard SYNOPSIS: Frees the global structures explicitely. This must be called if LaunchSignupWizardEx is used. ****************************************************************************/ extern "C" VOID WINAPI FreeSignupWizard(VOID) { if (gpWizardState) { delete gpWizardState; gpWizardState = NULL; } if (gpUserInfo) { delete gpUserInfo; gpUserInfo = NULL; } if (gpRasEntry) { GlobalFree(gpRasEntry); gpRasEntry = NULL; gdwRasEntrySize = 0; } if (gpEnumModem) { delete gpEnumModem; gpEnumModem = NULL; } if (gpImnApprentice) { gpImnApprentice->Release(); gpImnApprentice = NULL; } if (gfOleInitialized) CoUninitialize(); } /**************************************************************************** NAME: ParseCommandLine SYNOPSIS: Parses command line ****************************************************************************/ BOOL ParseCommandLine(LPTSTR lpszCommandLine,DWORD * pdwFlags) { if (!lpszCommandLine || !*lpszCommandLine) return TRUE; // nothing to do ASSERT(pdwFlags); *pdwFlags = 0; while (*lpszCommandLine) { TCHAR szCommand[SMALL_BUF_LEN+1]; lpszCommandLine = GetTextToNextSpace(lpszCommandLine, szCommand,sizeof(szCommand)); if (!lstrcmpi(szCommand,szNOREBOOT)) { DEBUGMSG("Got /NOREBOOT command line switch"); *pdwFlags |= RSW_NOREBOOT; } if (!lstrcmpi(szCommand,szUNINSTALL)) { DEBUGMSG("Got /UNINSTALL command line switch"); *pdwFlags |= RSW_UNINSTALL; } if (!lstrcmpi(szCommand,szNOMSN)) { DEBUGMSG("Got /NOMSN command line switch"); *pdwFlags |= RSW_NOMSN; } if (!lstrcmpi(szCommand,szNOIMN)) { DEBUGMSG("Got /NOIMN command line switch"); *pdwFlags |= RSW_NOIMN; } } return TRUE; } /**************************************************************************** NAME: GetTextToNextSpace SYNOPSIS: Gets text up to next space or end of string, places in output buffer ****************************************************************************/ TCHAR * GetTextToNextSpace(LPTSTR pszText,TCHAR * pszOutBuf,UINT cbOutBuf) { ASSERT(pszText); ASSERT(pszOutBuf); lstrcpy(pszOutBuf,szNull); if (!pszText) return NULL; // advance past spaces while (*pszText == ' ') pszText ++; while (*pszText && (*pszText != ' ') && cbOutBuf>1) { *pszOutBuf = *pszText; pszOutBuf ++; cbOutBuf --; pszText ++; } if (cbOutBuf) *pszOutBuf = '\0'; // null-terminate while (*pszText == ' ') pszText++; // advance past spaces return pszText; }