blob: 3e6ac6c6be19b517b3cb555a872404ee443c0060 [file] [log] [blame]
/*
* Header includes for ieframe.dll
*
* Copyright 2011 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdarg.h>
#define COBJMACROS
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "winuser.h"
#include "ole2.h"
#include "olectl.h"
#include "shlobj.h"
#include "mshtmhst.h"
#include "exdisp.h"
#include "hlink.h"
#include "htiface.h"
#include "shdeprecated.h"
#include "docobjectservice.h"
#include "wine/unicode.h"
#include "wine/list.h"
typedef struct ConnectionPoint ConnectionPoint;
typedef struct DocHost DocHost;
typedef struct {
IConnectionPointContainer IConnectionPointContainer_iface;
ConnectionPoint *wbe2;
ConnectionPoint *wbe;
ConnectionPoint *pns;
IUnknown *impl;
} ConnectionPointContainer;
typedef struct {
IHlinkFrame IHlinkFrame_iface;
ITargetFrame ITargetFrame_iface;
ITargetFrame2 ITargetFrame2_iface;
ITargetFramePriv2 ITargetFramePriv2_iface;
IWebBrowserPriv2IE9 IWebBrowserPriv2IE9_iface;
IUnknown *outer;
DocHost *doc_host;
} HlinkFrame;
struct _task_header_t;
typedef void (*task_proc_t)(DocHost*, struct _task_header_t*);
typedef void (*task_destr_t)(struct _task_header_t*);
typedef struct _task_header_t {
struct list entry;
task_proc_t proc;
task_destr_t destr;
} task_header_t;
typedef struct {
IShellBrowser IShellBrowser_iface;
IBrowserService IBrowserService_iface;
IDocObjectService IDocObjectService_iface;
LONG ref;
DocHost *doc_host;
} ShellBrowser;
typedef struct {
IHTMLWindow2 IHTMLWindow2_iface;
DocHost *doc_host;
} IEHTMLWindow;
typedef struct {
INewWindowManager INewWindowManager_iface;
DocHost *doc_host;
} NewWindowManager;
typedef struct {
WCHAR *url;
IStream *stream;
} travellog_entry_t;
typedef struct _IDocHostContainerVtbl
{
ULONG (*addref)(DocHost*);
ULONG (*release)(DocHost*);
void (*get_docobj_rect)(DocHost*,RECT*);
HRESULT (*set_status_text)(DocHost*,const WCHAR*);
void (*on_command_state_change)(DocHost*,LONG,BOOL);
void (*set_url)(DocHost*,const WCHAR*);
} IDocHostContainerVtbl;
struct DocHost {
IOleClientSite IOleClientSite_iface;
IOleInPlaceSiteEx IOleInPlaceSiteEx_iface;
IDocHostUIHandler2 IDocHostUIHandler2_iface;
IOleDocumentSite IOleDocumentSite_iface;
IOleControlSite IOleControlSite_iface;
IOleCommandTarget IOleCommandTarget_iface;
IDispatch IDispatch_iface;
IPropertyNotifySink IPropertyNotifySink_iface;
IServiceProvider IServiceProvider_iface;
/* Interfaces of InPlaceFrame object */
IOleInPlaceFrame IOleInPlaceFrame_iface;
IWebBrowser2 *wb;
IDispatch *client_disp;
IDocHostUIHandler *hostui;
IOleInPlaceFrame *frame;
IOleCommandTarget *olecmd;
IUnknown *document;
IOleDocumentView *view;
IUnknown *doc_navigate;
const IDocHostContainerVtbl *container_vtbl;
HWND hwnd;
HWND frame_hwnd;
struct list task_queue;
LPOLESTR url;
VARIANT_BOOL silent;
VARIANT_BOOL offline;
VARIANT_BOOL busy;
READYSTATE ready_state;
READYSTATE doc_state;
DWORD prop_notif_cookie;
BOOL is_prop_notif;
ShellBrowser *browser_service;
IShellUIHelper2 *shell_ui_helper;
struct {
travellog_entry_t *log;
unsigned size;
unsigned length;
unsigned position;
int loading_pos;
} travellog;
ConnectionPointContainer cps;
IEHTMLWindow html_window;
NewWindowManager nwm;
};
struct WebBrowser {
IWebBrowser2 IWebBrowser2_iface;
IOleObject IOleObject_iface;
IOleInPlaceObject IOleInPlaceObject_iface;
IOleControl IOleControl_iface;
IPersistStorage IPersistStorage_iface;
IPersistMemory IPersistMemory_iface;
IPersistStreamInit IPersistStreamInit_iface;
IProvideClassInfo2 IProvideClassInfo2_iface;
IViewObject2 IViewObject2_iface;
IOleInPlaceActiveObject IOleInPlaceActiveObject_iface;
IOleCommandTarget IOleCommandTarget_iface;
IServiceProvider IServiceProvider_iface;
IDataObject IDataObject_iface;
HlinkFrame hlink_frame;
LONG ref;
INT version;
IOleClientSite *client;
IOleClientSite *client_closed;
IOleContainer *container;
IOleInPlaceSiteEx *inplace;
IAdviseSink *sink;
DWORD sink_aspects;
DWORD sink_flags;
/* window context */
HWND frame_hwnd;
IOleInPlaceUIWindow *uiwindow;
RECT pos_rect;
RECT clip_rect;
OLEINPLACEFRAMEINFO frameinfo;
SIZEL extent;
HWND shell_embedding_hwnd;
VARIANT_BOOL register_browser;
VARIANT_BOOL visible;
VARIANT_BOOL menu_bar;
VARIANT_BOOL address_bar;
VARIANT_BOOL status_bar;
VARIANT_BOOL tool_bar;
VARIANT_BOOL full_screen;
VARIANT_BOOL theater_mode;
DocHost doc_host;
};
struct InternetExplorer {
DocHost doc_host;
IWebBrowser2 IWebBrowser2_iface;
IExternalConnection IExternalConnection_iface;
IServiceProvider IServiceProvider_iface;
HlinkFrame hlink_frame;
LONG ref;
LONG extern_ref;
HWND frame_hwnd;
HWND status_hwnd;
HWND toolbar_hwnd;
HMENU menu;
BOOL nohome;
struct list entry;
};
void WebBrowser_OleObject_Init(WebBrowser*) DECLSPEC_HIDDEN;
void WebBrowser_ViewObject_Init(WebBrowser*) DECLSPEC_HIDDEN;
void WebBrowser_Persist_Init(WebBrowser*) DECLSPEC_HIDDEN;
void WebBrowser_ClassInfo_Init(WebBrowser*) DECLSPEC_HIDDEN;
void WebBrowser_OleObject_Destroy(WebBrowser*) DECLSPEC_HIDDEN;
void DocHost_Init(DocHost*,IWebBrowser2*,const IDocHostContainerVtbl*) DECLSPEC_HIDDEN;
void DocHost_Release(DocHost*) DECLSPEC_HIDDEN;
void DocHost_ClientSite_Init(DocHost*) DECLSPEC_HIDDEN;
void DocHost_ClientSite_Release(DocHost*) DECLSPEC_HIDDEN;
void DocHost_Frame_Init(DocHost*) DECLSPEC_HIDDEN;
void release_dochost_client(DocHost*) DECLSPEC_HIDDEN;
void IEHTMLWindow_Init(DocHost*) DECLSPEC_HIDDEN;
void NewWindowManager_Init(DocHost*) DECLSPEC_HIDDEN;
void HlinkFrame_Init(HlinkFrame*,IUnknown*,DocHost*) DECLSPEC_HIDDEN;
BOOL HlinkFrame_QI(HlinkFrame*,REFIID,void**) DECLSPEC_HIDDEN;
HRESULT create_browser_service(DocHost*,ShellBrowser**) DECLSPEC_HIDDEN;
void detach_browser_service(ShellBrowser*) DECLSPEC_HIDDEN;
HRESULT create_shell_ui_helper(IShellUIHelper2**) DECLSPEC_HIDDEN;
void ConnectionPointContainer_Init(ConnectionPointContainer*,IUnknown*) DECLSPEC_HIDDEN;
void ConnectionPointContainer_Destroy(ConnectionPointContainer*) DECLSPEC_HIDDEN;
void call_sink(ConnectionPoint*,DISPID,DISPPARAMS*) DECLSPEC_HIDDEN;
HRESULT navigate_url(DocHost*,LPCWSTR,const VARIANT*,const VARIANT*,VARIANT*,VARIANT*) DECLSPEC_HIDDEN;
HRESULT go_home(DocHost*) DECLSPEC_HIDDEN;
HRESULT go_back(DocHost*) DECLSPEC_HIDDEN;
HRESULT go_forward(DocHost*) DECLSPEC_HIDDEN;
HRESULT refresh_document(DocHost*,const VARIANT*) DECLSPEC_HIDDEN;
HRESULT get_location_url(DocHost*,BSTR*) DECLSPEC_HIDDEN;
HRESULT set_dochost_url(DocHost*,const WCHAR*) DECLSPEC_HIDDEN;
void handle_navigation_error(DocHost*,HRESULT,BSTR,IHTMLWindow2*) DECLSPEC_HIDDEN;
HRESULT dochost_object_available(DocHost*,IUnknown*) DECLSPEC_HIDDEN;
void set_doc_state(DocHost*,READYSTATE) DECLSPEC_HIDDEN;
void deactivate_document(DocHost*) DECLSPEC_HIDDEN;
void create_doc_view_hwnd(DocHost*) DECLSPEC_HIDDEN;
void on_commandstate_change(DocHost*,LONG,BOOL) DECLSPEC_HIDDEN;
void notify_download_state(DocHost*,BOOL) DECLSPEC_HIDDEN;
void update_navigation_commands(DocHost *dochost) DECLSPEC_HIDDEN;
#define WM_DOCHOSTTASK (WM_USER+0x300)
void push_dochost_task(DocHost*,task_header_t*,task_proc_t,task_destr_t,BOOL) DECLSPEC_HIDDEN;
void abort_dochost_tasks(DocHost*,task_proc_t) DECLSPEC_HIDDEN;
LRESULT process_dochost_tasks(DocHost*) DECLSPEC_HIDDEN;
void InternetExplorer_WebBrowser_Init(InternetExplorer*) DECLSPEC_HIDDEN;
HRESULT update_ie_statustext(InternetExplorer*, LPCWSTR) DECLSPEC_HIDDEN;
void released_obj(void) DECLSPEC_HIDDEN;
DWORD release_extern_ref(InternetExplorer*,BOOL) DECLSPEC_HIDDEN;
void register_iewindow_class(void) DECLSPEC_HIDDEN;
void unregister_iewindow_class(void) DECLSPEC_HIDDEN;
#define TID_LIST \
XCLSID(WebBrowser) \
XCLSID(WebBrowser_V1) \
XIID(IWebBrowser2)
typedef enum {
#define XIID(iface) iface ## _tid,
#define XCLSID(class) class ## _tid,
TID_LIST
#undef XIID
#undef XCLSID
LAST_tid
} tid_t;
HRESULT get_typeinfo(tid_t,ITypeInfo**) DECLSPEC_HIDDEN;
HRESULT WINAPI CUrlHistory_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
HRESULT WINAPI InternetExplorer_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
HRESULT WINAPI InternetShortcut_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
HRESULT WINAPI WebBrowser_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
HRESULT WINAPI WebBrowserV1_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
HRESULT WINAPI InternetExplorerManager_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
extern IClassFactory InternetExplorerFactory DECLSPEC_HIDDEN;
extern IClassFactory InternetExplorerManagerFactory DECLSPEC_HIDDEN;
extern LONG module_ref DECLSPEC_HIDDEN;
extern HINSTANCE ieframe_instance DECLSPEC_HIDDEN;
static inline void lock_module(void) {
InterlockedIncrement(&module_ref);
}
static inline void unlock_module(void) {
InterlockedDecrement(&module_ref);
}
static inline void* __WINE_ALLOC_SIZE(1) heap_alloc(size_t size)
{
return HeapAlloc(GetProcessHeap(), 0, size);
}
static inline void* __WINE_ALLOC_SIZE(1) heap_alloc_zero(size_t size)
{
return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
}
static inline void* __WINE_ALLOC_SIZE(2) heap_realloc(void *mem, size_t size)
{
return HeapReAlloc(GetProcessHeap(), 0, mem, size);
}
static inline BOOL heap_free(void *mem)
{
return HeapFree(GetProcessHeap(), 0, mem);
}
static inline LPWSTR heap_strdupW(LPCWSTR str)
{
LPWSTR ret = NULL;
if(str) {
DWORD size;
size = (strlenW(str)+1)*sizeof(WCHAR);
ret = heap_alloc(size);
if(ret)
memcpy(ret, str, size);
}
return ret;
}
static inline LPWSTR co_strdupW(LPCWSTR str)
{
WCHAR *ret = CoTaskMemAlloc((strlenW(str) + 1)*sizeof(WCHAR));
if (ret)
lstrcpyW(ret, str);
return ret;
}
static inline LPWSTR co_strdupAtoW(LPCSTR str)
{
INT len;
WCHAR *ret;
len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
ret = CoTaskMemAlloc(len*sizeof(WCHAR));
if (ret)
MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
return ret;
}
static inline LPSTR co_strdupWtoA(LPCWSTR str)
{
INT len;
CHAR *ret;
len = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, 0, 0);
ret = CoTaskMemAlloc(len);
if (ret)
WideCharToMultiByte(CP_ACP, 0, str, -1, ret, len, 0, 0);
return ret;
}