| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /******************************************************************************
- *
- * NAME
- * $Archive: /Commando/Code/Commando/WebBrowser.cpp $
- *
- * DESCRIPTION
- *
- * PROGRAMMER
- * Denzil E. Long, Jr.
- * $Author: Denzil_l $
- *
- * VERSION INFO
- * $Revision: 24 $
- * $Modtime: 1/18/02 10:31p $
- *
- ******************************************************************************/
- #include "always.h"
- #include "WebBrowser.h"
- #include <WWLib\WWCOMUtil.h>
- #include <WW3D2\WW3D.h>
- #include <WWOnline\WOLLoginInfo.h>
- #include <WWDebug\WWDebug.h>
- #include "win.h"
- #include "_globals.h"
- WebBrowser* WebBrowser::_mInstance = NULL;
- /******************************************************************************
- *
- * NAME
- * WebBrowser::InstallPrerequisites
- *
- * DESCRIPTION
- *
- * INPUTS
- * NONE
- *
- * RESULT
- * True if successful.
- *
- ******************************************************************************/
- #ifdef _DEBUG
- bool WebBrowser::InstallPrerequisites(void)
- {
- // Check if the WOLBrowser component is installed by attempting to obtain
- // the WOLBrowser class object. If we can get the class object then the
- // component is already registered.
- CComPtr<IClassFactory> factory;
- HRESULT hr = CoGetClassObject(CLSID_WOLBrowser, CLSCTX_INPROC_SERVER, NULL,
- IID_IClassFactory, (void**)&factory);
- // If the component isn't registered then check for it in the run directory
- // and register it if found.
- if (FAILED(hr))
- {
- WWDEBUG_SAY(("WOLBrowser component not installed, attempting to locate in run directory\n"));
- // Attempt to find the WOLBrowser server in the run directory.
- char dllPath[512];
- DWORD length = GetCurrentDirectory(sizeof(dllPath), dllPath);
- if (length == 0)
- {
- WWDEBUG_SAY(("GetCurrentDirectory() failed!\n"));
- Print_Win32Error(GetLastError());
- return false;
- }
- WWDEBUG_SAY(("Registering WOLBrowser component\n"));
- strcat(dllPath, "\\WolBrowser.dll");
- bool success = RegisterCOMServer(dllPath);
- if (!success)
- {
- WWDEBUG_SAY(("Failed to register WOLBrowser.dll!\n"));
- ::MessageBox(NULL, "WOLBrowser.dll not registered!\n\nDefaulting to external browser.",
- "Renegade Warning!", MB_ICONWARNING|MB_OK);
- return false;
- }
- }
- // Attempt to open the URL key
- HKEY key;
- LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, APPLICATION_SUB_KEY_NAME_URL, 0, KEY_ALL_ACCESS, &key);
- if (ERROR_SUCCESS != result)
- {
- WWDEBUG_SAY(("URL entry not in the registry\n"));
- ::MessageBox(NULL, "Embedded Browser prerequisite error!\n\nURL key not found.",
- "Renegade Warning!", MB_ICONWARNING|MB_OK);
- // Attempt to create the key.
- LONG result = RegCreateKeyEx(HKEY_LOCAL_MACHINE, APPLICATION_SUB_KEY_NAME_URL, 0, NULL,
- REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL);
- if (ERROR_SUCCESS != result)
- {
- WWDEBUG_SAY(("Failed to create URL entry in registry\n"));
- ::MessageBox(NULL, "Failed to create Embedded Browser URLS\n\nURL key not found.",
- "Renegade Warning!", MB_ICONWARNING|MB_OK);
- return false;
- }
- // Check for registry entries.
- struct URLEntry
- {
- const char* Name;
- const char* Data;
- };
- static URLEntry urls[] =
- {
- {"BattleClans", "http://renchat2.westwood.com/cgi-bin/cgiclient?ren_clan_manager&request=expand_template&Template=index.html&SKU=3072&LANGCODE=0&embedded=1"},
- {"BattleClansX", "http://renchat2.westwood.com/cgi-bin/cgiclient?ren_clan_manager&request=expand_template&Template=index.html&SKU=3072&LANGCODE=0"},
- {"Ladder", "http://renchat2.westwood.com/renegade_embedded/index.html"},
- {"LadderX", "http://renchat2.westwood.com/renegade/index.html"},
- {"NetStatus", "http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_netstatus&LANGCODE=0&SKU=3072&embedded=1"},
- {"NetStatusX", "http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_netstatus&LANGCODE=0&SKU=3072"},
- {"News", "http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_news&LANGCODE=0&SKU=3072&embedded=1"},
- {"NewsX", "http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_news&LANGCODE=0&SKU=3072"},
- {"Signup", "http://games2.westwood.com/cgi-bin/cgiclient?ren_reg2&request=expand_template&Template=newreg_menu.html&LANGCODE=0&embedded=1&SKU=3072"},
- {"SignupX", "http://games2.westwood.com/cgi-bin/cgiclient?ren_reg2&request=expand_template&Template=newreg_menu.html&LANGCODE=0"},
- {NULL, NULL}
- };
- const char* valueName = urls[0].Name;
- int index = 0;
- while (valueName)
- {
- DWORD type;
- char data[512];
- DWORD size = sizeof(data);
- result = RegQueryValueEx(key, valueName, NULL, &type, (LPBYTE)&data, &size);
- // If the URL value is not found then add it.
- const char* valueData = urls[index].Data;
- if (ERROR_SUCCESS != result || (strcmp(valueData, data) != 0))
- {
- result = RegSetValueEx(key, valueName, NULL, REG_SZ, (CONST BYTE*)valueData,
- (strlen(valueData) + 1));
- if (ERROR_SUCCESS != result)
- {
- WWDEBUG_SAY(("Failed to create URL entry '%s' in registry\n", valueName));
- char errorMsg[256];
- sprintf(errorMsg, "Embedded Browser prerequisite error!\n\nURL key '%s'", valueName);
- ::MessageBox(NULL, errorMsg, "Renegade Warning!", MB_ICONWARNING|MB_OK);
- break;
- }
- }
- index++;
- valueName = urls[index].Name;
- }
- RegCloseKey(key);
- return (valueName == NULL);
- }
- RegCloseKey(key);
- return true;
- }
- #endif // _DEBUG
- /******************************************************************************
- *
- * NAME
- * WebBrowser::IsWebPageDisplayed
- *
- * DESCRIPTION
- * Test if a web page is currently being displayed.
- *
- * INPUTS
- * NONE
- *
- * RESULT
- * True if page is displayed; otherwise false.
- *
- ******************************************************************************/
- bool WebBrowser::IsWebPageDisplayed(void)
- {
- return (_mInstance && _mInstance->UsingEmbeddedBrowser() && _mInstance->IsVisible());
- }
- /******************************************************************************
- *
- * NAME
- * WebBrowser::CreateInstance
- *
- * DESCRIPTION
- * Create an instance of the embedded browser manager.
- *
- * INPUTS
- * NONE
- *
- * RESULT
- * Browser - Pointer to instance of browser.
- *
- ******************************************************************************/
- WebBrowser* WebBrowser::CreateInstance(HWND window)
- {
- if (_mInstance)
- {
- return NULL;
- }
- WebBrowser* object = new WebBrowser;
- if (object)
- {
- bool success = object->FinalizeCreate(window);
- if (!success)
- {
- WWDEBUG_SAY(("WebBrowser: Failed to initialize!\n"));
- object->Release();
- object = NULL;
- }
- }
- return object;
- }
- /******************************************************************************
- *
- * NAME
- * WebBrowser::WebBrowser
- *
- * DESCRIPTION
- * Default constructor
- *
- * INPUTS
- * NONE
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- WebBrowser::WebBrowser() :
- mRefCount(1),
- mVisible(false),
- mSwitchedMode(false)
- {
- WWDEBUG_SAY(("WebBrowser: Instantiating\n"));
- memset(&mProcessInfo, 0, sizeof(mProcessInfo));
- _mInstance = this;
- }
- /******************************************************************************
- *
- * NAME
- * WebBrowser::~WebBrowser
- *
- * DESCRIPTION
- * Destructor
- *
- * INPUTS
- * NONE
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- WebBrowser::~WebBrowser()
- {
- WWDEBUG_SAY(("WebBrowser: Destructing\n"));
- _mInstance = NULL;
- if (mWOLBrowser)
- {
- WWDEBUG_SAY(("WebBrowser: Releasing WOLBrowser\n"));
- mWOLBrowser->RemoveObserver(static_cast<IWOLBrowserEvent*>(this));
- mWOLBrowser->Shutdown();
- }
- if (mSwitchedMode)
- {
- WW3D::Set_Device_Resolution(mRestoreWidth, mRestoreHeight, mRestoreBits, -1, true);
- }
- }
- /******************************************************************************
- *
- * NAME
- * WebBrowser::FinalizeCreate
- *
- * DESCRIPTION
- * Perform post creation initialization.
- *
- * INPUTS
- * NONE
- *
- * RESULT
- * Success - True if finalization was successful; otherwise false.
- *
- ******************************************************************************/
- bool WebBrowser::FinalizeCreate(HWND window)
- {
- if (window)
- {
- RECT windowRect;
- GetClientRect(window, &windowRect);
- LONG windowWidth = (windowRect.right - windowRect.left);
- LONG windowHeight = (windowRect.bottom - windowRect.top);
- // If the display is smaller than 800 x 600 use the external browser.
- // Therefore we do NOT need to create the embedded browser component.
- if ((windowWidth >= 800) && (windowHeight >= 600))
- {
- // Create the embedded browser component.
- WWDEBUG_SAY(("WebBrowser: Creating WOLBrowser component\n"));
- HRESULT hr = CoCreateInstance(CLSID_WOLBrowser, NULL, CLSCTX_INPROC_SERVER,
- IID_IWOLBrowser, (void**)&mWOLBrowser);
- if (FAILED(hr))
- {
- WWDEBUG_SAY(("WebBrowser: Failed to create WOLBrowser component\n"));
- return false;
- }
- // If the display resolution is greater than 800 x 600 then set the
- // display mode to 800 x 600 if we are not in windowed mode.
- if ((windowWidth > 800) && (windowHeight > 600))
- {
- bool windowed = false;
- WW3D::Get_Device_Resolution(mRestoreWidth, mRestoreHeight, mRestoreBits, windowed);
- if (!windowed)
- {
- mSwitchedMode = true;
- WW3D::Set_Device_Resolution(800, 600, -1, -1, true);
- }
- }
- // Center webpage within window
- GetClientRect(window, &windowRect);
- windowWidth = (windowRect.right - windowRect.left);
- windowHeight = (windowRect.bottom - windowRect.top);
- RECT webRect;
- webRect.left = windowRect.left + ((windowWidth - 800) / 2);
- webRect.right = (webRect.left + 800);
- webRect.top = windowRect.top + ((windowHeight - 600) / 2);
- webRect.bottom = (webRect.top + 600);
- WWDEBUG_SAY(("WebBrowser: Starting up WOLBrowser\n"));
- mWOLBrowser->AddObserver(static_cast<IWOLBrowserEvent*>(this));
- // Initialize browser to cover dialog browser area
- mWOLBrowser->Startup(window, &webRect);
- mWOLBrowser->AllowPageCertification(TRUE);
- mWOLBrowser->SetUIFlags(UIFLAG_SCROLLBARS);
- }
- }
- return true;
- }
- /******************************************************************************
- *
- * NAME
- * WebBrowser::ShowWebPage
- *
- * DESCRIPTION
- * Display the specified web page.
- *
- * INPUTS
- * Page - Web page to display.
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- bool WebBrowser::ShowWebPage(char* page)
- {
- // Retrieve URL from page identifier
- char url[512];
- if (RetrievePageURL(page, url, sizeof(url)))
- {
- WWDEBUG_SAY(("WebBrowser: Showing webpage '%s' - %s\n", page, url));
- if (mWOLBrowser)
- {
- // Convert string to Unicode
- mbstowcs(mPendingURL, url, 512);
- char path[MAX_PATH];
- if (RetrieveHTMLPath(path, MAX_PATH))
- {
- wchar_t framePage[MAX_PATH];
- mbstowcs(framePage, path, MAX_PATH);
- wcscat(framePage, L"frame.htm");
- HRESULT hr = mWOLBrowser->Navigate(framePage, 0 , NULL);
- if (SUCCEEDED(hr))
- {
- Show();
- return true;
- }
- }
- }
- else
- {
- return LaunchExternal(url);
- }
- }
- return false;
- }
- /******************************************************************************
- *
- * NAME
- * WebBrowser::Show
- *
- * DESCRIPTION
- * Show the web browser
- *
- * INPUTS
- * NONE
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- void WebBrowser::Show(void)
- {
- if (mWOLBrowser)
- {
- mWOLBrowser->Show();
- mVisible = true;
- }
- }
- /******************************************************************************
- *
- * NAME
- * WebBrowser::Hide
- *
- * DESCRIPTION
- * Hide the web browser
- *
- * INPUTS
- * NONE
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- void WebBrowser::Hide(void)
- {
- if (mWOLBrowser)
- {
- mWOLBrowser->Hide();
- mVisible = false;
- }
- }
- /******************************************************************************
- *
- * NAME
- * WebBrowser::RetrievePageURL
- *
- * DESCRIPTION
- * Retrieve the URL for the specified page type.
- *
- * INPUTS
- * Page - Page name identifier
- * URL - Buffer to receive URL.
- * Size - Maximum size of buffer.
- *
- * RESULT
- * Success - True if sucessful.
- *
- ******************************************************************************/
- bool WebBrowser::RetrievePageURL(const char* page, char* url, int size)
- {
- HKEY key;
- LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, APPLICATION_SUB_KEY_NAME_URL, 0, KEY_READ, &key);
- if (result == ERROR_SUCCESS)
- {
- char valueName[64];
- strcpy(valueName, page);
- if (mWOLBrowser == NULL)
- {
- strcat(valueName, "X");
- }
- DWORD type;
- DWORD sizeOfBuffer = size;
- result = RegQueryValueEx(key, valueName, NULL, &type, (unsigned char*)url,
- &sizeOfBuffer);
- RegCloseKey(key);
- }
- WWASSERT(result == ERROR_SUCCESS && "RegtievePageURL() failed");
- return (result == ERROR_SUCCESS);
- }
- /******************************************************************************
- *
- * NAME
- * WebBrowser::RetrieveHTMLPath
- *
- * DESCRIPTION
- * Retrieve the path string to the local HTML data.
- *
- * INPUTS
- * Path - Pointer to buffer to receive path.
- * Size - Size of buffer in characters.
- *
- * RESULT
- * Success - True if successful.
- *
- ******************************************************************************/
- bool WebBrowser::RetrieveHTMLPath(char* path, int size)
- {
- // Retrieve the full pathname for the current process.
- DWORD length = GetCurrentDirectory(size, path);
- if (length == 0)
- {
- Print_Win32Error(GetLastError());
- return false;
- }
- int dirSize = (length + strlen("\\HTML\\"));
- if (dirSize > size)
- {
- return false;
- }
- strcat(path, "\\HTML\\");
- return true;
- }
- /******************************************************************************
- *
- * NAME
- * IUnknown::QueryInterface
- *
- * DESCRIPTION
- *
- * INPUTS
- * IID - Interface ID
- *
- * RESULT
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::QueryInterface(REFIID iid, void** ppv)
- {
- *ppv = NULL;
- if ((iid == IID_IUnknown) || (iid == IID_IWOLBrowserEvent))
- {
- *ppv = static_cast<IWOLBrowserEvent*>(this);
- }
- else
- {
- return E_NOINTERFACE;
- }
- static_cast<IUnknown*>(*ppv)->AddRef();
- return S_OK;
- }
- /******************************************************************************
- *
- * NAME
- * IUnknown::AddRef
- *
- * DESCRIPTION
- *
- * INPUTS
- * NONE
- *
- * RESULT
- *
- ******************************************************************************/
- ULONG STDMETHODCALLTYPE WebBrowser::AddRef(void)
- {
- return ++mRefCount;
- }
- /******************************************************************************
- *
- * NAME
- * IUnknown::Release
- *
- * DESCRIPTION
- *
- * INPUTS
- * NONE
- *
- * RESULT
- *
- ******************************************************************************/
- ULONG STDMETHODCALLTYPE WebBrowser::Release(void)
- {
- WWASSERT(mRefCount > 0 && "WebBrowser: Negative reference count");
- --mRefCount;
- if (mRefCount == 0)
- {
- delete this;
- return 0;
- }
- return mRefCount;
- }
- /******************************************************************************
- *
- * NAME
- * IWOLBrowserEvent::OnScriptQuit
- *
- * DESCRIPTION
- * Handle quit notification from BrowserHost.
- *
- * INPUTS
- * Cancel - Cancel flag
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::OnScriptQuit(void)
- {
- AddRef();
- WebEvent event(WebEvent::Quit, static_cast<WebBrowser*>(this));
- NotifyObservers(event);
- Release();
- return S_OK;
- }
- /******************************************************************************
- *
- * NAME
- * IWOLBrowserEvent::OnBeforeNavigate
- *
- * DESCRIPTION
- * Invoked before navigating to a url.
- *
- * INPUTS
- * URL - URL navigating to.
- * TargetFrame - Name of frame that navigation is happening in.
- * Cancel - On return; Cancel flag
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::OnBeforeNavigate(const wchar_t* /* url */,
- const wchar_t* /* targetFrame */)
- {
- return S_OK;
- }
- /******************************************************************************
- *
- * NAME
- * IWOLBrowserEvent::OnDocumentComplete
- *
- * DESCRIPTION
- * Invoked when the web page is loaded, once for each frame.
- *
- * INPUTS
- * URL - URL navigated to.
- * TopFrame - Flag indicating if this is the top most frame.
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::OnDocumentComplete(const wchar_t* url, BOOL isTopFrame)
- {
- WWDEBUG_SAY(("WebBrowser: OnDocumentComplete: %S\n", url));
- if (isTopFrame)
- {
- WWDEBUG_SAY(("WebBrowser: pending url: %S\n", mPendingURL));
- mWOLBrowser->Navigate(mPendingURL, 0 , L"Main");
- }
- return S_OK;
- }
- /******************************************************************************
- *
- * NAME
- * IWOLBrowserEvent::OnDownloadBegin
- *
- * DESCRIPTION
- * Invoked at the beginning of a download (Image, Sound, etc...)
- *
- * INPUTS
- * NONE
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::OnDownloadBegin(void)
- {
- return S_OK;
- }
- /******************************************************************************
- *
- * NAME
- * IWOLBrowserEvent::OnProgressChange
- *
- * DESCRIPTION
- * Invoked as download progress changes.
- *
- * INPUTS
- * Progress - Current progress.
- * MaxProgress - Maximum progress.
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::OnProgressChange(long /* progress */, long /* progressMax */)
- {
- return S_OK;
- }
- /******************************************************************************
- *
- * NAME
- * IWOLBrowserEvent::OnDownloadComplete
- *
- * DESCRIPTION
- * Invoked when download is completed.
- *
- * INPUTS
- * NONE
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::OnDownloadComplete(void)
- {
- return S_OK;
- }
- /******************************************************************************
- *
- * NAME
- * IWOLBrowserEvent::OnNavigateComplete
- *
- * DESCRIPTION
- * Invoked when navigation is complete.
- *
- * INPUTS
- * URL
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::OnNavigateComplete(const wchar_t* /* url */)
- {
- return S_OK;
- }
- /******************************************************************************
- *
- * NAME
- * IWOLBrowserEvent::OnStatusTextChange
- *
- * DESCRIPTION
- * Invoked when the status text changes.
- *
- * INPUTS
- * Status - Status text string.
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::OnStatusTextChange(const wchar_t* /* statusText */)
- {
- return S_OK;
- }
- /******************************************************************************
- *
- * NAME
- * IWOLBrowserEvent::OnTitleChange
- *
- * DESCRIPTION
- * Invoked when the document title changes.
- *
- * INPUTS
- * Title - Title string.
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::OnTitleChange(const wchar_t* /* title */)
- {
- return S_OK;
- }
- /******************************************************************************
- *
- * NAME
- * IWOLBrowserEvent::OnNewWindow
- *
- * DESCRIPTION
- * Invoked when requesting to open a new window for web content.
- *
- * INPUTS
- * Allow - On return; Flag to allow or disallow opening of new window.
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::OnNewWindow(void)
- {
- return E_FAIL;
- }
- /******************************************************************************
- *
- * NAME
- * IWOLBrowserEvent::OnShowMessage
- *
- * DESCRIPTION
- *
- * INPUTS
- *
- * RESULT
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::OnShowMessage(const wchar_t* /* text */, const wchar_t* /* caption */,
- unsigned long /* type */, long* /* result */)
- {
- return S_OK;
- }
- /******************************************************************************
- *
- * NAME
- * IWOLBrowserEvent::OnFailedPageCertification
- *
- * DESCRIPTION
- * Invoked when the web page fails certification.
- *
- * INPUTS
- * NONE
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::OnFailedPageCertification(void)
- {
- WWDEBUG_SAY(("WebBrowser: !!!!! PAGE FAILED CERTIFICATION !!!!!\n"));
- AddRef();
- WebEvent event(WebEvent::CertificationFailed, static_cast<WebBrowser*>(this));
- NotifyObservers(event);
- Release();
- return S_OK;
- }
- /******************************************************************************
- *
- * NAME
- * IWOLBrowserEvent::OnErrorMsg
- *
- * DESCRIPTION
- * Error message has changed.
- *
- * INPUTS
- * Error - Error message string.
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::OnErrorMsg(const wchar_t* /* error */)
- {
- return S_OK;
- }
- /******************************************************************************
- *
- * NAME
- * IWOLBrowserEvent::OnRegisterLogin
- *
- * DESCRIPTION
- * Westwood online signup account registration request.
- * This message is invoked via script in the account signup page.
- *
- * INPUTS
- * Nick - User nickname.
- * Password - User password.
- *
- * RESULT
- * NONE
- *
- ******************************************************************************/
- STDMETHODIMP WebBrowser::OnRegisterLogin(const wchar_t* nick , const wchar_t* pass )
- {
- WWDEBUG_SAY(("WebBrowser: Register WWOnline login: '%S' - '%S'\n", nick, pass));
- RefPtr<WWOnline::LoginInfo> login = WWOnline::LoginInfo::Create(nick, pass, false);
- if (login.IsValid())
- {
- login->Remember(true);
- }
- else
- {
- WWASSERT((!"WebBrowser: Failed to create new login."));
- }
- return S_OK;
- }
- /******************************************************************************
- *
- * NAME
- * WebBrowser::LaunchExternal
- *
- * DESCRIPTION
- * Launch the external browser.
- *
- * INPUTS
- * URL - URL to navigate to.
- *
- * RESULT
- * Success - True if successful
- *
- ******************************************************************************/
- bool WebBrowser::LaunchExternal(const char* url)
- {
- WWDEBUG_SAY(("WebBrowser: Launching external browser\n"));
- // Just return if no URL specified
- if (!url || (strlen(url) == 0))
- {
- return false;
- }
- // Create a temporary file with HTML content
- char tempPath[MAX_PATH];
- GetWindowsDirectory(tempPath, MAX_PATH);
- char filename[MAX_PATH];
- GetTempFileName(tempPath, "WWS", 0, filename);
- char* extPtr = strrchr(filename, '.');
- strcpy(extPtr, ".htm");
- HANDLE file = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
- FILE_ATTRIBUTE_NORMAL, NULL);
- WWASSERT(INVALID_HANDLE_VALUE != file && "Failed to create temporary HTML file.");
- if (INVALID_HANDLE_VALUE == file)
- {
- return false;
- }
- // Write generic contents
- const char* contents = "<title>ViewHTML</title>";
- DWORD written;
- WriteFile(file, contents, strlen(contents), &written, NULL);
- CloseHandle(file);
- // Find the executable that can launch this file
- char exeName[MAX_PATH];
- HINSTANCE hInst = FindExecutable(filename, NULL, exeName);
- WWASSERT(((int)hInst > 32) && "Unable to find executable that will display HTML files.");
- // Delete temporary file
- DeleteFile(filename);
- if ((int)hInst <= 32)
- {
- return false;
- }
- // Launch browser with specified URL
- char commandLine[MAX_PATH];
- sprintf(commandLine, "[open] %s", url);
- STARTUPINFO startupInfo;
- memset(&startupInfo, 0, sizeof(startupInfo));
- startupInfo.cb = sizeof(startupInfo);
- memset(&mProcessInfo, 0, sizeof(mProcessInfo));
- BOOL createSuccess = CreateProcess(exeName, commandLine, NULL, NULL, FALSE,
- 0, NULL, NULL, &startupInfo, &mProcessInfo);
- WWASSERT(createSuccess && "Failed to launch external WebBrowser.");
- if (createSuccess)
- {
- WaitForInputIdle(mProcessInfo.hProcess, 5000);
- }
- return (TRUE == createSuccess);
- }
- /******************************************************************************
- *
- * NAME
- * WebBrowser::IsExternalBrowserRunning
- *
- * DESCRIPTION
- * Test if the external browser is running;
- *
- * INPUTS
- * NONE
- *
- * RESULT
- * Running - True if the external browser is running.
- *
- ******************************************************************************/
- bool WebBrowser::IsExternalBrowserRunning(void) const
- {
- DWORD wait = WaitForInputIdle(mProcessInfo.hProcess, 50);
- if (WAIT_TIMEOUT == wait)
- {
- return true;
- }
- DWORD active = 0;
- BOOL success = GetExitCodeProcess(mProcessInfo.hProcess, &active);
- WWASSERT_PRINT(success, "GetExitCodeProcess() Failed");
- if (success == FALSE)
- {
- Print_Win32Error(GetLastError());
- }
- return (STILL_ACTIVE == active);
- }
|