iup-stack/iup/srcweb/iupwin_webbrowser.cpp

1526 lines
44 KiB
C++
Raw Normal View History

2023-02-20 16:44:45 +00:00
/** \file
* \brief Web Browser Control
*
* http://msdn.microsoft.com/en-us/library/aa752040(v=vs.85).aspx
* https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa752040(v=vs.85)
* https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/hh801968(v=vs.85)
*
* See Copyright Notice in "iup.h"
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <exdisp.h>
#include "iup.h"
#include "iupcbs.h"
#include "iupole.h"
#include "iup_object.h"
#include "iup_register.h"
#include "iup_attrib.h"
#include "iup_stdcontrols.h"
#include "iup_str.h"
#include "iup_layout.h"
#include "iup_webbrowser.h"
#include "iup_drv.h"
#include "iup_drvfont.h"
#include <shlguid.h> /* IID_IWebBrowser2, DIID_DWebBrowserEvents2 */
#include <exdispid.h> /* DISPID_* */
#include <mshtml.h>
#include <mshtmcid.h>
//#include <MsHtmHst.h>
#include <atlbase.h>
#include <atlcom.h>
#include <atlctl.h>
#if _MSC_VER < 1500 // VC9: VC8 does not defines this
#define OLECMDID_OPTICAL_ZOOM (OLECMDID)63
#endif
/* Exported from "iupwin_str.c" */
extern "C" {
IUP_DRV_API WCHAR* iupwinStrChar2Wide(const char* str);
IUP_DRV_API char* iupwinStrWide2Char(const WCHAR* wstr);
}
using namespace ATL;
// Should have only one instance of a class
// derived from CAtlModule in a project.
static CComModule* iweb_module = NULL;
interface winWebBrowserSink:public IDispEventImpl<0, winWebBrowserSink, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 0>
{
public:
Ihandle* ih;
BEGIN_SINK_MAP(winWebBrowserSink)
SINK_ENTRY_EX(0, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, BeforeNavigate2)
#ifdef DISPID_NEWWINDOW3
SINK_ENTRY_EX(0, DIID_DWebBrowserEvents2, DISPID_NEWWINDOW3, NewWindow3)
#endif
SINK_ENTRY_EX(0, DIID_DWebBrowserEvents2, DISPID_NAVIGATEERROR, NavigateError)
SINK_ENTRY_EX(0, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, DocumentComplete)
SINK_ENTRY_EX(0, DIID_DWebBrowserEvents2, DISPID_COMMANDSTATECHANGE, CommandStateChange)
END_SINK_MAP()
void STDMETHODCALLTYPE BeforeNavigate2(IDispatch *pDispatch, VARIANT *url, VARIANT *Flags, VARIANT *TargetFrameName,
VARIANT *PostData, VARIANT *Headers, VARIANT_BOOL *Cancel)
{
if (iupAttribGet(ih, "_IUPWEB_IGNORE_NAVIGATE"))
return;
IFns cb = (IFns)IupGetCallback(ih, "NAVIGATE_CB");
if (cb)
{
char* urlString = iupwinStrWide2Char(url->bstrVal);
int ret = cb(ih, urlString);
free(urlString);
if (ret == IUP_IGNORE)
*Cancel = VARIANT_TRUE;
}
(void)Cancel;
(void)Headers;
(void)PostData;
(void)TargetFrameName;
(void)Flags;
(void)pDispatch;
}
#ifdef DISPID_NEWWINDOW3
void STDMETHODCALLTYPE NewWindow3(IDispatch **ppDispatch, VARIANT_BOOL *Cancel, DWORD dwFlags,
BSTR bstrUrlContext, BSTR bstrUrl)
{
IFns cb = (IFns)IupGetCallback(ih, "NEWWINDOW_CB");
if (cb)
{
char* urlString = iupwinStrWide2Char(bstrUrl);
cb(ih, urlString);
free(urlString);
}
(void)bstrUrlContext;
(void)dwFlags;
(void)Cancel;
(void)ppDispatch;
}
#endif
void STDMETHODCALLTYPE NavigateError(IDispatch *pDispatch, VARIANT *url, VARIANT *TargetFrameName,
VARIANT *StatusCode, VARIANT_BOOL *Cancel)
{
iupAttribSet(ih, "_IUPWEB_FAILED", "1");
IFns cb = (IFns)IupGetCallback(ih, "ERROR_CB");
if (cb)
{
char* urlString = iupwinStrWide2Char(url->bstrVal);
cb(ih, urlString);
free(urlString);
}
(void)TargetFrameName;
(void)StatusCode;
(void)Cancel;
(void)pDispatch;
}
void STDMETHODCALLTYPE DocumentComplete(IDispatch *pDispatch, VARIANT *url)
{
IFns cb = (IFns)IupGetCallback(ih, "COMPLETED_CB");
if (cb)
{
char* urlString = iupwinStrWide2Char(url->bstrVal);
cb(ih, urlString);
free(urlString);
}
(void)pDispatch;
}
void STDMETHODCALLTYPE CommandStateChange(LONG Command, VARIANT_BOOL Enable)
{
if (Command == CSC_NAVIGATEFORWARD)
{
if (Enable == VARIANT_TRUE)
iupAttribSet(ih, "CANGOFORWARD", "YES");
else
iupAttribSet(ih, "CANGOFORWARD", "NO");
}
else if (Command == CSC_NAVIGATEBACK)
{
if (Enable == VARIANT_TRUE)
iupAttribSet(ih, "CANGOBACK", "YES");
else
iupAttribSet(ih, "CANGOBACK", "NO");
}
else if (Command == CSC_UPDATECOMMANDS)
{
IFn cb = IupGetCallback(ih, "UPDATE_CB");
if (cb)
cb(ih);
}
}
};
/**********************************************************************************/
static BSTR winStrChar2BStr(const char* str)
{
WCHAR* wstr = iupwinStrChar2Wide(str);
BSTR bstr = SysAllocString(wstr);
if (wstr) free(wstr);
return bstr;
}
static void winVariantBStr(VARIANT *var, BSTR bstr)
{
VariantInit(var);
var->vt = VT_BSTR;
var->bstrVal = bstr;
}
static void winVariantLong(VARIANT *var, LONG val)
{
VariantInit(var);
var->vt = VT_I4;
var->lVal = val;
}
static SAFEARRAY* winVariantSafeArray(BSTR bstr)
{
VARIANT *param;
SAFEARRAY *sfArray;
sfArray = SafeArrayCreateVector(VT_VARIANT, 0, 1); // must call SafeArrayDestroy
SafeArrayAccessData(sfArray,(LPVOID*) &param);
param->vt = VT_BSTR;
param->bstrVal = bstr;
SafeArrayUnaccessData(sfArray);
return sfArray;
}
static IDispatch* winWebBrowserGetDispatch(Ihandle* ih, IWebBrowser2 *pWeb)
{
/* Retrieve the document object. */
IDispatch* pDispatch = NULL;
pWeb->get_Document(&pDispatch);
if (!pDispatch)
{
iupAttribSet(ih, "_IUPWEB_FAILED", NULL);
iupAttribSet(ih, "_IUPWEB_IGNORE_NAVIGATE", "1");
BSTR url = SysAllocString(L"about:blank");
pWeb->Navigate(url, NULL, NULL, NULL, NULL);
SysFreeString(url);
IupFlush();
iupAttribSet(ih, "_IUPWEB_IGNORE_NAVIGATE", NULL);
pWeb->get_Document(&pDispatch);
}
return pDispatch;
}
/********************************************************************************/
static char* winWebBrowserGetDirtyAttrib(Ihandle* ih)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
/* Retrieve the document object */
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IPersistStreamInit* pPersistStreamInit = NULL;
pDispatch->QueryInterface(IID_IPersistStreamInit, (void**)&pPersistStreamInit);
/* Load the contents of the stream. */
int ret = pPersistStreamInit->IsDirty() == S_OK? 1: 0;
/* Releases */
pPersistStreamInit->Release();
pDispatch->Release();
return iupStrReturnBoolean(ret);
}
static int winWebBrowserSetEditableAttrib(Ihandle* ih, const char* value);
static int winWebBrowserSetNewAttrib(Ihandle* ih, const char* value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
/* Retrieve the document object */
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IPersistStreamInit* pPersistStreamInit = NULL;
pDispatch->QueryInterface(IID_IPersistStreamInit, (void**)&pPersistStreamInit);
/* Load the contents of the stream. */
pPersistStreamInit->InitNew();
/* Releases */
pPersistStreamInit->Release();
pDispatch->Release();
winWebBrowserSetEditableAttrib(ih, "Yes");
(void)value;
return 0;
}
#if 1
static int winWebBrowserSetHTMLAttrib(Ihandle* ih, const char* value)
{
if (!value)
return 0;
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
int size = (int)strlen(value) + 1;
/* Create the memory for the stream */
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, size);
/* fill the data */
LPVOID pData = GlobalLock(hMem);
memcpy(pData, value, size);
GlobalUnlock(hMem);
/* Create the stream */
IStream* pStream = NULL;
CreateStreamOnHGlobal(hMem, FALSE, &pStream);
/* Retrieve the document object */
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IPersistStreamInit* pPersistStreamInit = NULL;
pDispatch->QueryInterface(IID_IPersistStreamInit, (void**)&pPersistStreamInit);
/* Load the contents of the stream. */
pPersistStreamInit->Load(pStream);
/* Releases */
pPersistStreamInit->Release();
pStream->Release();
pDispatch->Release();
GlobalFree(hMem);
return 0; /* do not store value in hash table */
}
#else
static int winWebBrowserSetHTMLAttrib(Ihandle* ih, const char* value)
{
if (!value)
return 0;
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
/* Retrieve the document object. */
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IHTMLDocument2 *pHtmlDoc;
pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
BSTR bvalue = winStrChar2BStr(value);
SAFEARRAY *sfArray = winVariantSafeArray(bvalue);
pHtmlDoc->write(sfArray);
pHtmlDoc->close();
/* Releases */
SafeArrayDestroy(sfArray);
SysFreeString(bvalue);
pHtmlDoc->Release();
pDispatch->Release();
return 0; /* do not store value in hash table */
}
#endif
static char* winWebBrowserGetHTMLAttrib(Ihandle* ih)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
/* Create the stream */
IStream* pStream = NULL;
CreateStreamOnHGlobal(NULL, TRUE, &pStream);
/* Retrieve the document object */
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IPersistStreamInit* pPersistStreamInit = NULL;
pDispatch->QueryInterface(IID_IPersistStreamInit, (void**)&pPersistStreamInit);
/* Save the contents of the stream. */
pPersistStreamInit->Save(pStream, TRUE); /* clear dirty flag */
HGLOBAL hMem;
GetHGlobalFromStream(pStream, &hMem);
LPVOID pData = GlobalLock(hMem);
int size = (int)GlobalSize(hMem);
char* str = (char*)pData;
if (str[size-1] != 0)
str[size - 1] = 0;
char* value = iupStrReturnStr(str);
GlobalUnlock(hMem);
/* Releases */
pPersistStreamInit->Release();
pStream->Release();
pDispatch->Release();
return value;
}
static int write_file(const char* filename, const char* str, int count)
{
FILE* file = fopen(filename, "wb");
if (!file)
return 0;
fwrite(str, 1, count, file);
fclose(file);
return 1;
}
static int winWebBrowserSetSaveAttrib(Ihandle* ih, const char* value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
/* Create the stream */
IStream* pStream = NULL;
CreateStreamOnHGlobal(NULL, TRUE, &pStream);
/* Retrieve the document object */
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IPersistStreamInit* pPersistStreamInit = NULL;
pDispatch->QueryInterface(IID_IPersistStreamInit, (void**)&pPersistStreamInit);
/* Save the contents of the stream. */
pPersistStreamInit->Save(pStream, TRUE); /* clear dirty flag */
HGLOBAL hMem;
GetHGlobalFromStream(pStream, &hMem);
LPVOID pData = GlobalLock(hMem);
int size = (int)GlobalSize(hMem);
char* str = (char*)pData;
if (str[size - 1] != 0)
str[size - 1] = 0;
write_file(value, str, size);
GlobalUnlock(hMem);
/* Releases */
pPersistStreamInit->Release();
pStream->Release();
pDispatch->Release();
return 0;
}
static int winWebBrowserSetValueAttrib(Ihandle* ih, const char* value);
static int winWebBrowserSetOpenAttrib(Ihandle* ih, const char* value)
{
char* url = iupStrFileMakeURL(value);
winWebBrowserSetValueAttrib(ih, url);
winWebBrowserSetEditableAttrib(ih, "Yes");
free(url);
return 0;
}
static int winWebBrowserSetCopyAttrib(Ihandle* ih, const char* value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
pWeb->ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);
(void)value;
return 0;
}
static int winWebBrowserSetCutAttrib(Ihandle* ih, const char* value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
pWeb->ExecWB(OLECMDID_CUT, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);
(void)value;
return 0;
}
static int winWebBrowserSetPasteAttrib(Ihandle* ih, const char* value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
pWeb->ExecWB(OLECMDID_PASTE, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);
(void)value;
return 0;
}
static char* winWebBrowserGetPasteAttrib(Ihandle* ih)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
OLECMDF status;
if (pWeb->QueryStatusWB(OLECMDID_PASTE, &status) == S_OK)
{
int state = status & OLECMDF_ENABLED;
// int state = status & OLECMDF_LATCHED;
return iupStrReturnBoolean(state);
}
return NULL;
}
static int winWebBrowserSetUndoAttrib(Ihandle* ih, const char* value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
pWeb->ExecWB(OLECMDID_UNDO, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);
(void)value;
return 0;
}
static int winWebBrowserSetRedoAttrib(Ihandle* ih, const char* value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
pWeb->ExecWB(OLECMDID_REDO, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);
(void)value;
return 0;
}
static int winWebBrowserSetSelectAllAttrib(Ihandle* ih, const char* value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
pWeb->ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);
(void)value;
return 0;
}
static int winWebBrowserSetFindAttrib(Ihandle* ih, const char* value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
pWeb->ExecWB(OLECMDID_FIND, OLECMDEXECOPT_PROMPTUSER, NULL, NULL);
(void)value;
return 0;
}
static void winWebBrowserExecCommandIdBool(Ihandle* ih, UINT nID, int value);
static int winWebBrowserSetPrintAttrib(Ihandle* ih, const char* value)
{
#if 0
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
pWeb->ExecWB(OLECMDID_PRINT2, iupStrBoolean(value)? OLECMDEXECOPT_PROMPTUSER: OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);
#else
winWebBrowserExecCommandIdBool(ih, IDM_PRINT, iupStrBoolean(value));
#endif
return 0;
}
static int winWebBrowserSetZoomAttrib(Ihandle* ih, const char* value)
{
int zoom;
if (iupStrToInt(value, &zoom))
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
VARIANT var;
winVariantLong(&var, (LONG)zoom);
// OLECMDID_OPTICAL_ZOOM = VT_I4 (LONG) parameter in the range of 10 to 1000 (percent).
pWeb->ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL);
}
return 0;
}
static char* winWebBrowserGetZoomAttrib(Ihandle* ih)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
VARIANT var;
winVariantLong(&var, 0);
pWeb->ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, NULL, &var);
return iupStrReturnInt((int)var.lVal);
}
static IHTMLElement* winWebBrowserFindElement(Ihandle* ih, const char* element_id)
{
HRESULT hr;
IHTMLDocument2* pHtmlDoc = NULL;
IWebBrowser2* pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
// Retrieve the document object.
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
hr = pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
IHTMLElementCollection* pColl = NULL;
hr = pHtmlDoc->get_all(&pColl);
if (SUCCEEDED(hr) && (pColl != NULL))
{
// Obtained the Anchor Collection...
long nLength = 0;
pColl->get_length(&nLength);
for (int i = 0; i < nLength; i++)
{
VARIANT vIdx;
winVariantLong(&vIdx, (LONG)i);
IDispatch* pElemDispatch = NULL;
IHTMLElement * pElem = NULL;
hr = pColl->item(vIdx, vIdx, &pElemDispatch);
if (SUCCEEDED(hr) && (pElemDispatch != NULL))
{
hr = pElemDispatch->QueryInterface(IID_IHTMLElement, (void**)&pElem);
if (SUCCEEDED(hr) && (pElem != NULL))
{
BSTR bstrId;
if (!FAILED(pElem->get_id(&bstrId)))
{
char* str = iupwinStrWide2Char(bstrId);
SysFreeString(bstrId);
if (iupStrEqual(str, element_id))
{
free(str);
pElemDispatch->Release();
pColl->Release();
pHtmlDoc->Release();
pDispatch->Release();
return pElem;
}
free(str);
}
pElem->Release();
}
pElemDispatch->Release();
}
}
pColl->Release();
}
pHtmlDoc->Release();
pDispatch->Release();
return NULL;
}
static int winWebBrowserSetInnerTextAttrib(Ihandle* ih, const char* value)
{
if (value)
{
char* element_id = iupAttribGet(ih, "ELEMENT_ID");
if (element_id)
{
IHTMLElement* pElem = winWebBrowserFindElement(ih, element_id);
if (pElem)
{
BSTR bvalue = winStrChar2BStr(value);
pElem->put_innerText(bvalue);
SysFreeString(bvalue);
pElem->Release();
}
}
}
return 0;
}
static char* winWebBrowserGetInnerTextAttrib(Ihandle* ih)
{
char* element_id = iupAttribGet(ih, "ELEMENT_ID");
if (element_id)
{
IHTMLElement* pElem = winWebBrowserFindElement(ih, element_id);
if (pElem)
{
BSTR bvalue = NULL;
if (!FAILED(pElem->get_innerText(&bvalue)))
{
char* str = iupwinStrWide2Char(bvalue);
char* value = iupStrReturnStr(str);
SysFreeString(bvalue);
free(str);
pElem->Release();
return value;
}
pElem->Release();
}
}
return NULL;
}
static int winWebBrowserSetAttributeAttrib(Ihandle* ih, const char* value)
{
if (value)
{
char* element_id = iupAttribGet(ih, "ELEMENT_ID");
char* attribute_name = iupAttribGet(ih, "ATTRIBUTE_NAME");
if (element_id && attribute_name)
{
IHTMLElement* pElem = winWebBrowserFindElement(ih, element_id);
if (pElem)
{
BSTR bname = winStrChar2BStr(attribute_name);
BSTR bvalue = winStrChar2BStr(value);
VARIANT var;
winVariantBStr(&var, bvalue);
pElem->setAttribute(bname, var, 1); // case sensitive search
SysFreeString(bvalue);
SysFreeString(bname);
pElem->Release();
}
}
}
return 0;
}
static char* winWebBrowserGetAttributeAttrib(Ihandle* ih)
{
char* element_id = iupAttribGet(ih, "ELEMENT_ID");
char* attribute_name = iupAttribGet(ih, "ATTRIBUTE_NAME");
if (element_id && attribute_name)
{
IHTMLElement* pElem = winWebBrowserFindElement(ih, element_id);
if (pElem)
{
BSTR bname = winStrChar2BStr(attribute_name);
VARIANT var;
VariantInit(&var);
if (!FAILED(pElem->getAttribute(bname, 1, &var)) && var.bstrVal) // case sensitive search
{
char* str = iupwinStrWide2Char(var.bstrVal);
char* value = iupStrReturnStr(str);
free(str);
SysFreeString(bname);
pElem->Release();
return value;
}
SysFreeString(bname);
pElem->Release();
}
}
return NULL;
}
static int winWebBrowserSetBackForwardAttrib(Ihandle* ih, const char* value)
{
int i, val;
if (iupStrToInt(value, &val))
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
/* Negative values represent steps backward while positive values represent steps forward. */
if(val > 0)
{
for(i = 0; i < val; i++)
pWeb->GoForward();
}
else if(val < 0)
{
for(i = 0; i < -(val); i++)
pWeb->GoBack();
}
}
return 0; /* do not store value in hash table */
}
static int winWebBrowserSetGoBackAttrib(Ihandle* ih, const char* value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
pWeb->GoBack();
(void)value;
return 0; /* do not store value in hash table */
}
static int winWebBrowserSetGoForwardAttrib(Ihandle* ih, const char* value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
pWeb->GoForward();
(void)value;
return 0; /* do not store value in hash table */
}
static int winWebBrowserSetReloadAttrib(Ihandle* ih, const char* value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
pWeb->Refresh();
(void)value;
return 0; /* do not store value in hash table */
}
static int winWebBrowserSetStopAttrib(Ihandle* ih, const char* value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
pWeb->Stop();
(void)value;
return 0; /* do not store value in hash table */
}
static char* winWebBrowserGetStatusAttrib(Ihandle* ih)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
READYSTATE plReadyState;
pWeb->get_ReadyState(&plReadyState);
if (iupAttribGet(ih, "_IUPWEB_FAILED"))
return "FAILED";
else if (plReadyState == READYSTATE_COMPLETE)
return "COMPLETED";
else
return "LOADING";
}
static int winWebBrowserSetValueAttrib(Ihandle* ih, const char* value)
{
if (value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
BSTR bvalue = winStrChar2BStr(value);
BSTR btarget = SysAllocString(L"_top");
VARIANT var;
winVariantBStr(&var, btarget);
iupAttribSet(ih, "_IUPWEB_FAILED", NULL);
pWeb->Navigate(bvalue, NULL, &var, NULL, NULL);
SysFreeString(bvalue);
SysFreeString(btarget);
}
return 0;
}
static char* winWebBrowserGetValueAttrib(Ihandle* ih)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
BSTR pbstrLocationURL = NULL;
if (pWeb->get_LocationURL(&pbstrLocationURL)==S_OK && pbstrLocationURL)
{
char* str = iupwinStrWide2Char(pbstrLocationURL);
SysFreeString(pbstrLocationURL);
char* value = iupStrReturnStr(str);
free(str);
return value;
}
return NULL;
}
static int winWebBrowserSetEditableAttrib(Ihandle* ih, const char* value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
/* Retrieve the document object. */
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IHTMLDocument2 *pHtmlDoc;
pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
BSTR bvalue = SysAllocString(iupStrBoolean(value) ? L"On" : L"Off");
pHtmlDoc->put_designMode(bvalue);
/* Releases */
SysFreeString(bvalue);
pHtmlDoc->Release();
pDispatch->Release();
return 0;
}
static char* winWebBrowserGetEditableAttrib(Ihandle* ih)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
/* Retrieve the document object. */
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IHTMLDocument2 *pHtmlDoc;
pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
BSTR bvalue = NULL;
pHtmlDoc->get_designMode(&bvalue);
/* Releases */
pHtmlDoc->Release();
pDispatch->Release();
if (bvalue)
{
char* str = iupwinStrWide2Char(bvalue);
SysFreeString(bvalue);
int ret = iupStrEqual(str, "On");
free(str);
return iupStrReturnBoolean(ret);
}
return NULL;
}
static long winWebBrowserQueryStatus(IOleCommandTarget* pCmdTarg, ULONG cmdID)
{
OLECMD ocmd = { cmdID, 0 };
if (S_OK == pCmdTarg->QueryStatus(&CGID_MSHTML, 1, &ocmd, NULL))
return ocmd.cmdf;
return 0;
}
static HRESULT winWebBrowserExecHelperNN(IOleCommandTarget* pCmdTarg, UINT nID)
{
HRESULT hr = E_FAIL;
long nMinSupportLevel = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
long nExecOpt = OLECMDEXECOPT_DODEFAULT;
long lStatus = winWebBrowserQueryStatus(pCmdTarg, nID);
if ((lStatus & nMinSupportLevel) == nMinSupportLevel)
hr = pCmdTarg->Exec(&CGID_MSHTML, nID, nExecOpt, NULL, NULL);
return hr;
}
static HRESULT winWebBrowserExecHelperNNBool(IOleCommandTarget* pCmdTarg, UINT nID, int value)
{
HRESULT hr = E_FAIL;
long nMinSupportLevel = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
long nExecOpt = OLECMDEXECOPT_DODEFAULT;
long lStatus = winWebBrowserQueryStatus(pCmdTarg, nID);
if ((lStatus & nMinSupportLevel) == nMinSupportLevel)
{
VARIANT var;
VariantInit(&var);
var.vt = VT_BOOL;
var.boolVal == value? VARIANT_TRUE: VARIANT_FALSE;
hr = pCmdTarg->Exec(&CGID_MSHTML, nID, nExecOpt, &var, NULL);
}
return hr;
}
static void winWebBrowserExecCommandId(Ihandle* ih, UINT nID)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
/* Retrieve the document object. */
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IHTMLDocument2 *pHtmlDoc;
pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
IOleCommandTarget* pCmdTarg;
pDispatch->QueryInterface(IID_IOleCommandTarget, (void**)&pCmdTarg);
winWebBrowserExecHelperNN(pCmdTarg, nID);
pHtmlDoc->Release();
pDispatch->Release();
}
static void winWebBrowserExecCommandIdBool(Ihandle* ih, UINT nID, int value)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
/* Retrieve the document object. */
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IHTMLDocument2 *pHtmlDoc;
pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
IOleCommandTarget* pCmdTarg;
pDispatch->QueryInterface(IID_IOleCommandTarget, (void**)&pCmdTarg);
winWebBrowserExecHelperNNBool(pCmdTarg, nID, value);
pHtmlDoc->Release();
pDispatch->Release();
}
static int winWebBrowserSetPrintPreviewAttrib(Ihandle* ih, const char* value)
{
winWebBrowserExecCommandId(ih, IDM_PRINTPREVIEW);
(void)value;
return 0;
}
static char* winWebBrowserQueryCommandValue(Ihandle* ih, const char* cmd, int is_color)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
/* Retrieve the document object. */
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IHTMLDocument2 *pHtmlDoc;
pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
BSTR bCmd = winStrChar2BStr(cmd);
VARIANT var;
VariantInit(&var);
pHtmlDoc->queryCommandValue(bCmd, &var);
char* value = NULL;
if (var.vt == VT_BSTR)
{
char* str = iupwinStrWide2Char(var.bstrVal);
value = iupStrReturnStr(str);
free(str);
}
else if (var.vt == VT_I4)
{
if (is_color)
value = iupStrReturnRGB(GetRValue(var.lVal), GetGValue(var.lVal), GetBValue(var.lVal));
else
value = iupStrReturnInt((int)var.lVal);
}
else if (var.vt == VT_I2)
value = iupStrReturnInt((int)var.iVal);
else if (var.vt == VT_BOOL)
value = iupStrReturnBoolean(var.boolVal == VARIANT_TRUE ? 1 : 0);
SysFreeString(bCmd);
pHtmlDoc->Release();
pDispatch->Release();
return value;
}
static char* winWebBrowserQueryCommandText(Ihandle* ih, const char* cmd)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
/* Retrieve the document object. */
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IHTMLDocument2 *pHtmlDoc;
pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
BSTR bCmd = winStrChar2BStr(cmd);
BSTR cmdText = NULL;
pHtmlDoc->queryCommandText(bCmd, &cmdText);
char* value = NULL;
if (cmdText)
{
char* str = iupwinStrWide2Char(cmdText);
value = iupStrReturnStr(str);
free(str);
}
SysFreeString(bCmd);
pHtmlDoc->Release();
pDispatch->Release();
return value;
}
static void winWebBrowserExecCommand(Ihandle* ih, const char* cmd, int show_ui)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
/* Retrieve the document object. */
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IHTMLDocument2 *pHtmlDoc;
pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
BSTR bCmd = winStrChar2BStr(cmd);
VARIANT var;
VariantInit(&var);
pHtmlDoc->execCommand(bCmd, show_ui? VARIANT_TRUE: VARIANT_FALSE, var, NULL);
SysFreeString(bCmd);
pHtmlDoc->Release();
pDispatch->Release();
}
static void winWebBrowserExecCommandParam(Ihandle* ih, const char* cmd, int show_ui, const char* param)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IHTMLDocument2 *pHtmlDoc;
pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
BSTR bCmd = winStrChar2BStr(cmd);
BSTR bParam = winStrChar2BStr(param);
VARIANT var;
winVariantBStr(&var, bParam);
pHtmlDoc->execCommand(bCmd, show_ui? VARIANT_TRUE: VARIANT_FALSE, var, NULL);
SysFreeString(bCmd);
SysFreeString(bParam);
pHtmlDoc->Release();
pDispatch->Release();
}
static void winWebBrowserExecCommandParamInt(Ihandle* ih, const char* cmd, int show_ui, int param)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IHTMLDocument2 *pHtmlDoc;
pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
BSTR bCmd = winStrChar2BStr(cmd);
VARIANT var;
winVariantLong(&var, (LONG)param);
pHtmlDoc->execCommand(bCmd, show_ui ? VARIANT_TRUE : VARIANT_FALSE, var, NULL);
SysFreeString(bCmd);
pHtmlDoc->Release();
pDispatch->Release();
}
static int winWebBrowserQueryCommandEnabled(Ihandle* ih, const char* cmd)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IHTMLDocument2 *pHtmlDoc;
pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
BSTR bCmd = winStrChar2BStr(cmd);
VARIANT_BOOL vRet;
pHtmlDoc->queryCommandEnabled(bCmd, &vRet);
int ret = vRet == VARIANT_TRUE? 1: 0;
SysFreeString(bCmd);
pHtmlDoc->Release();
pDispatch->Release();
return ret;
}
static int winWebBrowserQueryCommandState(Ihandle* ih, const char* cmd)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IHTMLDocument2 *pHtmlDoc;
pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
BSTR bCmd = winStrChar2BStr(cmd);
VARIANT_BOOL vRet;
pHtmlDoc->queryCommandState(bCmd, &vRet);
int ret = vRet == VARIANT_TRUE ? 1 : 0;
SysFreeString(bCmd);
pHtmlDoc->Release();
pDispatch->Release();
return ret;
}
static int winWebBrowserSetExecCommandAttrib(Ihandle* ih, const char* value)
{
if (value)
{
int show_ui = iupAttribGetBoolean(ih, "COMMANDSHOWUI");
winWebBrowserExecCommand(ih, value, show_ui);
}
return 0;
}
static char* winWebBrowserGetCommandStateAttrib(Ihandle* ih)
{
char* cmd = iupAttribGet(ih, "COMMAND");
if (cmd)
return iupStrReturnBoolean(winWebBrowserQueryCommandState(ih, cmd));
return NULL;
}
static char* winWebBrowserGetCommandEnabledAttrib(Ihandle* ih)
{
char* cmd = iupAttribGet(ih, "COMMAND");
if (cmd)
return iupStrReturnBoolean(winWebBrowserQueryCommandEnabled(ih, cmd));
return NULL;
}
static char* winWebBrowserGetCommandTextAttrib(Ihandle* ih)
{
char* cmd = iupAttribGet(ih, "COMMAND");
if (cmd)
return iupStrReturnStr(winWebBrowserQueryCommandText(ih, cmd));
return NULL;
}
static char* winWebBrowserGetCommandValueAttrib(Ihandle* ih)
{
char* cmd = iupAttribGet(ih, "COMMAND");
if (cmd)
return iupStrReturnStr(winWebBrowserQueryCommandValue(ih, cmd, 0));
return NULL;
}
static int winWebBrowserSetInsertImageAttrib(Ihandle* ih, const char* value)
{
if (value)
{
int show_ui = iupAttribGetBoolean(ih, "COMMANDSHOWUI");
winWebBrowserExecCommandParam(ih, "insertImage", show_ui, value);
}
else
winWebBrowserExecCommandParam(ih, "insertImage", 1, value);
return 0;
}
static int winWebBrowserSetInsertImageFileAttrib(Ihandle* ih, const char* value)
{
if (value)
{
char* url = iupStrFileMakeURL(value);
int show_ui = iupAttribGetBoolean(ih, "COMMANDSHOWUI");
winWebBrowserExecCommandParam(ih, "insertImage", show_ui, url);
free(url);
}
return 0;
}
static int winWebBrowserSetCreateLinkAttrib(Ihandle* ih, const char* value)
{
if (value)
{
int show_ui = iupAttribGetBoolean(ih, "COMMANDSHOWUI");
winWebBrowserExecCommandParam(ih, "createLink", show_ui, value);
}
else
winWebBrowserExecCommandParam(ih, "createLink", 1, value);
return 0;
}
static int winWebBrowserSetFontNameAttrib(Ihandle* ih, const char* value)
{
if (value)
{
int show_ui = iupAttribGetBoolean(ih, "COMMANDSHOWUI");
winWebBrowserExecCommandParam(ih, "fontName", show_ui, value);
}
return 0;
}
static char* winWebBrowserGetFontNameAttrib(Ihandle* ih)
{
return winWebBrowserQueryCommandValue(ih, "fontName", 0);
}
static int winWebBrowserSetFontSizeAttrib(Ihandle* ih, const char* value)
{
int param = 0;
if (iupStrToInt(value, &param) && param > 0 && param < 8)
{
int show_ui = iupAttribGetBoolean(ih, "COMMANDSHOWUI");
winWebBrowserExecCommandParamInt(ih, "fontSize", show_ui, param);
}
return 0;
}
static char* winWebBrowserGetFontSizeAttrib(Ihandle* ih)
{
return winWebBrowserQueryCommandValue(ih, "fontSize", 0);
}
static int winWebBrowserSetFormatBlockAttrib(Ihandle* ih, const char* value)
{
if (value)
{
int show_ui = iupAttribGetBoolean(ih, "COMMANDSHOWUI");
winWebBrowserExecCommandParam(ih, "formatBlock", show_ui, value);
}
return 0;
}
static char* winWebBrowserGetFormatBlockAttrib(Ihandle* ih)
{
return winWebBrowserQueryCommandValue(ih, "formatBlock", 0);
}
static int winWebBrowserSetForeColorAttrib(Ihandle* ih, const char* value)
{
unsigned char r, g, b;
if (iupStrToRGB(value, &r, &g, &b))
{
int show_ui = iupAttribGetBoolean(ih, "COMMANDSHOWUI");
winWebBrowserExecCommandParam(ih, "foreColor", show_ui, value);
}
return 0;
}
static char* winWebBrowserGetForeColorAttrib(Ihandle* ih)
{
return winWebBrowserQueryCommandValue(ih, "foreColor", 1);
}
static int winWebBrowserSetBackColorAttrib(Ihandle* ih, const char* value)
{
unsigned char r, g, b;
if (iupStrToRGB(value, &r, &g, &b))
{
int show_ui = iupAttribGetBoolean(ih, "COMMANDSHOWUI");
winWebBrowserExecCommandParam(ih, "backColor", show_ui, value);
}
return 0;
}
static char* winWebBrowserGetBackColorAttrib(Ihandle* ih)
{
return winWebBrowserQueryCommandValue(ih, "backColor", 1);
}
static void winWebBrowserInsertAtCurrentSelection(Ihandle* ih, const char* str, int as_html)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
IDispatch* pDispatch = winWebBrowserGetDispatch(ih, pWeb);
IHTMLDocument2 *pHtmlDoc;
pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
IHTMLSelectionObject* pSelection = NULL;
HRESULT hResult = pHtmlDoc->get_selection(&pSelection);
if (SUCCEEDED(hResult) && pSelection)
{
IDispatch* pTextRangeDisp = NULL;
hResult = pSelection->createRange(&pTextRangeDisp);
if (SUCCEEDED(hResult) && pTextRangeDisp)
{
IHTMLTxtRange* pRange = NULL;
hResult = pTextRangeDisp->QueryInterface(IID_IHTMLTxtRange, (void**)&pRange);
if (SUCCEEDED(hResult) && pRange)
{
BSTR b_str = winStrChar2BStr(str);
if (as_html)
pRange->pasteHTML(b_str);
else
pRange->put_text(b_str);
SysFreeString(b_str);
pRange->Release();
}
pTextRangeDisp->Release();
}
pSelection->Release();
}
}
static int winWebBrowserSetInsertTextAttrib(Ihandle* ih, const char* value)
{
if (value)
winWebBrowserInsertAtCurrentSelection(ih, value, 0);
return 0;
}
static int winWebBrowserSetInsertHtmlAttrib(Ihandle* ih, const char* value)
{
if (value)
winWebBrowserInsertAtCurrentSelection(ih, value, 1);
return 0;
}
/******************************************************************************************************************/
static int winWebBrowserCreateMethod(Ihandle* ih, void **params)
{
(void)params;
IupSetAttribute(ih, "PROGID", "Shell.Explorer.2");
IupSetAttribute(ih, "DESIGNMODE", "NO");
/* Get the current IUnknown* (from IupOleControl) */
IUnknown *punk = (IUnknown*)IupGetAttribute(ih, "IUNKNOWN");
IWebBrowser2 *pWeb = NULL;
punk->QueryInterface(IID_IWebBrowser2, (void **)&pWeb);
iupAttribSet(ih, "_IUPWEB_BROWSER", (char*)pWeb);
/* winWebBrowserSink object to capture events */
winWebBrowserSink* sink = new winWebBrowserSink();
/* Set handle to use in winWebBrowserSink Interface */
sink->ih = ih;
/* Connecting to the server's outgoing interface */
sink->DispEventAdvise(punk);
iupAttribSet(ih, "_IUPWEB_SINK", (char*)sink);
punk->Release();
return IUP_NOERROR;
}
static void winWebBrowserDestroyMethod(Ihandle* ih)
{
IWebBrowser2 *pWeb = (IWebBrowser2*)iupAttribGet(ih, "_IUPWEB_BROWSER");
pWeb->Release();
winWebBrowserSink* sink = (winWebBrowserSink*)iupAttribGet(ih, "_IUPWEB_SINK");
/* Get the current IUnknown* */
IUnknown *punk = (IUnknown*)IupGetAttribute(ih, "IUNKNOWN");
/* Disconnecting from the server's outgoing interface */
sink->DispEventUnadvise(punk);
delete sink;
punk->Release();
}
static void winWebBrowserRelease(Iclass* ic)
{
/* Terminating ATL support */
if (iweb_module)
{
iweb_module->Term();
delete iweb_module;
iweb_module = NULL;
}
(void)ic;
}
Iclass* iupWebBrowserNewClass(void)
{
Iclass* ic = iupClassNew(iupRegisterFindClass("olecontrol"));
ic->name = "webbrowser";
ic->cons = "WebBrowser";
ic->format = NULL; /* no parameters */
ic->nativetype = IUP_TYPECANVAS;
ic->childtype = IUP_CHILDNONE;
ic->is_interactive = 1;
/* Class functions */
ic->New = iupWebBrowserNewClass;
ic->Create = winWebBrowserCreateMethod;
ic->Destroy = winWebBrowserDestroyMethod;
ic->Release = winWebBrowserRelease;
/* Callbacks */
iupClassRegisterCallback(ic, "NEWWINDOW_CB", "s");
iupClassRegisterCallback(ic, "NAVIGATE_CB", "s");
iupClassRegisterCallback(ic, "ERROR_CB", "s");
iupClassRegisterCallback(ic, "COMPLETED_CB", "s");
iupClassRegisterCallback(ic, "UPDATE_CB", "");
/* Attributes */
iupClassRegisterAttribute(ic, "VALUE", winWebBrowserGetValueAttrib, winWebBrowserSetValueAttrib, NULL, NULL, IUPAF_NO_DEFAULTVALUE|IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "BACKFORWARD", NULL, winWebBrowserSetBackForwardAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "GOBACK", NULL, winWebBrowserSetGoBackAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "GOFORWARD", NULL, winWebBrowserSetGoForwardAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "STOP", NULL, winWebBrowserSetStopAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "RELOAD", NULL, winWebBrowserSetReloadAttrib, NULL, NULL, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "HTML", winWebBrowserGetHTMLAttrib, winWebBrowserSetHTMLAttrib, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "STATUS", winWebBrowserGetStatusAttrib, NULL, NULL, NULL, IUPAF_NO_DEFAULTVALUE|IUPAF_READONLY|IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "ZOOM", winWebBrowserGetZoomAttrib, winWebBrowserSetZoomAttrib, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "PRINT", NULL, winWebBrowserSetPrintAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "CANGOBACK", NULL, NULL, NULL, NULL, IUPAF_READONLY | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "CANGOFORWARD", NULL, NULL, NULL, NULL, IUPAF_READONLY | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "EDITABLE", winWebBrowserGetEditableAttrib, winWebBrowserSetEditableAttrib, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "NEW", NULL, winWebBrowserSetNewAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "OPENFILE", NULL, winWebBrowserSetOpenAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "SAVEFILE", NULL, winWebBrowserSetSaveAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "UNDO", NULL, winWebBrowserSetUndoAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "REDO", NULL, winWebBrowserSetRedoAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "CUT", NULL, winWebBrowserSetCutAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "COPY", NULL, winWebBrowserSetCopyAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "PASTE", winWebBrowserGetPasteAttrib, winWebBrowserSetPasteAttrib, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "SELECTALL", NULL, winWebBrowserSetSelectAllAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "FIND", NULL, winWebBrowserSetFindAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "EXECCOMMAND", NULL, winWebBrowserSetExecCommandAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "COMMAND", NULL, NULL, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "COMMANDSHOWUI", NULL, NULL, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "COMMANDSTATE", winWebBrowserGetCommandStateAttrib, NULL, NULL, NULL, IUPAF_READONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "COMMANDENABLED", winWebBrowserGetCommandEnabledAttrib, NULL, NULL, NULL, IUPAF_READONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "COMMANDTEXT", winWebBrowserGetCommandTextAttrib, NULL, NULL, NULL, IUPAF_READONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "COMMANDVALUE", winWebBrowserGetCommandValueAttrib, NULL, NULL, NULL, IUPAF_READONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "INSERTIMAGEFILE", NULL, winWebBrowserSetInsertImageFileAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "INSERTIMAGE", NULL, winWebBrowserSetInsertImageAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "CREATELINK", NULL, winWebBrowserSetCreateLinkAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "INSERTTEXT", NULL, winWebBrowserSetInsertTextAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "INSERTHTML", NULL, winWebBrowserSetInsertHtmlAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "FONTNAME", winWebBrowserGetFontNameAttrib, winWebBrowserSetFontNameAttrib, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "FONTSIZE", winWebBrowserGetFontSizeAttrib, winWebBrowserSetFontSizeAttrib, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "FORMATBLOCK", winWebBrowserGetFormatBlockAttrib, winWebBrowserSetFormatBlockAttrib, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "FORECOLOR", winWebBrowserGetForeColorAttrib, winWebBrowserSetForeColorAttrib, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "BACKCOLOR", winWebBrowserGetBackColorAttrib, winWebBrowserSetBackColorAttrib, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "DIRTY", winWebBrowserGetDirtyAttrib, NULL, NULL, NULL, IUPAF_READONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "PRINTPREVIEW", NULL, winWebBrowserSetPrintPreviewAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
/* Windows Only */
iupClassRegisterAttribute(ic, "ELEMENT_ID", NULL, NULL, NULL, NULL, IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "INNERTEXT", winWebBrowserGetInnerTextAttrib, winWebBrowserSetInnerTextAttrib, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "ATTRIBUTE_NAME", NULL, NULL, NULL, NULL, IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "ATTRIBUTE", winWebBrowserGetAttributeAttrib, winWebBrowserSetAttributeAttrib, NULL, NULL, IUPAF_NO_INHERIT);
if (!iweb_module)
{
/* CComModule implements a COM server module,
allowing a client to access the module's components */
iweb_module = new CComModule();
/* Initializing ATL Support */
iweb_module->Init(NULL, (HINSTANCE)IupGetGlobal("HINSTANCE"));
}
return ic;
}
#if 0
// HRESULT error code processing, useful for debugging
#include <comdef.h>
DWORD Win32FromHResult(HRESULT hr)
{
if ((hr & 0xFFFF0000) == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, 0))
return HRESULT_CODE(hr);
if (hr == S_OK)
return ERROR_SUCCESS;
// Not a Win32 HRESULT so return a generic error code.
return ERROR_CAN_NOT_COMPLETE;
}
_com_error error(Win32FromHResult(err));
LPCTSTR errorText = error.ErrorMessage();
MessageBox(NULL, errorText, "Error", MB_OK | MB_ICONERROR);
#endif