Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

434 lines
16 KiB

  1. //**********************************************************************
  2. // File name: ICWCONN.cpp
  3. //
  4. // Main source file for the Internet Connection Wizard extension DLL
  5. //
  6. // Functions:
  7. //
  8. // Copyright (c) 1992 - 1998 Microsoft Corporation. All rights reserved.
  9. //**********************************************************************
  10. #include "pre.h"
  11. #include "webvwids.h"
  12. // local function prototypes
  13. BOOL AllocDialogIDList( void );
  14. BOOL DialogIDAlreadyInUse( UINT uDlgID );
  15. BOOL SetDialogIDInUse( UINT uDlgID, BOOL fInUse );
  16. #pragma data_seg(".data")
  17. WIZARDSTATE *gpWizardState=NULL; // pointer to global wizard state struct
  18. IICWWebView *gpICWWebView[2];
  19. #ifdef NEED_EXTENSION
  20. DWORD *g_pdwDialogIDList = NULL;
  21. DWORD g_dwDialogIDListSize = 0;
  22. UINT g_uICWCONN1UIFirst, g_uICWCONN1UILast;
  23. BOOL g_fICWCONN1UILoaded = FALSE;
  24. CICWExtension *g_pCICW50Extension = NULL;
  25. #endif
  26. //
  27. // Table of data for each wizard page
  28. //
  29. // This includes the dialog template ID and pointers to functions for
  30. // each page. Pages need only provide pointers to functions when they
  31. // want non-default behavior for a certain action (init,next/back,cancel,
  32. // dlg ctrl).
  33. //
  34. PAGEINFO PageInfo[NUM_WIZARD_PAGES] =
  35. {
  36. { IDD_PAGE_ISPSELECT, TRUE, ISPSelectInitProc, NULL, ISPSelectOKProc, NULL, NULL, ISPSelectNotifyProc, 0, 0, IDA_ISPSELECT, NULL, NULL },
  37. { IDD_PAGE_NOOFFER, TRUE, NoOfferInitProc, NULL, NoOfferOKProc, NULL, NULL, NULL, 0, 0, 0, NULL, NULL },
  38. { IDD_PAGE_USERINFO, FALSE, UserInfoInitProc, NULL, UserInfoOKProc, NULL, NULL, NULL, IDS_STEP2_TITLE, 0, 0, NULL, NULL },
  39. { IDD_PAGE_BILLINGOPT, TRUE, BillingOptInitProc, NULL, BillingOptOKProc, NULL, NULL, NULL, IDS_STEP2_TITLE, 0, IDA_BILLINGOPT, NULL, NULL },
  40. { IDD_PAGE_PAYMENT, FALSE, PaymentInitProc, NULL, PaymentOKProc, PaymentCmdProc, NULL, NULL, IDS_STEP2_TITLE, 0, IDA_PAYMENT, NULL, NULL },
  41. { IDD_PAGE_ISPDIAL, FALSE, ISPDialInitProc, ISPDialPostInitProc, ISPDialOKProc, NULL, ISPDialCancelProc, NULL, IDS_STEP2_TITLE, 0, 0, NULL, NULL },
  42. { IDD_PAGE_ISPDATA, TRUE, ISPPageInitProc, NULL, ISPPageOKProc, ISPCmdProc, NULL, NULL, IDS_STEP2_TITLE, 0, IDA_ISPDATA, NULL, NULL },
  43. { IDD_PAGE_OLS, TRUE, OLSInitProc, NULL, OLSOKProc, NULL, NULL, NULL, IDS_OLS_TITLE, 0, 0, NULL, NULL },
  44. { IDD_PAGE_DIALERROR, FALSE, DialErrorInitProc, NULL, DialErrorOKProc, DialErrorCmdProc, NULL, NULL, IDS_DIALING_ERROR_TITLE,0, IDA_DIALERROR, NULL, NULL },
  45. { IDD_PAGE_SERVERROR, FALSE, ServErrorInitProc, NULL, ServErrorOKProc, ServErrorCmdProc, NULL, NULL, IDS_SERVER_ERROR_TITLE, 0, IDA_SERVERROR, NULL, NULL },
  46. { IDD_PAGE_ACFG_ISP, TRUE, ISPAutoSelectInitProc, NULL, ISPAutoSelectOKProc,NULL, NULL, ISPAutoSelectNotifyProc, IDS_STEP1_TITLE, 0, IDA_ACFG_ISP, NULL, NULL },
  47. { IDD_PAGE_ACFG_NOOFFER, TRUE, ACfgNoofferInitProc, NULL, ACfgNoofferOKProc, NULL, NULL, NULL, IDS_MANUAL_TITLE, 0, 0, NULL, NULL },
  48. { IDD_PAGE_ISDN_NOOFFER, TRUE, ISDNNoofferInitProc, NULL, ISDNNoofferOKProc, NULL, NULL, NULL, 0, 0, 0, NULL, NULL },
  49. { IDD_PAGE_OEMOFFER, TRUE, OEMOfferInitProc, NULL, OEMOfferOKProc, OEMOfferCmdProc, NULL, NULL, IDS_STEP1_TITLE, 0, IDA_OEMOFFER, NULL, NULL }
  50. };
  51. BOOL gfQuitWizard = FALSE; // global flag used to signal that we want to terminate the wizard ourselves
  52. BOOL gfUserCancelled = FALSE; // global flag used to signal that the user cancelled
  53. BOOL gfISPDialCancel = FALSE; // global flag used to signal that the user cancelled
  54. BOOL gfUserBackedOut = FALSE; // global flag used to signal that the user pressed Back on the first page
  55. BOOL gfUserFinished = FALSE; // global flag used to signal that the user pressed Finish on the final page
  56. BOOL gfBackedUp = FALSE;
  57. BOOL gfReboot = FALSE;
  58. BOOL g_bMalformedPage = FALSE;
  59. #pragma data_seg()
  60. BOOL CleanupWizardState(WIZARDSTATE * pWizardState);
  61. /*******************************************************************
  62. NAME: InitWizardState
  63. SYNOPSIS: Initializes wizard state structure
  64. ********************************************************************/
  65. BOOL InitWizardState(WIZARDSTATE * pWizardState)
  66. {
  67. HRESULT hr;
  68. ASSERT(pWizardState);
  69. //register the Native font control so the dialog won't fail
  70. //although it's registered in the exe this is a "just in case"
  71. INITCOMMONCONTROLSEX iccex;
  72. iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
  73. iccex.dwICC = ICC_NATIVEFNTCTL_CLASS;
  74. if (!InitCommonControlsEx(&iccex))
  75. return FALSE;
  76. // zero out structure
  77. ZeroMemory(pWizardState,sizeof(WIZARDSTATE));
  78. // set starting page
  79. pWizardState->uCurrentPage = ORD_PAGE_ISPSELECT;
  80. pWizardState->fNeedReboot = FALSE;
  81. pWizardState->bISDNMode = FALSE;
  82. pWizardState->himlIspSelect = NULL;
  83. pWizardState->uNumTierOffer = 0;
  84. for (UINT i=0; i < MAX_OEM_MUTI_TIER; i++)
  85. pWizardState->lpOEMISPInfo[i] = NULL;
  86. // Instansiate ICWHELP objects
  87. hr = CoCreateInstance(CLSID_UserInfo,NULL,CLSCTX_INPROC_SERVER,
  88. IID_IUserInfo,(LPVOID *)&pWizardState->pUserInfo);
  89. if (FAILED(hr))
  90. goto InitWizardStateError;
  91. hr = CoCreateInstance(CLSID_RefDial,NULL,CLSCTX_INPROC_SERVER,
  92. IID_IRefDial,(LPVOID *)&pWizardState->pRefDial);
  93. if (FAILED(hr))
  94. goto InitWizardStateError;
  95. hr = CoCreateInstance(CLSID_WebGate,NULL,CLSCTX_INPROC_SERVER,
  96. IID_IWebGate,(LPVOID *)&pWizardState->pWebGate);
  97. if (FAILED(hr))
  98. goto InitWizardStateError;
  99. hr = CoCreateInstance(CLSID_INSHandler,NULL,CLSCTX_INPROC_SERVER,
  100. IID_IINSHandler,(LPVOID *)&pWizardState->pINSHandler);
  101. if (FAILED(hr))
  102. goto InitWizardStateError;
  103. hr = CoCreateInstance(CLSID_ICWWEBVIEW,NULL,CLSCTX_INPROC_SERVER,
  104. IID_IICWWebView,(LPVOID *)&pWizardState->pICWWebView);
  105. if (FAILED(hr))
  106. goto InitWizardStateError;
  107. hr = CoCreateInstance(CLSID_ICWWALKER,NULL,CLSCTX_INPROC_SERVER,
  108. IID_IICWWalker,(LPVOID *)&pWizardState->pHTMLWalker);
  109. if (FAILED(hr))
  110. goto InitWizardStateError;
  111. hr = CoCreateInstance(CLSID_ICWGIFCONVERT,NULL,CLSCTX_INPROC_SERVER,
  112. IID_IICWGifConvert,(LPVOID *)&pWizardState->pGifConvert);
  113. if (FAILED(hr))
  114. goto InitWizardStateError;
  115. hr = CoCreateInstance(CLSID_ICWISPDATA,NULL,CLSCTX_INPROC_SERVER,
  116. IID_IICWISPData,(LPVOID *)&pWizardState->pISPData);
  117. if (FAILED(hr))
  118. goto InitWizardStateError;
  119. if ( !pWizardState->pUserInfo ||
  120. !pWizardState->pWebGate ||
  121. !pWizardState->pINSHandler ||
  122. !pWizardState->pHTMLWalker ||
  123. !pWizardState->pRefDial ||
  124. !pWizardState->pICWWebView ||
  125. !pWizardState->pGifConvert ||
  126. !pWizardState->pISPData ||
  127. !pWizardState->pHTMLWalker)
  128. {
  129. goto InitWizardStateError;
  130. }
  131. // Init the walker for use with trident
  132. hr = pWizardState->pHTMLWalker->InitForMSHTML();
  133. if (FAILED(hr))
  134. goto InitWizardStateError;
  135. if ((pWizardState->pStorage = new CStorage) == NULL)
  136. {
  137. goto InitWizardStateError;
  138. }
  139. pWizardState->hEventWebGateDone = CreateEvent(NULL, FALSE, FALSE, NULL);
  140. if (!pWizardState->hEventWebGateDone)
  141. goto InitWizardStateError;
  142. // Success error return path
  143. return TRUE;
  144. InitWizardStateError:
  145. // Free any co-created objects
  146. CleanupWizardState(pWizardState);
  147. return FALSE;
  148. }
  149. BOOL CleanupWizardState(WIZARDSTATE * pWizardState)
  150. {
  151. if (pWizardState->pHTMLWalker)
  152. {
  153. pWizardState->pHTMLWalker->TermForMSHTML();
  154. pWizardState->pHTMLWalker->Release();
  155. pWizardState->pHTMLWalker = NULL;
  156. }
  157. if (pWizardState->pICWWebView)
  158. {
  159. pWizardState->pICWWebView->Release();
  160. pWizardState->pICWWebView = NULL;
  161. }
  162. if (gpICWWebView[0])
  163. {
  164. gpICWWebView[0]->Release();
  165. gpICWWebView[0] = NULL;
  166. }
  167. if (gpICWWebView[1])
  168. {
  169. gpICWWebView[1]->Release();
  170. gpICWWebView[1] = NULL;
  171. }
  172. if (NULL != gpWizardState->himlIspSelect)
  173. {
  174. ImageList_Destroy(gpWizardState->himlIspSelect);
  175. gpWizardState->himlIspSelect = NULL;
  176. }
  177. if (pWizardState->pGifConvert)
  178. {
  179. pWizardState->pGifConvert->Release();
  180. pWizardState->pGifConvert = NULL;
  181. }
  182. if (pWizardState->pISPData)
  183. {
  184. pWizardState->pISPData->Release();
  185. pWizardState->pISPData = NULL;
  186. }
  187. if (pWizardState->pUserInfo)
  188. {
  189. BOOL bRetVal;
  190. // Before releasing the userinfo object, we should persist the user data if
  191. // necessary
  192. if (!gfUserCancelled && gpWizardState->bWasNoUserInfo && gpWizardState->bUserEnteredData)
  193. pWizardState->pUserInfo->PersistRegisteredUserInfo(&bRetVal);
  194. pWizardState->pUserInfo->Release();
  195. pWizardState->pUserInfo = NULL;
  196. }
  197. if (pWizardState->pRefDial)
  198. {
  199. pWizardState->pRefDial->Release();
  200. pWizardState->pRefDial = NULL;
  201. }
  202. if (pWizardState->pWebGate)
  203. {
  204. pWizardState->pWebGate->Release();
  205. pWizardState->pWebGate = NULL;
  206. }
  207. if (pWizardState->pINSHandler)
  208. {
  209. pWizardState->pINSHandler->Release();
  210. pWizardState->pINSHandler = NULL;
  211. }
  212. if (pWizardState->pStorage)
  213. {
  214. delete pWizardState->pStorage;
  215. }
  216. for (UINT i=0; i < pWizardState->uNumTierOffer; i++)
  217. {
  218. if (pWizardState->lpOEMISPInfo[i])
  219. {
  220. // Prevent deleting it twice
  221. if (pWizardState->lpOEMISPInfo[i] != pWizardState->lpSelectedISPInfo)
  222. {
  223. delete pWizardState->lpOEMISPInfo[i];
  224. pWizardState->lpOEMISPInfo[i] = NULL;
  225. }
  226. }
  227. }
  228. if (pWizardState->lpSelectedISPInfo)
  229. {
  230. delete pWizardState->lpSelectedISPInfo;
  231. }
  232. if (pWizardState->hEventWebGateDone)
  233. {
  234. CloseHandle(pWizardState->hEventWebGateDone);
  235. pWizardState->hEventWebGateDone = 0;
  236. }
  237. // Kill the idle timer just in case.
  238. KillIdleTimer();
  239. return TRUE;
  240. }
  241. #ifdef NEED_EXTENSION
  242. //+----------------------------------------------------------------------------
  243. //
  244. // Function AllocDialogIDList
  245. //
  246. // Synopsis Allocates memory for the g_pdwDialogIDList variable large enough
  247. // to maintain 1 bit for every valid external dialog ID
  248. //
  249. // Arguments None
  250. //
  251. // Returns TRUE if allocation succeeds
  252. // FALSE otherwise
  253. //
  254. // History 4/23/97 jmazner created
  255. //
  256. //-----------------------------------------------------------------------------
  257. BOOL AllocDialogIDList( void )
  258. {
  259. ASSERT( NULL == g_pdwDialogIDList );
  260. if( g_pdwDialogIDList )
  261. {
  262. TraceMsg(TF_ICWCONN,"ICWCONN: AllocDialogIDList called with non-null g_pdwDialogIDList!");
  263. return FALSE;
  264. }
  265. // determine maximum number of external dialogs we need to track
  266. UINT uNumExternDlgs = EXTERNAL_DIALOGID_MAXIMUM - EXTERNAL_DIALOGID_MINIMUM + 1;
  267. // we're going to need one bit for each dialogID.
  268. // Find out how many DWORDS it'll take to get this many bits.
  269. UINT uNumDWORDsNeeded = (uNumExternDlgs / ( 8 * sizeof(DWORD) )) + 1;
  270. // set global var with length of the array
  271. g_dwDialogIDListSize = uNumDWORDsNeeded;
  272. g_pdwDialogIDList = (DWORD *) GlobalAlloc(GPTR, uNumDWORDsNeeded * sizeof(DWORD));
  273. if( !g_pdwDialogIDList )
  274. {
  275. TraceMsg(TF_ICWCONN,"ICWCONN: AllocDialogIDList unable to allocate space for g_pdwDialogIDList!");
  276. return FALSE;
  277. }
  278. return TRUE;
  279. }
  280. //+----------------------------------------------------------------------------
  281. //
  282. // Function DialogIDAlreadyInUse
  283. //
  284. // Synopsis Checks whether a given dialog ID is marked as in use in the
  285. // global array pointed to by g_pdwDialogIDList
  286. //
  287. // Arguments uDlgID -- Dialog ID to check
  288. //
  289. // Returns TRUE if -- DialogID is out of range defined by EXTERNAL_DIALOGID_*
  290. // -- DialogID is marked as in use
  291. // FALSE if DialogID is not marked as in use
  292. //
  293. // History 4/23/97 jmazner created
  294. //
  295. //-----------------------------------------------------------------------------
  296. BOOL DialogIDAlreadyInUse( UINT uDlgID )
  297. {
  298. if( (uDlgID < EXTERNAL_DIALOGID_MINIMUM) ||
  299. (uDlgID > EXTERNAL_DIALOGID_MAXIMUM) )
  300. {
  301. // this is an out-of-range ID, don't want to accept it.
  302. TraceMsg(TF_ICWCONN,"ICWCONN: DialogIDAlreadyInUse received an out of range DialogID, %d", uDlgID);
  303. return TRUE;
  304. }
  305. // find which bit we need
  306. UINT uBitToCheck = uDlgID - EXTERNAL_DIALOGID_MINIMUM;
  307. UINT bitsInADword = 8 * sizeof(DWORD);
  308. UINT baseIndex = uBitToCheck / bitsInADword;
  309. ASSERT( (baseIndex < g_dwDialogIDListSize));
  310. DWORD dwBitMask = 0x1 << uBitToCheck%bitsInADword;
  311. BOOL fBitSet = g_pdwDialogIDList[baseIndex] & (dwBitMask);
  312. return( fBitSet );
  313. }
  314. //+----------------------------------------------------------------------------
  315. //
  316. // Function SetDialogIDInUse
  317. //
  318. // Synopsis Sets or clears the in use bit for a given DialogID
  319. //
  320. // Arguments uDlgID -- Dialog ID for which to change status
  321. // fInUse -- New value for the in use bit.
  322. //
  323. // Returns TRUE if status change succeeded.
  324. // FALSE if DialogID is out of range defined by EXTERNAL_DIALOGID_*
  325. //
  326. // History 4/23/97 jmazner created
  327. //
  328. //-----------------------------------------------------------------------------
  329. BOOL SetDialogIDInUse( UINT uDlgID, BOOL fInUse )
  330. {
  331. if( (uDlgID < EXTERNAL_DIALOGID_MINIMUM) ||
  332. (uDlgID > EXTERNAL_DIALOGID_MAXIMUM) )
  333. {
  334. // this is an out-of-range ID, don't want to accept it.
  335. TraceMsg(TF_ICWCONN,"ICWCONN: SetDialogIDInUse received an out of range DialogID, %d", uDlgID);
  336. return FALSE;
  337. }
  338. // find which bit we need
  339. UINT uBitToCheck = uDlgID - EXTERNAL_DIALOGID_MINIMUM;
  340. UINT bitsInADword = 8 * sizeof(DWORD);
  341. UINT baseIndex = uBitToCheck / bitsInADword;
  342. ASSERT( (baseIndex < g_dwDialogIDListSize));
  343. DWORD dwBitMask = 0x1 << uBitToCheck%bitsInADword;
  344. if( fInUse )
  345. {
  346. g_pdwDialogIDList[baseIndex] |= (dwBitMask);
  347. }
  348. else
  349. {
  350. g_pdwDialogIDList[baseIndex] &= ~(dwBitMask);
  351. }
  352. return TRUE;
  353. }
  354. #endif
  355. DWORD WINAPI GetICWCONNVersion()
  356. {
  357. return ICW_DOWNLOADABLE_COMPONENT_VERSION;
  358. }