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.

347 lines
11 KiB

  1. //**********************************************************************
  2. // File name: connect.cpp
  3. //
  4. // Implementation of connection point sink objects
  5. //
  6. // Functions:
  7. //
  8. // Copyright (c) 1992 - 1998 Microsoft Corporation. All rights reserved.
  9. //**********************************************************************
  10. #include "pre.h"
  11. #include <ras.h>
  12. BOOL DoOfferDownload();
  13. extern BOOL g_bWebGateCheck;
  14. extern BOOL g_bConnectionErr;
  15. /*
  16. * CRefDialEvent::QueryInterface
  17. * CRefDialEvent::AddRef
  18. * CRefDialEvent::Release
  19. *
  20. * Purpose:
  21. * IUnknown members for CRefDialEvent object.
  22. */
  23. STDMETHODIMP CRefDialEvent::QueryInterface( REFIID riid, void **ppv )
  24. {
  25. *ppv = NULL;
  26. if ( IID_IDispatch == riid || DIID__RefDialEvents == riid )
  27. {
  28. *ppv = this;
  29. }
  30. if ( NULL != *ppv )
  31. {
  32. ((LPUNKNOWN)*ppv)->AddRef();
  33. return NOERROR;
  34. }
  35. return E_NOINTERFACE;
  36. }
  37. //IDispatch
  38. STDMETHODIMP CRefDialEvent::Invoke(
  39. /* [in] */ DISPID dispIdMember,
  40. /* [in] */ REFIID /*riid*/,
  41. /* [in] */ LCID /*lcid*/,
  42. /* [in] */ WORD wFlags,
  43. /* [out][in] */ DISPPARAMS* pDispParams,
  44. /* [out] */ VARIANT* pVarResult,
  45. /* [out] */ EXCEPINFO* /*pExcepInfo*/,
  46. /* [out] */ UINT* puArgErr)
  47. {
  48. HRESULT hr = S_OK;
  49. switch(dispIdMember)
  50. {
  51. case DISPID_RasDialStatus:
  52. {
  53. ASSERT(pDispParams->rgvarg);
  54. switch(pDispParams->rgvarg->iVal)
  55. {
  56. //Dialing
  57. case RASCS_OpenPort:
  58. case RASCS_PortOpened:
  59. case RASCS_ConnectDevice:
  60. {
  61. if(!gpWizardState->iRedialCount)
  62. gpWizardState->lpSelectedISPInfo->DisplayTextWithISPName(GetDlgItem(m_hWnd,IDC_ISPDIAL_STATUS),
  63. IDS_ISPDIAL_STATUSDIALINGFMT, NULL);
  64. else
  65. gpWizardState->lpSelectedISPInfo->DisplayTextWithISPName(GetDlgItem(m_hWnd,IDC_ISPDIAL_STATUS),
  66. IDS_ISPDIAL_STATUSREDIALINGFMT, NULL);
  67. break;
  68. }
  69. //Connecting to network
  70. case RASCS_DeviceConnected:
  71. case RASCS_AllDevicesConnected:
  72. case RASCS_Authenticate:
  73. case RASCS_StartAuthentication:
  74. case RASCS_LogonNetwork:
  75. {
  76. gpWizardState->lpSelectedISPInfo->DisplayTextWithISPName(GetDlgItem(m_hWnd,IDC_ISPDIAL_STATUS),
  77. IDS_ISPDIAL_STATUSCONNECTINGFMT, NULL);
  78. break;
  79. }
  80. case RASCS_Disconnected:
  81. {
  82. BSTR bstrDialStatus = NULL;
  83. gpWizardState->pRefDial->get_DialStatusString(&bstrDialStatus);
  84. SetWindowText(GetDlgItem(m_hWnd, IDC_ISPDIAL_STATUS), W2A(bstrDialStatus));
  85. SysFreeString(bstrDialStatus);
  86. break;
  87. }
  88. default:
  89. break;
  90. }
  91. break;
  92. }
  93. case DISPID_RasConnectComplete: /* Incomplete */
  94. {
  95. if (pDispParams && !gfISPDialCancel)
  96. {
  97. if( gpWizardState->bDoneWebServRAS = pDispParams->rgvarg[0].lVal )
  98. {
  99. gpWizardState->lpSelectedISPInfo->DisplayTextWithISPName(GetDlgItem(m_hWnd,IDC_ISPDIAL_STATUS),
  100. IDS_ISPDIAL_STATUSCONNECTINGFMT, NULL);
  101. if (!DoOfferDownload())
  102. hr = E_FAIL;
  103. }
  104. }
  105. if( !gfISPDialCancel )
  106. PropSheet_PressButton(GetParent(m_hWnd),PSBTN_NEXT);
  107. break;
  108. }
  109. }
  110. return hr;
  111. }
  112. BOOL DoOfferDownload()
  113. {
  114. // If Ras is complete
  115. if (gpWizardState->bDoneWebServRAS)
  116. {
  117. ShowProgressAnimation();
  118. // Download the first page from Webgate
  119. BSTR bstrURL = NULL;
  120. BSTR bstrQueryURL = NULL;
  121. BOOL bRet;
  122. TCHAR szTemp[10]; // Big enough to format a WORD
  123. // Add the PID, GIUD, and Offer ID to the ISP data object
  124. gpWizardState->pRefDial->ProcessSignedPID(&bRet);
  125. if (bRet)
  126. {
  127. BSTR bstrSignedPID = NULL;
  128. gpWizardState->pRefDial->get_SignedPID(&bstrSignedPID);
  129. gpWizardState->pISPData->PutDataElement(ISPDATA_SIGNED_PID, W2A(bstrSignedPID), FALSE);
  130. SysFreeString(bstrSignedPID);
  131. }
  132. else
  133. {
  134. gpWizardState->pISPData->PutDataElement(ISPDATA_SIGNED_PID, NULL, FALSE);
  135. }
  136. // GUID comes from the ISPCSV file
  137. gpWizardState->pISPData->PutDataElement(ISPDATA_GUID,
  138. gpWizardState->lpSelectedISPInfo->get_szOfferGUID(),
  139. FALSE);
  140. // Offer ID comes from the ISPCSV file as a WORD
  141. // NOTE: This is the last one, so besure AppendQueryPair does not add an Ampersand
  142. wsprintf (szTemp, TEXT("%d"), gpWizardState->lpSelectedISPInfo->get_wOfferID());
  143. gpWizardState->pISPData->PutDataElement(ISPDATA_OFFERID, szTemp, FALSE);
  144. if (gpWizardState->cmnStateData.dwFlags & ICW_CFGFLAG_AUTOCONFIG)
  145. {
  146. // BUGBUG: If ISDN get the ISDN Autoconfig URL
  147. if (gpWizardState->bISDNMode)
  148. {
  149. gpWizardState->pRefDial->get_ISDNAutoConfigURL(&bstrURL);
  150. }
  151. else
  152. {
  153. gpWizardState->pRefDial->get_AutoConfigURL(&bstrURL);
  154. }
  155. }
  156. else
  157. {
  158. // Get the signup URL
  159. if (gpWizardState->bISDNMode)
  160. {
  161. gpWizardState->pRefDial->get_ISDNURL(&bstrURL);
  162. }
  163. else
  164. {
  165. gpWizardState->pRefDial->get_SignupURL(&bstrURL);
  166. }
  167. }
  168. //This flag is only to be used by ICWDEBUG.EXE
  169. if (gpWizardState->cmnStateData.dwFlags & ICW_CFGFLAG_ISPURLOVERRIDE)
  170. gpWizardState->pISPData->GetQueryString(A2W(gpWizardState->cmnStateData.ispInfo.szIspURL), &bstrQueryURL);
  171. else
  172. // Get the full signup url with Query string params added to it
  173. gpWizardState->pISPData->GetQueryString(bstrURL, &bstrQueryURL);
  174. // Setup WebGate
  175. gpWizardState->pWebGate->put_Path(bstrQueryURL);
  176. gpWizardState->pWebGate->FetchPage(0,0,&bRet);
  177. // Memory cleanup
  178. SysFreeString(bstrURL);
  179. // If the fetch failed, then return the error code
  180. if (!bRet)
  181. return FALSE;
  182. // Wait for the fetch to complete
  183. WaitForEvent(gpWizardState->hEventWebGateDone);
  184. // Start the Idle Timer
  185. StartIdleTimer();
  186. // Now that webgate is done with it, free the queryURL
  187. SysFreeString(bstrQueryURL);
  188. HideProgressAnimation();
  189. }
  190. return TRUE;
  191. }
  192. /*
  193. * CWebGateEvent::QueryInterface
  194. * CWebGateEvent::AddRef
  195. * CWebGateEvent::Release
  196. *
  197. * Purpose:
  198. * IUnknown members for CWebGateEvent object.
  199. */
  200. STDMETHODIMP CWebGateEvent::QueryInterface( REFIID riid, void **ppv )
  201. {
  202. *ppv = NULL;
  203. if ( IID_IDispatch == riid || DIID__WebGateEvents == riid )
  204. {
  205. *ppv = this;
  206. }
  207. if ( NULL != *ppv )
  208. {
  209. ((LPUNKNOWN)*ppv)->AddRef();
  210. return NOERROR;
  211. }
  212. return E_NOINTERFACE;
  213. }
  214. STDMETHODIMP CWebGateEvent::Invoke(
  215. /* [in] */ DISPID dispIdMember,
  216. /* [in] */ REFIID /*riid*/,
  217. /* [in] */ LCID /*lcid*/,
  218. /* [in] */ WORD wFlags,
  219. /* [out][in] */ DISPPARAMS* pDispParams,
  220. /* [out] */ VARIANT* pVarResult,
  221. /* [out] */ EXCEPINFO* /*pExcepInfo*/,
  222. /* [out] */ UINT* puArgErr)
  223. {
  224. switch(dispIdMember)
  225. {
  226. case DISPID_WEBGATE_DownloadComplete:
  227. {
  228. gpWizardState->bDoneWebServDownload = pDispParams->rgvarg[0].lVal;
  229. g_bWebGateCheck = FALSE;
  230. SetEvent(gpWizardState->hEventWebGateDone);
  231. break;
  232. }
  233. case DISPID_WEBGATE_DownloadProgress:
  234. {
  235. if (g_bWebGateCheck)
  236. {
  237. BOOL bConnected = FALSE;
  238. //This flag is only to be used by ICWDEBUG.EXE
  239. if (gpWizardState->cmnStateData.dwFlags & ICW_CFGFLAG_MODEMOVERRIDE)
  240. bConnected = TRUE;
  241. else
  242. gpWizardState->pRefDial->get_RasGetConnectStatus(&bConnected);
  243. if (!bConnected)
  244. {
  245. g_bWebGateCheck = FALSE;
  246. g_bConnectionErr = TRUE;
  247. SetEvent(gpWizardState->hEventWebGateDone);
  248. }
  249. }
  250. break;
  251. }
  252. }
  253. return S_OK;
  254. }
  255. /*
  256. * CINSHandlerEvent::QueryInterface
  257. * CINSHandlerEvent::AddRef
  258. * CINSHandlerEvent::Release
  259. *
  260. * Purpose:
  261. * IUnknown members for CINSHandlerEvent object.
  262. */
  263. STDMETHODIMP CINSHandlerEvent::QueryInterface( REFIID riid, void **ppv )
  264. {
  265. *ppv = NULL;
  266. if ( IID_IDispatch == riid || DIID__INSHandlerEvents == riid )
  267. {
  268. *ppv = this;
  269. }
  270. if ( NULL != *ppv )
  271. {
  272. ((LPUNKNOWN)*ppv)->AddRef();
  273. return NOERROR;
  274. }
  275. return E_NOINTERFACE;
  276. }
  277. STDMETHODIMP CINSHandlerEvent::Invoke(
  278. /* [in] */ DISPID dispIdMember,
  279. /* [in] */ REFIID /*riid*/,
  280. /* [in] */ LCID /*lcid*/,
  281. /* [in] */ WORD wFlags,
  282. /* [out][in] */ DISPPARAMS* pDispParams,
  283. /* [out] */ VARIANT* pVarResult,
  284. /* [out] */ EXCEPINFO* /*pExcepInfo*/,
  285. /* [out] */ UINT* puArgErr)
  286. {
  287. switch(dispIdMember)
  288. {
  289. case DISPID_INSHandler_KillConnection:
  290. {
  291. gpWizardState->pRefDial->DoHangup();
  292. break;
  293. }
  294. }
  295. return S_OK;
  296. }