WebBrowser.cpp 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150
  1. /*
  2. ** Command & Conquer Renegade(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /******************************************************************************
  19. *
  20. * NAME
  21. * $Archive: /Commando/Code/Commando/WebBrowser.cpp $
  22. *
  23. * DESCRIPTION
  24. *
  25. * PROGRAMMER
  26. * Denzil E. Long, Jr.
  27. * $Author: Denzil_l $
  28. *
  29. * VERSION INFO
  30. * $Revision: 24 $
  31. * $Modtime: 1/18/02 10:31p $
  32. *
  33. ******************************************************************************/
  34. #include "always.h"
  35. #include "WebBrowser.h"
  36. #include <WWLib\WWCOMUtil.h>
  37. #include <WW3D2\WW3D.h>
  38. #include <WWOnline\WOLLoginInfo.h>
  39. #include <WWDebug\WWDebug.h>
  40. #include "win.h"
  41. #include "_globals.h"
  42. WebBrowser* WebBrowser::_mInstance = NULL;
  43. /******************************************************************************
  44. *
  45. * NAME
  46. * WebBrowser::InstallPrerequisites
  47. *
  48. * DESCRIPTION
  49. *
  50. * INPUTS
  51. * NONE
  52. *
  53. * RESULT
  54. * True if successful.
  55. *
  56. ******************************************************************************/
  57. #ifdef _DEBUG
  58. bool WebBrowser::InstallPrerequisites(void)
  59. {
  60. // Check if the WOLBrowser component is installed by attempting to obtain
  61. // the WOLBrowser class object. If we can get the class object then the
  62. // component is already registered.
  63. CComPtr<IClassFactory> factory;
  64. HRESULT hr = CoGetClassObject(CLSID_WOLBrowser, CLSCTX_INPROC_SERVER, NULL,
  65. IID_IClassFactory, (void**)&factory);
  66. // If the component isn't registered then check for it in the run directory
  67. // and register it if found.
  68. if (FAILED(hr))
  69. {
  70. WWDEBUG_SAY(("WOLBrowser component not installed, attempting to locate in run directory\n"));
  71. // Attempt to find the WOLBrowser server in the run directory.
  72. char dllPath[512];
  73. DWORD length = GetCurrentDirectory(sizeof(dllPath), dllPath);
  74. if (length == 0)
  75. {
  76. WWDEBUG_SAY(("GetCurrentDirectory() failed!\n"));
  77. Print_Win32Error(GetLastError());
  78. return false;
  79. }
  80. WWDEBUG_SAY(("Registering WOLBrowser component\n"));
  81. strcat(dllPath, "\\WolBrowser.dll");
  82. bool success = RegisterCOMServer(dllPath);
  83. if (!success)
  84. {
  85. WWDEBUG_SAY(("Failed to register WOLBrowser.dll!\n"));
  86. ::MessageBox(NULL, "WOLBrowser.dll not registered!\n\nDefaulting to external browser.",
  87. "Renegade Warning!", MB_ICONWARNING|MB_OK);
  88. return false;
  89. }
  90. }
  91. // Attempt to open the URL key
  92. HKEY key;
  93. LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, APPLICATION_SUB_KEY_NAME_URL, 0, KEY_ALL_ACCESS, &key);
  94. if (ERROR_SUCCESS != result)
  95. {
  96. WWDEBUG_SAY(("URL entry not in the registry\n"));
  97. ::MessageBox(NULL, "Embedded Browser prerequisite error!\n\nURL key not found.",
  98. "Renegade Warning!", MB_ICONWARNING|MB_OK);
  99. // Attempt to create the key.
  100. LONG result = RegCreateKeyEx(HKEY_LOCAL_MACHINE, APPLICATION_SUB_KEY_NAME_URL, 0, NULL,
  101. REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL);
  102. if (ERROR_SUCCESS != result)
  103. {
  104. WWDEBUG_SAY(("Failed to create URL entry in registry\n"));
  105. ::MessageBox(NULL, "Failed to create Embedded Browser URLS\n\nURL key not found.",
  106. "Renegade Warning!", MB_ICONWARNING|MB_OK);
  107. return false;
  108. }
  109. // Check for registry entries.
  110. struct URLEntry
  111. {
  112. const char* Name;
  113. const char* Data;
  114. };
  115. static URLEntry urls[] =
  116. {
  117. {"BattleClans", "http://renchat2.westwood.com/cgi-bin/cgiclient?ren_clan_manager&request=expand_template&Template=index.html&SKU=3072&LANGCODE=0&embedded=1"},
  118. {"BattleClansX", "http://renchat2.westwood.com/cgi-bin/cgiclient?ren_clan_manager&request=expand_template&Template=index.html&SKU=3072&LANGCODE=0"},
  119. {"Ladder", "http://renchat2.westwood.com/renegade_embedded/index.html"},
  120. {"LadderX", "http://renchat2.westwood.com/renegade/index.html"},
  121. {"NetStatus", "http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_netstatus&LANGCODE=0&SKU=3072&embedded=1"},
  122. {"NetStatusX", "http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_netstatus&LANGCODE=0&SKU=3072"},
  123. {"News", "http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_news&LANGCODE=0&SKU=3072&embedded=1"},
  124. {"NewsX", "http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_news&LANGCODE=0&SKU=3072"},
  125. {"Signup", "http://games2.westwood.com/cgi-bin/cgiclient?ren_reg2&request=expand_template&Template=newreg_menu.html&LANGCODE=0&embedded=1&SKU=3072"},
  126. {"SignupX", "http://games2.westwood.com/cgi-bin/cgiclient?ren_reg2&request=expand_template&Template=newreg_menu.html&LANGCODE=0"},
  127. {NULL, NULL}
  128. };
  129. const char* valueName = urls[0].Name;
  130. int index = 0;
  131. while (valueName)
  132. {
  133. DWORD type;
  134. char data[512];
  135. DWORD size = sizeof(data);
  136. result = RegQueryValueEx(key, valueName, NULL, &type, (LPBYTE)&data, &size);
  137. // If the URL value is not found then add it.
  138. const char* valueData = urls[index].Data;
  139. if (ERROR_SUCCESS != result || (strcmp(valueData, data) != 0))
  140. {
  141. result = RegSetValueEx(key, valueName, NULL, REG_SZ, (CONST BYTE*)valueData,
  142. (strlen(valueData) + 1));
  143. if (ERROR_SUCCESS != result)
  144. {
  145. WWDEBUG_SAY(("Failed to create URL entry '%s' in registry\n", valueName));
  146. char errorMsg[256];
  147. sprintf(errorMsg, "Embedded Browser prerequisite error!\n\nURL key '%s'", valueName);
  148. ::MessageBox(NULL, errorMsg, "Renegade Warning!", MB_ICONWARNING|MB_OK);
  149. break;
  150. }
  151. }
  152. index++;
  153. valueName = urls[index].Name;
  154. }
  155. RegCloseKey(key);
  156. return (valueName == NULL);
  157. }
  158. RegCloseKey(key);
  159. return true;
  160. }
  161. #endif // _DEBUG
  162. /******************************************************************************
  163. *
  164. * NAME
  165. * WebBrowser::IsWebPageDisplayed
  166. *
  167. * DESCRIPTION
  168. * Test if a web page is currently being displayed.
  169. *
  170. * INPUTS
  171. * NONE
  172. *
  173. * RESULT
  174. * True if page is displayed; otherwise false.
  175. *
  176. ******************************************************************************/
  177. bool WebBrowser::IsWebPageDisplayed(void)
  178. {
  179. return (_mInstance && _mInstance->UsingEmbeddedBrowser() && _mInstance->IsVisible());
  180. }
  181. /******************************************************************************
  182. *
  183. * NAME
  184. * WebBrowser::CreateInstance
  185. *
  186. * DESCRIPTION
  187. * Create an instance of the embedded browser manager.
  188. *
  189. * INPUTS
  190. * NONE
  191. *
  192. * RESULT
  193. * Browser - Pointer to instance of browser.
  194. *
  195. ******************************************************************************/
  196. WebBrowser* WebBrowser::CreateInstance(HWND window)
  197. {
  198. if (_mInstance)
  199. {
  200. return NULL;
  201. }
  202. WebBrowser* object = new WebBrowser;
  203. if (object)
  204. {
  205. bool success = object->FinalizeCreate(window);
  206. if (!success)
  207. {
  208. WWDEBUG_SAY(("WebBrowser: Failed to initialize!\n"));
  209. object->Release();
  210. object = NULL;
  211. }
  212. }
  213. return object;
  214. }
  215. /******************************************************************************
  216. *
  217. * NAME
  218. * WebBrowser::WebBrowser
  219. *
  220. * DESCRIPTION
  221. * Default constructor
  222. *
  223. * INPUTS
  224. * NONE
  225. *
  226. * RESULT
  227. * NONE
  228. *
  229. ******************************************************************************/
  230. WebBrowser::WebBrowser() :
  231. mRefCount(1),
  232. mVisible(false),
  233. mSwitchedMode(false)
  234. {
  235. WWDEBUG_SAY(("WebBrowser: Instantiating\n"));
  236. memset(&mProcessInfo, 0, sizeof(mProcessInfo));
  237. _mInstance = this;
  238. }
  239. /******************************************************************************
  240. *
  241. * NAME
  242. * WebBrowser::~WebBrowser
  243. *
  244. * DESCRIPTION
  245. * Destructor
  246. *
  247. * INPUTS
  248. * NONE
  249. *
  250. * RESULT
  251. * NONE
  252. *
  253. ******************************************************************************/
  254. WebBrowser::~WebBrowser()
  255. {
  256. WWDEBUG_SAY(("WebBrowser: Destructing\n"));
  257. _mInstance = NULL;
  258. if (mWOLBrowser)
  259. {
  260. WWDEBUG_SAY(("WebBrowser: Releasing WOLBrowser\n"));
  261. mWOLBrowser->RemoveObserver(static_cast<IWOLBrowserEvent*>(this));
  262. mWOLBrowser->Shutdown();
  263. }
  264. if (mSwitchedMode)
  265. {
  266. WW3D::Set_Device_Resolution(mRestoreWidth, mRestoreHeight, mRestoreBits, -1, true);
  267. }
  268. }
  269. /******************************************************************************
  270. *
  271. * NAME
  272. * WebBrowser::FinalizeCreate
  273. *
  274. * DESCRIPTION
  275. * Perform post creation initialization.
  276. *
  277. * INPUTS
  278. * NONE
  279. *
  280. * RESULT
  281. * Success - True if finalization was successful; otherwise false.
  282. *
  283. ******************************************************************************/
  284. bool WebBrowser::FinalizeCreate(HWND window)
  285. {
  286. if (window)
  287. {
  288. RECT windowRect;
  289. GetClientRect(window, &windowRect);
  290. LONG windowWidth = (windowRect.right - windowRect.left);
  291. LONG windowHeight = (windowRect.bottom - windowRect.top);
  292. // If the display is smaller than 800 x 600 use the external browser.
  293. // Therefore we do NOT need to create the embedded browser component.
  294. if ((windowWidth >= 800) && (windowHeight >= 600))
  295. {
  296. // Create the embedded browser component.
  297. WWDEBUG_SAY(("WebBrowser: Creating WOLBrowser component\n"));
  298. HRESULT hr = CoCreateInstance(CLSID_WOLBrowser, NULL, CLSCTX_INPROC_SERVER,
  299. IID_IWOLBrowser, (void**)&mWOLBrowser);
  300. if (FAILED(hr))
  301. {
  302. WWDEBUG_SAY(("WebBrowser: Failed to create WOLBrowser component\n"));
  303. return false;
  304. }
  305. // If the display resolution is greater than 800 x 600 then set the
  306. // display mode to 800 x 600 if we are not in windowed mode.
  307. if ((windowWidth > 800) && (windowHeight > 600))
  308. {
  309. bool windowed = false;
  310. WW3D::Get_Device_Resolution(mRestoreWidth, mRestoreHeight, mRestoreBits, windowed);
  311. if (!windowed)
  312. {
  313. mSwitchedMode = true;
  314. WW3D::Set_Device_Resolution(800, 600, -1, -1, true);
  315. }
  316. }
  317. // Center webpage within window
  318. GetClientRect(window, &windowRect);
  319. windowWidth = (windowRect.right - windowRect.left);
  320. windowHeight = (windowRect.bottom - windowRect.top);
  321. RECT webRect;
  322. webRect.left = windowRect.left + ((windowWidth - 800) / 2);
  323. webRect.right = (webRect.left + 800);
  324. webRect.top = windowRect.top + ((windowHeight - 600) / 2);
  325. webRect.bottom = (webRect.top + 600);
  326. WWDEBUG_SAY(("WebBrowser: Starting up WOLBrowser\n"));
  327. mWOLBrowser->AddObserver(static_cast<IWOLBrowserEvent*>(this));
  328. // Initialize browser to cover dialog browser area
  329. mWOLBrowser->Startup(window, &webRect);
  330. mWOLBrowser->AllowPageCertification(TRUE);
  331. mWOLBrowser->SetUIFlags(UIFLAG_SCROLLBARS);
  332. }
  333. }
  334. return true;
  335. }
  336. /******************************************************************************
  337. *
  338. * NAME
  339. * WebBrowser::ShowWebPage
  340. *
  341. * DESCRIPTION
  342. * Display the specified web page.
  343. *
  344. * INPUTS
  345. * Page - Web page to display.
  346. *
  347. * RESULT
  348. * NONE
  349. *
  350. ******************************************************************************/
  351. bool WebBrowser::ShowWebPage(char* page)
  352. {
  353. // Retrieve URL from page identifier
  354. char url[512];
  355. if (RetrievePageURL(page, url, sizeof(url)))
  356. {
  357. WWDEBUG_SAY(("WebBrowser: Showing webpage '%s' - %s\n", page, url));
  358. if (mWOLBrowser)
  359. {
  360. // Convert string to Unicode
  361. mbstowcs(mPendingURL, url, 512);
  362. char path[MAX_PATH];
  363. if (RetrieveHTMLPath(path, MAX_PATH))
  364. {
  365. wchar_t framePage[MAX_PATH];
  366. mbstowcs(framePage, path, MAX_PATH);
  367. wcscat(framePage, L"frame.htm");
  368. HRESULT hr = mWOLBrowser->Navigate(framePage, 0 , NULL);
  369. if (SUCCEEDED(hr))
  370. {
  371. Show();
  372. return true;
  373. }
  374. }
  375. }
  376. else
  377. {
  378. return LaunchExternal(url);
  379. }
  380. }
  381. return false;
  382. }
  383. /******************************************************************************
  384. *
  385. * NAME
  386. * WebBrowser::Show
  387. *
  388. * DESCRIPTION
  389. * Show the web browser
  390. *
  391. * INPUTS
  392. * NONE
  393. *
  394. * RESULT
  395. * NONE
  396. *
  397. ******************************************************************************/
  398. void WebBrowser::Show(void)
  399. {
  400. if (mWOLBrowser)
  401. {
  402. mWOLBrowser->Show();
  403. mVisible = true;
  404. }
  405. }
  406. /******************************************************************************
  407. *
  408. * NAME
  409. * WebBrowser::Hide
  410. *
  411. * DESCRIPTION
  412. * Hide the web browser
  413. *
  414. * INPUTS
  415. * NONE
  416. *
  417. * RESULT
  418. * NONE
  419. *
  420. ******************************************************************************/
  421. void WebBrowser::Hide(void)
  422. {
  423. if (mWOLBrowser)
  424. {
  425. mWOLBrowser->Hide();
  426. mVisible = false;
  427. }
  428. }
  429. /******************************************************************************
  430. *
  431. * NAME
  432. * WebBrowser::RetrievePageURL
  433. *
  434. * DESCRIPTION
  435. * Retrieve the URL for the specified page type.
  436. *
  437. * INPUTS
  438. * Page - Page name identifier
  439. * URL - Buffer to receive URL.
  440. * Size - Maximum size of buffer.
  441. *
  442. * RESULT
  443. * Success - True if sucessful.
  444. *
  445. ******************************************************************************/
  446. bool WebBrowser::RetrievePageURL(const char* page, char* url, int size)
  447. {
  448. HKEY key;
  449. LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, APPLICATION_SUB_KEY_NAME_URL, 0, KEY_READ, &key);
  450. if (result == ERROR_SUCCESS)
  451. {
  452. char valueName[64];
  453. strcpy(valueName, page);
  454. if (mWOLBrowser == NULL)
  455. {
  456. strcat(valueName, "X");
  457. }
  458. DWORD type;
  459. DWORD sizeOfBuffer = size;
  460. result = RegQueryValueEx(key, valueName, NULL, &type, (unsigned char*)url,
  461. &sizeOfBuffer);
  462. RegCloseKey(key);
  463. }
  464. WWASSERT(result == ERROR_SUCCESS && "RegtievePageURL() failed");
  465. return (result == ERROR_SUCCESS);
  466. }
  467. /******************************************************************************
  468. *
  469. * NAME
  470. * WebBrowser::RetrieveHTMLPath
  471. *
  472. * DESCRIPTION
  473. * Retrieve the path string to the local HTML data.
  474. *
  475. * INPUTS
  476. * Path - Pointer to buffer to receive path.
  477. * Size - Size of buffer in characters.
  478. *
  479. * RESULT
  480. * Success - True if successful.
  481. *
  482. ******************************************************************************/
  483. bool WebBrowser::RetrieveHTMLPath(char* path, int size)
  484. {
  485. // Retrieve the full pathname for the current process.
  486. DWORD length = GetCurrentDirectory(size, path);
  487. if (length == 0)
  488. {
  489. Print_Win32Error(GetLastError());
  490. return false;
  491. }
  492. int dirSize = (length + strlen("\\HTML\\"));
  493. if (dirSize > size)
  494. {
  495. return false;
  496. }
  497. strcat(path, "\\HTML\\");
  498. return true;
  499. }
  500. /******************************************************************************
  501. *
  502. * NAME
  503. * IUnknown::QueryInterface
  504. *
  505. * DESCRIPTION
  506. *
  507. * INPUTS
  508. * IID - Interface ID
  509. *
  510. * RESULT
  511. *
  512. ******************************************************************************/
  513. STDMETHODIMP WebBrowser::QueryInterface(REFIID iid, void** ppv)
  514. {
  515. *ppv = NULL;
  516. if ((iid == IID_IUnknown) || (iid == IID_IWOLBrowserEvent))
  517. {
  518. *ppv = static_cast<IWOLBrowserEvent*>(this);
  519. }
  520. else
  521. {
  522. return E_NOINTERFACE;
  523. }
  524. static_cast<IUnknown*>(*ppv)->AddRef();
  525. return S_OK;
  526. }
  527. /******************************************************************************
  528. *
  529. * NAME
  530. * IUnknown::AddRef
  531. *
  532. * DESCRIPTION
  533. *
  534. * INPUTS
  535. * NONE
  536. *
  537. * RESULT
  538. *
  539. ******************************************************************************/
  540. ULONG STDMETHODCALLTYPE WebBrowser::AddRef(void)
  541. {
  542. return ++mRefCount;
  543. }
  544. /******************************************************************************
  545. *
  546. * NAME
  547. * IUnknown::Release
  548. *
  549. * DESCRIPTION
  550. *
  551. * INPUTS
  552. * NONE
  553. *
  554. * RESULT
  555. *
  556. ******************************************************************************/
  557. ULONG STDMETHODCALLTYPE WebBrowser::Release(void)
  558. {
  559. WWASSERT(mRefCount > 0 && "WebBrowser: Negative reference count");
  560. --mRefCount;
  561. if (mRefCount == 0)
  562. {
  563. delete this;
  564. return 0;
  565. }
  566. return mRefCount;
  567. }
  568. /******************************************************************************
  569. *
  570. * NAME
  571. * IWOLBrowserEvent::OnScriptQuit
  572. *
  573. * DESCRIPTION
  574. * Handle quit notification from BrowserHost.
  575. *
  576. * INPUTS
  577. * Cancel - Cancel flag
  578. *
  579. * RESULT
  580. * NONE
  581. *
  582. ******************************************************************************/
  583. STDMETHODIMP WebBrowser::OnScriptQuit(void)
  584. {
  585. AddRef();
  586. WebEvent event(WebEvent::Quit, static_cast<WebBrowser*>(this));
  587. NotifyObservers(event);
  588. Release();
  589. return S_OK;
  590. }
  591. /******************************************************************************
  592. *
  593. * NAME
  594. * IWOLBrowserEvent::OnBeforeNavigate
  595. *
  596. * DESCRIPTION
  597. * Invoked before navigating to a url.
  598. *
  599. * INPUTS
  600. * URL - URL navigating to.
  601. * TargetFrame - Name of frame that navigation is happening in.
  602. * Cancel - On return; Cancel flag
  603. *
  604. * RESULT
  605. * NONE
  606. *
  607. ******************************************************************************/
  608. STDMETHODIMP WebBrowser::OnBeforeNavigate(const wchar_t* /* url */,
  609. const wchar_t* /* targetFrame */)
  610. {
  611. return S_OK;
  612. }
  613. /******************************************************************************
  614. *
  615. * NAME
  616. * IWOLBrowserEvent::OnDocumentComplete
  617. *
  618. * DESCRIPTION
  619. * Invoked when the web page is loaded, once for each frame.
  620. *
  621. * INPUTS
  622. * URL - URL navigated to.
  623. * TopFrame - Flag indicating if this is the top most frame.
  624. *
  625. * RESULT
  626. * NONE
  627. *
  628. ******************************************************************************/
  629. STDMETHODIMP WebBrowser::OnDocumentComplete(const wchar_t* url, BOOL isTopFrame)
  630. {
  631. WWDEBUG_SAY(("WebBrowser: OnDocumentComplete: %S\n", url));
  632. if (isTopFrame)
  633. {
  634. WWDEBUG_SAY(("WebBrowser: pending url: %S\n", mPendingURL));
  635. mWOLBrowser->Navigate(mPendingURL, 0 , L"Main");
  636. }
  637. return S_OK;
  638. }
  639. /******************************************************************************
  640. *
  641. * NAME
  642. * IWOLBrowserEvent::OnDownloadBegin
  643. *
  644. * DESCRIPTION
  645. * Invoked at the beginning of a download (Image, Sound, etc...)
  646. *
  647. * INPUTS
  648. * NONE
  649. *
  650. * RESULT
  651. * NONE
  652. *
  653. ******************************************************************************/
  654. STDMETHODIMP WebBrowser::OnDownloadBegin(void)
  655. {
  656. return S_OK;
  657. }
  658. /******************************************************************************
  659. *
  660. * NAME
  661. * IWOLBrowserEvent::OnProgressChange
  662. *
  663. * DESCRIPTION
  664. * Invoked as download progress changes.
  665. *
  666. * INPUTS
  667. * Progress - Current progress.
  668. * MaxProgress - Maximum progress.
  669. *
  670. * RESULT
  671. * NONE
  672. *
  673. ******************************************************************************/
  674. STDMETHODIMP WebBrowser::OnProgressChange(long /* progress */, long /* progressMax */)
  675. {
  676. return S_OK;
  677. }
  678. /******************************************************************************
  679. *
  680. * NAME
  681. * IWOLBrowserEvent::OnDownloadComplete
  682. *
  683. * DESCRIPTION
  684. * Invoked when download is completed.
  685. *
  686. * INPUTS
  687. * NONE
  688. *
  689. * RESULT
  690. * NONE
  691. *
  692. ******************************************************************************/
  693. STDMETHODIMP WebBrowser::OnDownloadComplete(void)
  694. {
  695. return S_OK;
  696. }
  697. /******************************************************************************
  698. *
  699. * NAME
  700. * IWOLBrowserEvent::OnNavigateComplete
  701. *
  702. * DESCRIPTION
  703. * Invoked when navigation is complete.
  704. *
  705. * INPUTS
  706. * URL
  707. *
  708. * RESULT
  709. * NONE
  710. *
  711. ******************************************************************************/
  712. STDMETHODIMP WebBrowser::OnNavigateComplete(const wchar_t* /* url */)
  713. {
  714. return S_OK;
  715. }
  716. /******************************************************************************
  717. *
  718. * NAME
  719. * IWOLBrowserEvent::OnStatusTextChange
  720. *
  721. * DESCRIPTION
  722. * Invoked when the status text changes.
  723. *
  724. * INPUTS
  725. * Status - Status text string.
  726. *
  727. * RESULT
  728. * NONE
  729. *
  730. ******************************************************************************/
  731. STDMETHODIMP WebBrowser::OnStatusTextChange(const wchar_t* /* statusText */)
  732. {
  733. return S_OK;
  734. }
  735. /******************************************************************************
  736. *
  737. * NAME
  738. * IWOLBrowserEvent::OnTitleChange
  739. *
  740. * DESCRIPTION
  741. * Invoked when the document title changes.
  742. *
  743. * INPUTS
  744. * Title - Title string.
  745. *
  746. * RESULT
  747. * NONE
  748. *
  749. ******************************************************************************/
  750. STDMETHODIMP WebBrowser::OnTitleChange(const wchar_t* /* title */)
  751. {
  752. return S_OK;
  753. }
  754. /******************************************************************************
  755. *
  756. * NAME
  757. * IWOLBrowserEvent::OnNewWindow
  758. *
  759. * DESCRIPTION
  760. * Invoked when requesting to open a new window for web content.
  761. *
  762. * INPUTS
  763. * Allow - On return; Flag to allow or disallow opening of new window.
  764. *
  765. * RESULT
  766. * NONE
  767. *
  768. ******************************************************************************/
  769. STDMETHODIMP WebBrowser::OnNewWindow(void)
  770. {
  771. return E_FAIL;
  772. }
  773. /******************************************************************************
  774. *
  775. * NAME
  776. * IWOLBrowserEvent::OnShowMessage
  777. *
  778. * DESCRIPTION
  779. *
  780. * INPUTS
  781. *
  782. * RESULT
  783. *
  784. ******************************************************************************/
  785. STDMETHODIMP WebBrowser::OnShowMessage(const wchar_t* /* text */, const wchar_t* /* caption */,
  786. unsigned long /* type */, long* /* result */)
  787. {
  788. return S_OK;
  789. }
  790. /******************************************************************************
  791. *
  792. * NAME
  793. * IWOLBrowserEvent::OnFailedPageCertification
  794. *
  795. * DESCRIPTION
  796. * Invoked when the web page fails certification.
  797. *
  798. * INPUTS
  799. * NONE
  800. *
  801. * RESULT
  802. * NONE
  803. *
  804. ******************************************************************************/
  805. STDMETHODIMP WebBrowser::OnFailedPageCertification(void)
  806. {
  807. WWDEBUG_SAY(("WebBrowser: !!!!! PAGE FAILED CERTIFICATION !!!!!\n"));
  808. AddRef();
  809. WebEvent event(WebEvent::CertificationFailed, static_cast<WebBrowser*>(this));
  810. NotifyObservers(event);
  811. Release();
  812. return S_OK;
  813. }
  814. /******************************************************************************
  815. *
  816. * NAME
  817. * IWOLBrowserEvent::OnErrorMsg
  818. *
  819. * DESCRIPTION
  820. * Error message has changed.
  821. *
  822. * INPUTS
  823. * Error - Error message string.
  824. *
  825. * RESULT
  826. * NONE
  827. *
  828. ******************************************************************************/
  829. STDMETHODIMP WebBrowser::OnErrorMsg(const wchar_t* /* error */)
  830. {
  831. return S_OK;
  832. }
  833. /******************************************************************************
  834. *
  835. * NAME
  836. * IWOLBrowserEvent::OnRegisterLogin
  837. *
  838. * DESCRIPTION
  839. * Westwood online signup account registration request.
  840. * This message is invoked via script in the account signup page.
  841. *
  842. * INPUTS
  843. * Nick - User nickname.
  844. * Password - User password.
  845. *
  846. * RESULT
  847. * NONE
  848. *
  849. ******************************************************************************/
  850. STDMETHODIMP WebBrowser::OnRegisterLogin(const wchar_t* nick , const wchar_t* pass )
  851. {
  852. WWDEBUG_SAY(("WebBrowser: Register WWOnline login: '%S' - '%S'\n", nick, pass));
  853. RefPtr<WWOnline::LoginInfo> login = WWOnline::LoginInfo::Create(nick, pass, false);
  854. if (login.IsValid())
  855. {
  856. login->Remember(true);
  857. }
  858. else
  859. {
  860. WWASSERT((!"WebBrowser: Failed to create new login."));
  861. }
  862. return S_OK;
  863. }
  864. /******************************************************************************
  865. *
  866. * NAME
  867. * WebBrowser::LaunchExternal
  868. *
  869. * DESCRIPTION
  870. * Launch the external browser.
  871. *
  872. * INPUTS
  873. * URL - URL to navigate to.
  874. *
  875. * RESULT
  876. * Success - True if successful
  877. *
  878. ******************************************************************************/
  879. bool WebBrowser::LaunchExternal(const char* url)
  880. {
  881. WWDEBUG_SAY(("WebBrowser: Launching external browser\n"));
  882. // Just return if no URL specified
  883. if (!url || (strlen(url) == 0))
  884. {
  885. return false;
  886. }
  887. // Create a temporary file with HTML content
  888. char tempPath[MAX_PATH];
  889. GetWindowsDirectory(tempPath, MAX_PATH);
  890. char filename[MAX_PATH];
  891. GetTempFileName(tempPath, "WWS", 0, filename);
  892. char* extPtr = strrchr(filename, '.');
  893. strcpy(extPtr, ".htm");
  894. HANDLE file = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
  895. FILE_ATTRIBUTE_NORMAL, NULL);
  896. WWASSERT(INVALID_HANDLE_VALUE != file && "Failed to create temporary HTML file.");
  897. if (INVALID_HANDLE_VALUE == file)
  898. {
  899. return false;
  900. }
  901. // Write generic contents
  902. const char* contents = "<title>ViewHTML</title>";
  903. DWORD written;
  904. WriteFile(file, contents, strlen(contents), &written, NULL);
  905. CloseHandle(file);
  906. // Find the executable that can launch this file
  907. char exeName[MAX_PATH];
  908. HINSTANCE hInst = FindExecutable(filename, NULL, exeName);
  909. WWASSERT(((int)hInst > 32) && "Unable to find executable that will display HTML files.");
  910. // Delete temporary file
  911. DeleteFile(filename);
  912. if ((int)hInst <= 32)
  913. {
  914. return false;
  915. }
  916. // Launch browser with specified URL
  917. char commandLine[MAX_PATH];
  918. sprintf(commandLine, "[open] %s", url);
  919. STARTUPINFO startupInfo;
  920. memset(&startupInfo, 0, sizeof(startupInfo));
  921. startupInfo.cb = sizeof(startupInfo);
  922. memset(&mProcessInfo, 0, sizeof(mProcessInfo));
  923. BOOL createSuccess = CreateProcess(exeName, commandLine, NULL, NULL, FALSE,
  924. 0, NULL, NULL, &startupInfo, &mProcessInfo);
  925. WWASSERT(createSuccess && "Failed to launch external WebBrowser.");
  926. if (createSuccess)
  927. {
  928. WaitForInputIdle(mProcessInfo.hProcess, 5000);
  929. }
  930. return (TRUE == createSuccess);
  931. }
  932. /******************************************************************************
  933. *
  934. * NAME
  935. * WebBrowser::IsExternalBrowserRunning
  936. *
  937. * DESCRIPTION
  938. * Test if the external browser is running;
  939. *
  940. * INPUTS
  941. * NONE
  942. *
  943. * RESULT
  944. * Running - True if the external browser is running.
  945. *
  946. ******************************************************************************/
  947. bool WebBrowser::IsExternalBrowserRunning(void) const
  948. {
  949. DWORD wait = WaitForInputIdle(mProcessInfo.hProcess, 50);
  950. if (WAIT_TIMEOUT == wait)
  951. {
  952. return true;
  953. }
  954. DWORD active = 0;
  955. BOOL success = GetExitCodeProcess(mProcessInfo.hProcess, &active);
  956. WWASSERT_PRINT(success, "GetExitCodeProcess() Failed");
  957. if (success == FALSE)
  958. {
  959. Print_Win32Error(GetLastError());
  960. }
  961. return (STILL_ACTIVE == active);
  962. }