See https://bugs.winehq.org/show_bug.cgi?id=29709
This patchset gets RSSeditor to show its user interface before exiting, which is as much as it does on Wine with native dhtmled.ocx and native triedit.dll.
Jacek would be a good person to review these patches.
Alex Henrie (8): include: Add dhtmled.idl dhtmled.ocx: Add stub DLL and stub DHTMLEdit object dhtmled.ocx: Add IQuickActivate interface to DHTMLEdit object dhtmled.ocx: Add IViewObject interface to DHTMLEdit object dhtmled.ocx: Add IOleObject interface to DHTMLEdit object dhtmled.ocx: Add IOleControl interface to HTMLEdit object dhtmled.ocx: Add IPersistStreamInit interface to HTMLEdit object dhtmled.ocx: Add IConnectionPointContainer interface to HTMLEdit object
configure.ac | 1 + dlls/dhtmled.ocx/Makefile.in | 8 + dlls/dhtmled.ocx/dhtmled.ocx.spec | 4 + dlls/dhtmled.ocx/dhtmled_classes.idl | 39 ++ dlls/dhtmled.ocx/dhtmled_private.h | 19 + dlls/dhtmled.ocx/dhtmled_tlb.idl | 21 + dlls/dhtmled.ocx/edit.c | 1124 ++++++++++++++++++++++++++++++++++ dlls/dhtmled.ocx/main.c | 162 +++++ include/Makefile.in | 1 + include/dhtmled.idl | 330 ++++++++++ 10 files changed, 1709 insertions(+) create mode 100644 dlls/dhtmled.ocx/Makefile.in create mode 100644 dlls/dhtmled.ocx/dhtmled.ocx.spec create mode 100644 dlls/dhtmled.ocx/dhtmled_classes.idl create mode 100644 dlls/dhtmled.ocx/dhtmled_private.h create mode 100644 dlls/dhtmled.ocx/dhtmled_tlb.idl create mode 100644 dlls/dhtmled.ocx/edit.c create mode 100644 dlls/dhtmled.ocx/main.c create mode 100644 include/dhtmled.idl
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- include/Makefile.in | 1 + include/dhtmled.idl | 330 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 331 insertions(+) create mode 100644 include/dhtmled.idl
diff --git a/include/Makefile.in b/include/Makefile.in index fa1e42738b..a08c8084c1 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -58,6 +58,7 @@ IDL_SRCS = \ ddstream.idl \ devenum.idl \ devicetopology.idl \ + dhtmled.idl \ dimm.idl \ dispex.idl \ docobj.idl \ diff --git a/include/dhtmled.idl b/include/dhtmled.idl new file mode 100644 index 0000000000..0b209da38d --- /dev/null +++ b/include/dhtmled.idl @@ -0,0 +1,330 @@ +/* + * Copyright 2017 Alex Henrie + * + * 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 + */ + +import "oaidl.idl"; +import "ocidl.idl"; +import "docobj.idl"; +import "mshtml.idl"; + +[ + uuid(683364a1-b37d-11d1-adc5-006008a5848c), + version(1.0) +] +library DHTMLEDLib +{ + importlib("stdole2.tlb"); + + typedef + [ + uuid(7179FC44-B2E4-11d1-ADC5-006008A5848C) + ] + enum DHTMLEDITAPPEARANCE { + DEAPPEARANCE_FLAT, + DEAPPEARANCE_3D + } DHTMLEDITAPPEARANCE; + + typedef + [ + uuid(bf82426a-b961-11d1-adc5-006008a5848c) + ] + enum DHTMLEDITCMDF { + DECMDF_NOTSUPPORTED = 0, + DECMDF_DISABLED = 1, + DECMDF_ENABLED = 3, + DECMDF_LATCHED = 7, + DECMDF_NINCHED = 11 + } DHTMLEDITCMDF; + + typedef enum DHTMLEDITCMDID { + DECMD_BOLD = 5000, + DECMD_COPY = 5002, + DECMD_CUT, + DECMD_DELETE, + DECMD_DELETECELLS, + DECMD_DELETECOLS, + DECMD_DELETEROWS, + DECMD_FINDTEXT, + DECMD_FONT, + DECMD_GETBACKCOLOR, + DECMD_GETBLOCKFMT, + DECMD_GETBLOCKFMTNAMES, + DECMD_GETFONTNAME, + DECMD_GETFONTSIZE, + DECMD_GETFORECOLOR, + DECMD_HYPERLINK, + DECMD_IMAGE, + DECMD_INDENT, + DECMD_INSERTCELL, + DECMD_INSERTCOL, + DECMD_INSERTROW, + DECMD_INSERTTABLE, + DECMD_ITALIC, + DECMD_JUSTIFYCENTER, + DECMD_JUSTIFYLEFT, + DECMD_JUSTIFYRIGHT, + DECMD_LOCK_ELEMENT, + DECMD_MAKE_ABSOLUTE, + DECMD_MERGECELLS, + DECMD_ORDERLIST, + DECMD_OUTDENT, + DECMD_PASTE, + DECMD_REDO, + DECMD_REMOVEFORMAT, + DECMD_SELECTALL, + DECMD_SEND_BACKWARD, + DECMD_BRING_FORWARD, + DECMD_SEND_BELOW_TEXT, + DECMD_BRING_ABOVE_TEXT, + DECMD_SEND_TO_BACK, + DECMD_BRING_TO_FRONT, + DECMD_SETBACKCOLOR, + DECMD_SETBLOCKFMT, + DECMD_SETFONTNAME, + DECMD_SETFONTSIZE, + DECMD_SETFORECOLOR, + DECMD_SPLITCELL, + DECMD_UNDERLINE, + DECMD_UNDO, + DECMD_UNLINK, + DECMD_UNORDERLIST, + DECMD_PROPERTIES + } DHTMLEDITCMDID; + + [ + object, + uuid(ce04b590-2b1f-11d2-8d1e-00a0c959bc0a), + dual, + pointer_default(unique) + ] + interface IDHTMLSafe : IDispatch + { + HRESULT ExecCommand( + DHTMLEDITCMDID cmd_id, + OLECMDEXECOPT options, + VARIANT *code_in, + VARIANT *code_out + ); + + HRESULT QueryStatus( + DHTMLEDITCMDID cmd_id, + DHTMLEDITCMDF *status + ); + + HRESULT SetContextMenu( + VARIANT *strings, + VARIANT *states + ); + + HRESULT NewDocument(); + + HRESULT LoadURL(BSTR url); + + HRESULT FilterSourceCode( + BSTR in, + BSTR *out + ); + + HRESULT Refresh(); + + [propget] HRESULT DOM(IHTMLDocument2 **value); + + [propget] HRESULT DocumentHTML(BSTR *value); + [propput] HRESULT DocumentHTML(BSTR html); + + [propget] HRESULT ActivateApplets(VARIANT_BOOL *value); + [propput] HRESULT ActivateApplets(VARIANT_BOOL value); + + [propget] HRESULT ActivateActiveXControls(VARIANT_BOOL *value); + [propput] HRESULT ActivateActiveXControls(VARIANT_BOOL value); + + [propget] HRESULT ActivateDTCs(VARIANT_BOOL *value); + [propput] HRESULT ActivateDTCs(VARIANT_BOOL value); + + [propget] HRESULT ShowDetails(VARIANT_BOOL *value); + [propput] HRESULT ShowDetails(VARIANT_BOOL value); + + [propget] HRESULT ShowBorders(VARIANT_BOOL *value); + [propput] HRESULT ShowBorders(VARIANT_BOOL value); + + [propget] HRESULT Appearance(DHTMLEDITAPPEARANCE *value); + [propput] HRESULT Appearance(DHTMLEDITAPPEARANCE value); + + [propget] HRESULT Scrollbars(VARIANT_BOOL *value); + [propput] HRESULT Scrollbars(VARIANT_BOOL value); + + [propget] HRESULT ScrollbarAppearance(DHTMLEDITAPPEARANCE *value); + [propput] HRESULT ScrollbarAppearance(DHTMLEDITAPPEARANCE value); + + [propget] HRESULT SourceCodePreservation(VARIANT_BOOL *value); + [propput] HRESULT SourceCodePreservation(VARIANT_BOOL value); + + [propget] HRESULT AbsoluteDropMode(VARIANT_BOOL *value); + [propput] HRESULT AbsoluteDropMode(VARIANT_BOOL value); + + [propget] HRESULT SnapToGridX(long *value); + [propput] HRESULT SnapToGridX(long value); + + [propget] HRESULT SnapToGridY(long *value); + [propput] HRESULT SnapToGridY(long value); + + [propget] HRESULT SnapToGrid(VARIANT_BOOL *value); + [propput] HRESULT SnapToGrid(VARIANT_BOOL value); + + [propget] HRESULT IsDirty(VARIANT_BOOL *value); + + [propget] HRESULT CurrentDocumentPath(BSTR *value); + + [propget] HRESULT BaseURL(BSTR *value); + [propput] HRESULT BaseURL(BSTR value); + + [propget] HRESULT DocumentTitle(BSTR *value); + + [propget] HRESULT UseDivOnCarriageReturn(VARIANT_BOOL *value); + [propput] HRESULT UseDivOnCarriageReturn(VARIANT_BOOL value); + + [propget] HRESULT Busy(VARIANT_BOOL *value); + }; + + [ + uuid(d1fc78e8-b380-11d1-adc5-006008a5848c) + ] + dispinterface _DHTMLSafeEvents + { + properties: + methods: + void DocumentComplete(); + + void DisplayChanged(); + + void ShowContextMenu( + long x, + long y + ); + + void ContextMenuAction(long index); + + void onmousedown(); + + void onmousemove(); + + void onmouseup(); + + void onmouseout(); + + void onmouseover(); + + void onclick(); + + void ondblclick(); + + void onkeydown(); + + void onkeypress(); + + void onkeyup(); + + void onblur(); + + void onreadystatechange(); + }; + + [ + uuid(2d360201-fff5-11d1-8d03-00a0c959bc0a) + ] + coclass DHTMLSafe + { + interface IDHTMLSafe; + interface _DHTMLSafeEvents; + }; + + [ + uuid(ce04b591-2b1f-11d2-8d1e-00a0c959bc0a), + dual, + pointer_default(unique) + ] + interface IDHTMLEdit : IDHTMLSafe + { + HRESULT LoadDocument( + VARIANT *path, + VARIANT *prompt + ); + + HRESULT SaveDocument( + VARIANT *path, + VARIANT *prompt + ); + + HRESULT PrintDocument(VARIANT *prompt); + + [propget] HRESULT BrowseMode(VARIANT_BOOL *value); + + [propput] HRESULT BrowseMode(VARIANT_BOOL value); + }; + + [ + uuid(588d5040-cf28-11d1-8cd3-00a0c959bc0a) + ] + dispinterface _DHTMLEditEvents + { + properties: + methods: + void DocumentComplete(); + + void DisplayChanged(); + + void ShowContextMenu( + long x, + long y + ); + + void ContextMenuAction(long index); + + void onmousedown(); + + void onmousemove(); + + void onmouseup(); + + void onmouseout(); + + void onmouseover(); + + void onclick(); + + void ondblclick(); + + void onkeydown(); + + void onkeypress(); + + void onkeyup(); + + void onblur(); + + void onreadystatechange(); + }; + + [ + uuid(2d360200-fff5-11d1-8d03-00a0c959bc0a) + ] + coclass DHTMLEdit + { + interface IDHTMLEdit; + interface _DHTMLEditEvents; + }; +}
This should probably be extended with argument attributes.
2017-12-05 1:23 GMT-07:00 Nikolay Sivov bunglehead@gmail.com:
This should probably be extended with argument attributes.
Do [in] and [out] actually do anything?
-Alex
On 05.12.2017 11:30, Alex Henrie wrote:
2017-12-05 1:23 GMT-07:00 Nikolay Sivov bunglehead@gmail.com:
This should probably be extended with argument attributes.
Do [in] and [out] actually do anything?
They do.
-Alex
On 12/05/2017 02:44 AM, Nikolay Sivov wrote:
On 05.12.2017 11:30, Alex Henrie wrote:
2017-12-05 1:23 GMT-07:00 Nikolay Sivov bunglehead@gmail.com:
This should probably be extended with argument attributes.
Do [in] and [out] actually do anything?
They do.
-Alex
For interfaces which are marshalled they are required for widl to generate the marshalling code.
2017-12-05 8:23 GMT-07:00 Zebediah Figura z.figura12@gmail.com:
On 12/05/2017 02:44 AM, Nikolay Sivov wrote:
On 05.12.2017 11:30, Alex Henrie wrote:
2017-12-05 1:23 GMT-07:00 Nikolay Sivov bunglehead@gmail.com:
This should probably be extended with argument attributes.
Do [in] and [out] actually do anything?
They do.
For interfaces which are marshalled they are required for widl to generate the marshalling code.
Thank you. I had googled multiple times for an explanation and not found one.
-Alex
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- configure.ac | 1 + dlls/dhtmled.ocx/Makefile.in | 8 + dlls/dhtmled.ocx/dhtmled.ocx.spec | 4 + dlls/dhtmled.ocx/dhtmled_classes.idl | 39 +++ dlls/dhtmled.ocx/dhtmled_private.h | 19 ++ dlls/dhtmled.ocx/dhtmled_tlb.idl | 21 ++ dlls/dhtmled.ocx/edit.c | 534 +++++++++++++++++++++++++++++++++++ dlls/dhtmled.ocx/main.c | 162 +++++++++++ 8 files changed, 788 insertions(+) create mode 100644 dlls/dhtmled.ocx/Makefile.in create mode 100644 dlls/dhtmled.ocx/dhtmled.ocx.spec create mode 100644 dlls/dhtmled.ocx/dhtmled_classes.idl create mode 100644 dlls/dhtmled.ocx/dhtmled_private.h create mode 100644 dlls/dhtmled.ocx/dhtmled_tlb.idl create mode 100644 dlls/dhtmled.ocx/edit.c create mode 100644 dlls/dhtmled.ocx/main.c
diff --git a/configure.ac b/configure.ac index 6cba83b16d..6e4b277e16 100644 --- a/configure.ac +++ b/configure.ac @@ -3091,6 +3091,7 @@ WINE_CONFIG_TEST(dlls/ddrawex/tests) WINE_CONFIG_DLL(devenum,,[clean]) WINE_CONFIG_TEST(dlls/devenum/tests) WINE_CONFIG_DLL(dhcpcsvc) +WINE_CONFIG_DLL(dhtmled.ocx) WINE_CONFIG_DLL(difxapi) WINE_CONFIG_DLL(dinput,,[clean,implib,staticimplib]) WINE_CONFIG_TEST(dlls/dinput/tests) diff --git a/dlls/dhtmled.ocx/Makefile.in b/dlls/dhtmled.ocx/Makefile.in new file mode 100644 index 0000000000..848ac13a84 --- /dev/null +++ b/dlls/dhtmled.ocx/Makefile.in @@ -0,0 +1,8 @@ +MODULE = dhtmled.ocx +IMPORTS = uuid + +C_SRCS = \ + edit.c \ + main.c + +IDL_SRCS = dhtmled_classes.idl dhtmled_tlb.idl diff --git a/dlls/dhtmled.ocx/dhtmled.ocx.spec b/dlls/dhtmled.ocx/dhtmled.ocx.spec new file mode 100644 index 0000000000..b16365d0c9 --- /dev/null +++ b/dlls/dhtmled.ocx/dhtmled.ocx.spec @@ -0,0 +1,4 @@ +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) +@ stdcall -private DllRegisterServer() +@ stdcall -private DllUnregisterServer() diff --git a/dlls/dhtmled.ocx/dhtmled_classes.idl b/dlls/dhtmled.ocx/dhtmled_classes.idl new file mode 100644 index 0000000000..ae27c7c14a --- /dev/null +++ b/dlls/dhtmled.ocx/dhtmled_classes.idl @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Alex Henrie + * + * 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 + */ + +#pragma makedep register + +[ + uuid(2d360201-fff5-11d1-8d03-00a0c959bc0a), + threading(apartment) +] +coclass DHTMLSafe +{ + interface IDHTMLSafe; + interface _DHTMLSafeEvents; +}; + +[ + uuid(2d360200-fff5-11d1-8d03-00a0c959bc0a), + threading(apartment) +] +coclass DHTMLEdit +{ + interface IDHTMLEdit; + interface _DHTMLEditEvents; +}; diff --git a/dlls/dhtmled.ocx/dhtmled_private.h b/dlls/dhtmled.ocx/dhtmled_private.h new file mode 100644 index 0000000000..5a9e89b997 --- /dev/null +++ b/dlls/dhtmled.ocx/dhtmled_private.h @@ -0,0 +1,19 @@ +/* + * Copyright 2017 Alex Henrie + * + * 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 + */ + +extern HRESULT dhtml_edit_create(REFIID iid, void **out); diff --git a/dlls/dhtmled.ocx/dhtmled_tlb.idl b/dlls/dhtmled.ocx/dhtmled_tlb.idl new file mode 100644 index 0000000000..52bbb5bbfc --- /dev/null +++ b/dlls/dhtmled.ocx/dhtmled_tlb.idl @@ -0,0 +1,21 @@ +/* + * Copyright 2017 Alex Henrie + * + * 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 + */ + +#pragma makedep regtypelib + +#include "dhtmled.idl" diff --git a/dlls/dhtmled.ocx/edit.c b/dlls/dhtmled.ocx/edit.c new file mode 100644 index 0000000000..6e37554119 --- /dev/null +++ b/dlls/dhtmled.ocx/edit.c @@ -0,0 +1,534 @@ +/* + * Copyright 2017 Alex Henrie + * + * 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 + */ + +#define COBJMACROS + +#include "dhtmled.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dhtmled); + +typedef struct +{ + IDHTMLEdit IDHTMLEdit_iface; + LONG ref; +} DHTMLEditImpl; + +static inline DHTMLEditImpl *impl_from_IDHTMLEdit(IDHTMLEdit *iface) +{ + return CONTAINING_RECORD(iface, DHTMLEditImpl, IDHTMLEdit_iface); +} + +static HRESULT WINAPI DHTMLEdit_QueryInterface(IDHTMLEdit *iface, REFIID iid, void **out) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(iid), out); + + if (IsEqualGUID(iid, &IID_IUnknown) || + IsEqualGUID(iid, &IID_IDispatch) || + IsEqualGUID(iid, &IID_IDHTMLSafe) || + IsEqualGUID(iid, &IID_IDHTMLEdit)) + { + IUnknown_AddRef(iface); + *out = iface; + return S_OK; + } + + *out = NULL; + ERR("no interface for %s\n", debugstr_guid(iid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI DHTMLEdit_AddRef(IDHTMLEdit *iface) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + return ref; +} + +static ULONG WINAPI DHTMLEdit_Release(IDHTMLEdit *iface) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if (!ref) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + +static HRESULT WINAPI DHTMLEdit_GetTypeInfoCount(IDHTMLEdit *iface, UINT *count) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, count); + *count = 0; + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_GetTypeInfo(IDHTMLEdit *iface, UINT type_index, LCID lcid, ITypeInfo **type_info) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%u, %08x, %p) stub\n", This, type_index, lcid, type_info); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_GetIDsOfNames(IDHTMLEdit *iface, REFIID iid, OLECHAR **names, UINT name_count, + LCID lcid, DISPID *disp_ids) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%s, %p, %u, %08x, %p) stub\n", This, debugstr_guid(iid), names, name_count, lcid, disp_ids); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_Invoke(IDHTMLEdit *iface, DISPID member, REFIID iid, LCID lcid, WORD flags, + DISPPARAMS *params, VARIANT *ret, EXCEPINFO *exception_info, UINT *error_index) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%d, %s, %08x, 0x%x, %p, %p, %p, %p) stub\n", + This, member, debugstr_guid(iid), lcid, flags, params, ret, exception_info, error_index); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_ExecCommand(IDHTMLEdit *iface, DHTMLEDITCMDID cmd_id, OLECMDEXECOPT options, + VARIANT *code_in, VARIANT *code_out) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%u, %u, %s, %p) stub\n", This, cmd_id, options, debugstr_variant(code_in), code_out); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_QueryStatus(IDHTMLEdit *iface, DHTMLEDITCMDID cmd_id, DHTMLEDITCMDF *status) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%u, %p) stub\n", This, cmd_id, status); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_SetContextMenu(IDHTMLEdit *iface, VARIANT *strings, VARIANT *states) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p, %p) stub\n", This, strings, states); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_NewDocument(IDHTMLEdit *iface) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->() stub\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_LoadURL(IDHTMLEdit *iface, BSTR url) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(url)); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_FilterSourceCode(IDHTMLEdit *iface, BSTR in, BSTR *out) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%s, %p)\n", This, debugstr_w(in), out); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_Refresh(IDHTMLEdit *iface) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->() stub\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_DOM(IDHTMLEdit *iface, IHTMLDocument2 **value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_DocumentHTML(IDHTMLEdit *iface, BSTR *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_DocumentHTML(IDHTMLEdit *iface, BSTR html) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%s) stub\n", This, debugstr_w(html)); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_ActivateApplets(IDHTMLEdit *iface, VARIANT_BOOL *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_ActivateApplets(IDHTMLEdit *iface, VARIANT_BOOL value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%04x) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_ActivateActiveXControls(IDHTMLEdit *iface, VARIANT_BOOL *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_ActivateActiveXControls(IDHTMLEdit *iface, VARIANT_BOOL value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%04x) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_ActivateDTCs(IDHTMLEdit *iface, VARIANT_BOOL *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_ActivateDTCs(IDHTMLEdit *iface, VARIANT_BOOL value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%04x) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_ShowDetails(IDHTMLEdit *iface, VARIANT_BOOL *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_ShowDetails(IDHTMLEdit *iface, VARIANT_BOOL value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%04x) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_ShowBorders(IDHTMLEdit *iface, VARIANT_BOOL *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_ShowBorders(IDHTMLEdit *iface, VARIANT_BOOL value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%04x) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_Appearance(IDHTMLEdit *iface, DHTMLEDITAPPEARANCE *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_Appearance(IDHTMLEdit *iface, DHTMLEDITAPPEARANCE value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%u) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_Scrollbars(IDHTMLEdit *iface, VARIANT_BOOL *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_Scrollbars(IDHTMLEdit *iface, VARIANT_BOOL value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%04x) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_ScrollbarAppearance(IDHTMLEdit *iface, DHTMLEDITAPPEARANCE *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_ScrollbarAppearance(IDHTMLEdit *iface, DHTMLEDITAPPEARANCE value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%u) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_SourceCodePreservation(IDHTMLEdit *iface, VARIANT_BOOL *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_SourceCodePreservation(IDHTMLEdit *iface, VARIANT_BOOL value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%04x) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_AbsoluteDropMode(IDHTMLEdit *iface, VARIANT_BOOL *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_AbsoluteDropMode(IDHTMLEdit *iface, VARIANT_BOOL value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%04x) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_SnapToGridX(IDHTMLEdit *iface, LONG *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_SnapToGridX(IDHTMLEdit *iface, LONG value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%d) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_SnapToGridY(IDHTMLEdit *iface, LONG *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_SnapToGridY(IDHTMLEdit *iface, LONG value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%d) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_SnapToGrid(IDHTMLEdit *iface, VARIANT_BOOL *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_SnapToGrid(IDHTMLEdit *iface, VARIANT_BOOL value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%04x) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_IsDirty(IDHTMLEdit *iface, VARIANT_BOOL *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_CurrentDocumentPath(IDHTMLEdit *iface, BSTR *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_BaseURL(IDHTMLEdit *iface, BSTR *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_BaseURL(IDHTMLEdit *iface, BSTR value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%s) stub\n", This, debugstr_w(value)); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_DocumentTitle(IDHTMLEdit *iface, BSTR *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_UseDivOnCarriageReturn(IDHTMLEdit *iface, VARIANT_BOOL *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_UseDivOnCarriageReturn(IDHTMLEdit *iface, VARIANT_BOOL value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%04x) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_Busy(IDHTMLEdit *iface, VARIANT_BOOL *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_LoadDocument(IDHTMLEdit *iface, VARIANT *path, VARIANT *prompt) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%s, %s) stub\n", This, debugstr_variant(path), debugstr_variant(prompt)); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_SaveDocument(IDHTMLEdit *iface, VARIANT *path, VARIANT *prompt) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%s, %s) stub\n", This, debugstr_variant(path), debugstr_variant(prompt)); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_PrintDocument(IDHTMLEdit *iface, VARIANT *prompt) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%s) stub\n", This, debugstr_variant(prompt)); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_get_BrowseMode(IDHTMLEdit *iface, VARIANT_BOOL *value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI DHTMLEdit_put_BrowseMode(IDHTMLEdit *iface, VARIANT_BOOL value) +{ + DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + FIXME("(%p)->(%04x) stub\n", This, value); + return E_NOTIMPL; +} + +static const IDHTMLEditVtbl DHTMLEditVtbl = { + DHTMLEdit_QueryInterface, + DHTMLEdit_AddRef, + DHTMLEdit_Release, + DHTMLEdit_GetTypeInfoCount, + DHTMLEdit_GetTypeInfo, + DHTMLEdit_GetIDsOfNames, + DHTMLEdit_Invoke, + DHTMLEdit_ExecCommand, + DHTMLEdit_QueryStatus, + DHTMLEdit_SetContextMenu, + DHTMLEdit_NewDocument, + DHTMLEdit_LoadURL, + DHTMLEdit_FilterSourceCode, + DHTMLEdit_Refresh, + DHTMLEdit_get_DOM, + DHTMLEdit_get_DocumentHTML, + DHTMLEdit_put_DocumentHTML, + DHTMLEdit_get_ActivateApplets, + DHTMLEdit_put_ActivateApplets, + DHTMLEdit_get_ActivateActiveXControls, + DHTMLEdit_put_ActivateActiveXControls, + DHTMLEdit_get_ActivateDTCs, + DHTMLEdit_put_ActivateDTCs, + DHTMLEdit_get_ShowDetails, + DHTMLEdit_put_ShowDetails, + DHTMLEdit_get_ShowBorders, + DHTMLEdit_put_ShowBorders, + DHTMLEdit_get_Appearance, + DHTMLEdit_put_Appearance, + DHTMLEdit_get_Scrollbars, + DHTMLEdit_put_Scrollbars, + DHTMLEdit_get_ScrollbarAppearance, + DHTMLEdit_put_ScrollbarAppearance, + DHTMLEdit_get_SourceCodePreservation, + DHTMLEdit_put_SourceCodePreservation, + DHTMLEdit_get_AbsoluteDropMode, + DHTMLEdit_put_AbsoluteDropMode, + DHTMLEdit_get_SnapToGridX, + DHTMLEdit_put_SnapToGridX, + DHTMLEdit_get_SnapToGridY, + DHTMLEdit_put_SnapToGridY, + DHTMLEdit_get_SnapToGrid, + DHTMLEdit_put_SnapToGrid, + DHTMLEdit_get_IsDirty, + DHTMLEdit_get_CurrentDocumentPath, + DHTMLEdit_get_BaseURL, + DHTMLEdit_put_BaseURL, + DHTMLEdit_get_DocumentTitle, + DHTMLEdit_get_UseDivOnCarriageReturn, + DHTMLEdit_put_UseDivOnCarriageReturn, + DHTMLEdit_get_Busy, + DHTMLEdit_LoadDocument, + DHTMLEdit_SaveDocument, + DHTMLEdit_PrintDocument, + DHTMLEdit_get_BrowseMode, + DHTMLEdit_put_BrowseMode +}; + +HRESULT dhtml_edit_create(REFIID iid, void **out) +{ + DHTMLEditImpl *This; + + TRACE("(%s, %p)\n", debugstr_guid(iid), out); + + *out = NULL; + + This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This)); + if (!This) + return E_OUTOFMEMORY; + + This->IDHTMLEdit_iface.lpVtbl = &DHTMLEditVtbl; + This->ref = 1; + + *out = &This->IDHTMLEdit_iface; + return S_OK; +} diff --git a/dlls/dhtmled.ocx/main.c b/dlls/dhtmled.ocx/main.c new file mode 100644 index 0000000000..4640884934 --- /dev/null +++ b/dlls/dhtmled.ocx/main.c @@ -0,0 +1,162 @@ +/* + * Dynamic HyperText Markup Language Editing Control + * + * Copyright 2017 Alex Henrie + * + * 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 + */ + +#define COBJMACROS + +#include "initguid.h" +#include "dhtmled.h" +#include "dhtmled_private.h" +#include "rpcproxy.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dhtmled); + +typedef struct +{ + IClassFactory IClassFactory_iface; + HRESULT (*create)(REFIID iid, void **out); +} ClassFactoryImpl; + +static inline ClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface) +{ + return CONTAINING_RECORD(iface, ClassFactoryImpl, IClassFactory_iface); +} + +static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID iid, void **out) +{ + TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(iid), out); + + if (IsEqualGUID(&IID_IUnknown, iid) || IsEqualGUID(&IID_IClassFactory, iid)) + { + *out = iface; + IClassFactory_AddRef(iface); + return S_OK; + } + + *out = NULL; + WARN("no interface for %s\n", debugstr_guid(iid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) +{ + return 2; /* non-heap based object */ +} + +static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) +{ + return 1; /* non-heap based object */ +} + +static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID iid, void **out) +{ + ClassFactoryImpl *This = impl_from_IClassFactory(iface); + + TRACE("(%p)->(%p, %s, %p)\n", iface, outer, debugstr_guid(iid), out); + + if (outer) + return CLASS_E_NOAGGREGATION; + + return This->create(iid, out); +} + +static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL lock) +{ + TRACE("(%p)->(%x)\n", iface, lock); + return S_OK; +} + +static const IClassFactoryVtbl ClassFactoryVtbl = { + ClassFactory_QueryInterface, + ClassFactory_AddRef, + ClassFactory_Release, + ClassFactory_CreateInstance, + ClassFactory_LockServer +}; + +static HINSTANCE dhtmled_instance; + +/****************************************************************** + * DllMain (dhtmled.ocx.@) + */ +BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, VOID *reserved) +{ + TRACE("(%p, %u, %p)\n", instance, reason, reserved); + + switch (reason) + { + case DLL_WINE_PREATTACH: + /* Applications that use dhtmled.ocx usually install and register it + * themselves, but do not install its dependency triedit.dll. + * Because Wine's (currently nonexistent) triedit.dll implementation + * is not sufficient for native dhtmled.ocx, prefer our own. */ + return TRUE; + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(instance); + dhtmled_instance = instance; + break; + } + + return TRUE; +} + +/*********************************************************************** + * DllGetClassObject (dhtmled.ocx.@) + */ +HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID *out) +{ + static ClassFactoryImpl dhtml_edit_cf = { {&ClassFactoryVtbl}, dhtml_edit_create }; + + TRACE("(%s, %s, %p)\n", debugstr_guid(clsid), debugstr_guid(iid), out); + + if (IsEqualGUID(clsid, &CLSID_DHTMLEdit)) + return IClassFactory_QueryInterface(&dhtml_edit_cf.IClassFactory_iface, iid, out); + + FIXME("no class for %s\n", debugstr_guid(clsid)); + return CLASS_E_CLASSNOTAVAILABLE; +} + +/*********************************************************************** + * DllCanUnloadNow (dhtmled.ocx.@) + */ +HRESULT WINAPI DllCanUnloadNow(void) +{ + TRACE("()\n"); + return S_FALSE; +} + +/*********************************************************************** + * DllRegisterServer (dhtmled.ocx.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + TRACE("()\n"); + return __wine_register_resources(dhtmled_instance); +} + +/*********************************************************************** + * DllUnregisterServer (dhtmled.ocx.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + TRACE("()\n"); + return __wine_unregister_resources(dhtmled_instance); +}
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/dhtmled.ocx/edit.c | 100 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 85 insertions(+), 15 deletions(-)
diff --git a/dlls/dhtmled.ocx/edit.c b/dlls/dhtmled.ocx/edit.c index 6e37554119..49580f3840 100644 --- a/dlls/dhtmled.ocx/edit.c +++ b/dlls/dhtmled.ocx/edit.c @@ -27,6 +27,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(dhtmled); typedef struct { IDHTMLEdit IDHTMLEdit_iface; + IQuickActivate IQuickActivate_iface; LONG ref; } DHTMLEditImpl;
@@ -35,10 +36,22 @@ static inline DHTMLEditImpl *impl_from_IDHTMLEdit(IDHTMLEdit *iface) return CONTAINING_RECORD(iface, DHTMLEditImpl, IDHTMLEdit_iface); }
-static HRESULT WINAPI DHTMLEdit_QueryInterface(IDHTMLEdit *iface, REFIID iid, void **out) +static inline DHTMLEditImpl *impl_from_IQuickActivate(IQuickActivate *iface) { - DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); + return CONTAINING_RECORD(iface, DHTMLEditImpl, IQuickActivate_iface); +} + +static HRESULT dhtml_edit_addref(DHTMLEditImpl *This) +{ + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref);
+ return ref; +} + +static HRESULT dhtml_edit_qi(DHTMLEditImpl *This, REFIID iid, void **out) +{ TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(iid), out);
if (IsEqualGUID(iid, &IID_IUnknown) || @@ -46,8 +59,14 @@ static HRESULT WINAPI DHTMLEdit_QueryInterface(IDHTMLEdit *iface, REFIID iid, vo IsEqualGUID(iid, &IID_IDHTMLSafe) || IsEqualGUID(iid, &IID_IDHTMLEdit)) { - IUnknown_AddRef(iface); - *out = iface; + dhtml_edit_addref(This); + *out = &This->IDHTMLEdit_iface; + return S_OK; + } + else if (IsEqualGUID(iid, &IID_IQuickActivate)) + { + dhtml_edit_addref(This); + *out = &This->IQuickActivate_iface; return S_OK; }
@@ -56,27 +75,31 @@ static HRESULT WINAPI DHTMLEdit_QueryInterface(IDHTMLEdit *iface, REFIID iid, vo return E_NOINTERFACE; }
-static ULONG WINAPI DHTMLEdit_AddRef(IDHTMLEdit *iface) +static HRESULT dhtml_edit_release(DHTMLEditImpl *This) { - DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); - LONG ref = InterlockedIncrement(&This->ref); + LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
+ if (!ref) + HeapFree(GetProcessHeap(), 0, This); + return ref; }
-static ULONG WINAPI DHTMLEdit_Release(IDHTMLEdit *iface) +static HRESULT WINAPI DHTMLEdit_QueryInterface(IDHTMLEdit *iface, REFIID iid, void **out) { - DHTMLEditImpl *This = impl_from_IDHTMLEdit(iface); - LONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) ref=%d\n", This, ref); + return dhtml_edit_qi(impl_from_IDHTMLEdit(iface), iid, out); +}
- if (!ref) - HeapFree(GetProcessHeap(), 0, This); +static ULONG WINAPI DHTMLEdit_AddRef(IDHTMLEdit *iface) +{ + return dhtml_edit_addref(impl_from_IDHTMLEdit(iface)); +}
- return ref; +static ULONG WINAPI DHTMLEdit_Release(IDHTMLEdit *iface) +{ + return dhtml_edit_release(impl_from_IDHTMLEdit(iface)); }
static HRESULT WINAPI DHTMLEdit_GetTypeInfoCount(IDHTMLEdit *iface, UINT *count) @@ -514,6 +537,52 @@ static const IDHTMLEditVtbl DHTMLEditVtbl = { DHTMLEdit_put_BrowseMode };
+static HRESULT WINAPI QuickActivate_QueryInterface(IQuickActivate *iface, REFIID iid, void **out) +{ + return dhtml_edit_qi(impl_from_IQuickActivate(iface), iid, out); +} + +static ULONG WINAPI QuickActivate_AddRef(IQuickActivate *iface) +{ + return dhtml_edit_addref(impl_from_IQuickActivate(iface)); +} + +static ULONG WINAPI QuickActivate_Release(IQuickActivate *iface) +{ + return dhtml_edit_release(impl_from_IQuickActivate(iface)); +} + +static HRESULT WINAPI QuickActivate_QuickActivate(IQuickActivate *iface, + QACONTAINER *container_info, QACONTROL *control_info) +{ + DHTMLEditImpl *This = impl_from_IQuickActivate(iface); + FIXME("(%p)->(%p, %p) stub\n", This, container_info, control_info); + return S_OK; +} + +static HRESULT WINAPI QuickActivate_GetContentExtent(IQuickActivate *iface, SIZEL *value) +{ + DHTMLEditImpl *This = impl_from_IQuickActivate(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI QuickActivate_SetContentExtent(IQuickActivate *iface, SIZEL *value) +{ + DHTMLEditImpl *This = impl_from_IQuickActivate(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static const IQuickActivateVtbl QuickActivateVtbl = { + QuickActivate_QueryInterface, + QuickActivate_AddRef, + QuickActivate_Release, + QuickActivate_QuickActivate, + QuickActivate_GetContentExtent, + QuickActivate_SetContentExtent +}; + HRESULT dhtml_edit_create(REFIID iid, void **out) { DHTMLEditImpl *This; @@ -527,6 +596,7 @@ HRESULT dhtml_edit_create(REFIID iid, void **out) return E_OUTOFMEMORY;
This->IDHTMLEdit_iface.lpVtbl = &DHTMLEditVtbl; + This->IQuickActivate_iface.lpVtbl = &QuickActivateVtbl; This->ref = 1;
*out = &This->IDHTMLEdit_iface;
Hi Alex,
On 12/05/2017 09:10 AM, Alex Henrie wrote:
typedef struct { IDHTMLEdit IDHTMLEdit_iface;
- IQuickActivate IQuickActivate_iface;
What version did you test it with? As far as I can see, native doesn't implement this interface.
Jacek
2018-02-06 9:54 GMT-07:00 Jacek Caban jacek@codeweavers.com:
Hi Alex,
On 12/05/2017 09:10 AM, Alex Henrie wrote:
typedef struct { IDHTMLEdit IDHTMLEdit_iface;
- IQuickActivate IQuickActivate_iface;
What version did you test it with? As far as I can see, native doesn't implement this interface.
Thanks for catching that. You're right: The DHTMLEdit class does not implement IQuickActivate. I was confused because RSSEdit queries for this interface.
After more testing, I realized that we actually only need to add IOleObject and IPersistStreamInit to get RSSEdit's GUI to appear. Native DHTMLEdit implements IViewObject, IOleControl, and IConnectionPointContainer too, but they do not appear to be necessary for basic functionality.
-Alex
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/dhtmled.ocx/edit.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+)
diff --git a/dlls/dhtmled.ocx/edit.c b/dlls/dhtmled.ocx/edit.c index 49580f3840..e2a1c38ee7 100644 --- a/dlls/dhtmled.ocx/edit.c +++ b/dlls/dhtmled.ocx/edit.c @@ -28,6 +28,7 @@ typedef struct { IDHTMLEdit IDHTMLEdit_iface; IQuickActivate IQuickActivate_iface; + IViewObject IViewObject_iface; LONG ref; } DHTMLEditImpl;
@@ -41,6 +42,11 @@ static inline DHTMLEditImpl *impl_from_IQuickActivate(IQuickActivate *iface) return CONTAINING_RECORD(iface, DHTMLEditImpl, IQuickActivate_iface); }
+static inline DHTMLEditImpl *impl_from_IViewObject(IViewObject *iface) +{ + return CONTAINING_RECORD(iface, DHTMLEditImpl, IViewObject_iface); +} + static HRESULT dhtml_edit_addref(DHTMLEditImpl *This) { LONG ref = InterlockedIncrement(&This->ref); @@ -69,6 +75,12 @@ static HRESULT dhtml_edit_qi(DHTMLEditImpl *This, REFIID iid, void **out) *out = &This->IQuickActivate_iface; return S_OK; } + else if (IsEqualGUID(iid, &IID_IViewObject)) + { + dhtml_edit_addref(This); + *out = &This->IViewObject_iface; + return S_OK; + }
*out = NULL; ERR("no interface for %s\n", debugstr_guid(iid)); @@ -583,6 +595,85 @@ static const IQuickActivateVtbl QuickActivateVtbl = { QuickActivate_SetContentExtent };
+static HRESULT WINAPI ViewObject_QueryInterface(IViewObject *iface, REFIID iid, void **out) +{ + return dhtml_edit_qi(impl_from_IViewObject(iface), iid, out); +} + +static ULONG WINAPI ViewObject_AddRef(IViewObject *iface) +{ + return dhtml_edit_addref(impl_from_IViewObject(iface)); +} + +static ULONG WINAPI ViewObject_Release(IViewObject *iface) +{ + return dhtml_edit_release(impl_from_IViewObject(iface)); +} + +static HRESULT WINAPI ViewObject_Draw(IViewObject *iface, DWORD aspect, LONG index, void *aspect_info, + DVTARGETDEVICE *target, HDC target_context, HDC draw_context, + const RECTL *bounds, const RECTL *metabounds, + BOOL WINAPI (*callback)(ULONG_PTR), ULONG_PTR callback_arg) +{ + DHTMLEditImpl *This = impl_from_IViewObject(iface); + FIXME("(%p)->(%u, %d, %p, %p, %p, %p, %p, %p, %p, %lu) stub\n", This, aspect, index, aspect_info, + target, target_context, draw_context, bounds, metabounds, callback, callback_arg); + return E_NOTIMPL; +} + +static HRESULT WINAPI ViewObject_GetColorSet(IViewObject *iface, DWORD aspect, LONG index, void *aspect_info, + DVTARGETDEVICE *target, HDC target_context, LOGPALETTE **value) +{ + DHTMLEditImpl *This = impl_from_IViewObject(iface); + FIXME("(%p)->(%u, %d, %p, %p, %p, %p) stub\n", This, aspect, index, aspect_info, target, target_context, value); + *value = NULL; + return E_NOTIMPL; +} + +static HRESULT WINAPI ViewObject_Freeze(IViewObject *iface, DWORD aspect, LONG index, void *aspect_info, DWORD *token) +{ + DHTMLEditImpl *This = impl_from_IViewObject(iface); + FIXME("(%p)->(%u, %d, %p, %p) stub\n", This, aspect, index, aspect_info, token); + *token = 0; + return E_NOTIMPL; +} + +static HRESULT WINAPI ViewObject_Unfreeze(IViewObject *iface, DWORD token) +{ + DHTMLEditImpl *This = impl_from_IViewObject(iface); + FIXME("(%p)->(%u) stub\n", This, token); + return E_NOTIMPL; +} + +static HRESULT WINAPI ViewObject_SetAdvise(IViewObject *iface, DWORD aspects, DWORD flags, IAdviseSink *value) +{ + DHTMLEditImpl *This = impl_from_IViewObject(iface); + FIXME("(%p)->(%u, %u, %p) stub\n", This, aspects, flags, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI ViewObject_GetAdvise(IViewObject *iface, DWORD *aspects, DWORD *flags, IAdviseSink **value) +{ + DHTMLEditImpl *This = impl_from_IViewObject(iface); + FIXME("(%p)->(%p, %p, %p) stub\n", This, aspects, flags, value); + if (aspects) *aspects = 0; + if (flags) *flags = 0; + *value = NULL; + return E_NOTIMPL; +} + +static const IViewObjectVtbl ViewObjectVtbl = { + ViewObject_QueryInterface, + ViewObject_AddRef, + ViewObject_Release, + ViewObject_Draw, + ViewObject_GetColorSet, + ViewObject_Freeze, + ViewObject_Unfreeze, + ViewObject_SetAdvise, + ViewObject_GetAdvise +}; + HRESULT dhtml_edit_create(REFIID iid, void **out) { DHTMLEditImpl *This; @@ -597,6 +688,7 @@ HRESULT dhtml_edit_create(REFIID iid, void **out)
This->IDHTMLEdit_iface.lpVtbl = &DHTMLEditVtbl; This->IQuickActivate_iface.lpVtbl = &QuickActivateVtbl; + This->IViewObject_iface.lpVtbl = &ViewObjectVtbl; This->ref = 1;
*out = &This->IDHTMLEdit_iface;
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/dhtmled.ocx/edit.c | 226 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 225 insertions(+), 1 deletion(-)
diff --git a/dlls/dhtmled.ocx/edit.c b/dlls/dhtmled.ocx/edit.c index e2a1c38ee7..804c32dfb7 100644 --- a/dlls/dhtmled.ocx/edit.c +++ b/dlls/dhtmled.ocx/edit.c @@ -29,6 +29,8 @@ typedef struct IDHTMLEdit IDHTMLEdit_iface; IQuickActivate IQuickActivate_iface; IViewObject IViewObject_iface; + IOleObject IOleObject_iface; + IOleClientSite *client_site; LONG ref; } DHTMLEditImpl;
@@ -47,6 +49,11 @@ static inline DHTMLEditImpl *impl_from_IViewObject(IViewObject *iface) return CONTAINING_RECORD(iface, DHTMLEditImpl, IViewObject_iface); }
+static inline DHTMLEditImpl *impl_from_IOleObject(IOleObject *iface) +{ + return CONTAINING_RECORD(iface, DHTMLEditImpl, IOleObject_iface); +} + static HRESULT dhtml_edit_addref(DHTMLEditImpl *This) { LONG ref = InterlockedIncrement(&This->ref); @@ -81,6 +88,12 @@ static HRESULT dhtml_edit_qi(DHTMLEditImpl *This, REFIID iid, void **out) *out = &This->IViewObject_iface; return S_OK; } + else if (IsEqualGUID(iid, &IID_IOleObject)) + { + dhtml_edit_addref(This); + *out = &This->IOleObject_iface; + return S_OK; + }
*out = NULL; ERR("no interface for %s\n", debugstr_guid(iid)); @@ -568,7 +581,11 @@ static HRESULT WINAPI QuickActivate_QuickActivate(IQuickActivate *iface, QACONTAINER *container_info, QACONTROL *control_info) { DHTMLEditImpl *This = impl_from_IQuickActivate(iface); - FIXME("(%p)->(%p, %p) stub\n", This, container_info, control_info); + + FIXME("(%p)->(%p, %p) semi-stub\n", This, container_info, control_info); + + This->client_site = container_info->pClientSite; + return S_OK; }
@@ -674,6 +691,212 @@ static const IViewObjectVtbl ViewObjectVtbl = { ViewObject_GetAdvise };
+static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID iid, void **out) +{ + return dhtml_edit_qi(impl_from_IOleObject(iface), iid, out); +} + +static ULONG WINAPI OleObject_AddRef(IOleObject *iface) +{ + return dhtml_edit_addref(impl_from_IOleObject(iface)); +} + +static ULONG WINAPI OleObject_Release(IOleObject *iface) +{ + return dhtml_edit_release(impl_from_IOleObject(iface)); +} + +static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *value) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return S_OK; +} + +static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **value) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p) stub\n", This, value); + *value = NULL; + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, + const OLECHAR *container_app, const OLECHAR *container_obj) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p, %p) stub\n", This, container_app, container_obj); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD save) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%u) stub\n", This, save); + return S_OK; +} + +static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD moniker_id, IMoniker *value) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%u, %p) stub\n", This, moniker_id, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD assign, DWORD moniker_id, IMoniker **value) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%u, %p) stub\n", This, moniker_id, value); + *value = NULL; + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *data_obj, BOOL creation, DWORD reserved) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p, %u, %u) stub\n", This, data_obj, creation, reserved); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD reserved, IDataObject **value) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%u, %p) stub\n", This, reserved, value); + *value = NULL; + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG verb, MSG *msg, IOleClientSite *active_site, + LONG index, HWND parent, const RECT *pos) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + TRACE("(%p)->(%d, %p, %p, %d, %p, %p) stub\n", This, verb, msg, active_site, index, parent, pos); + + if (verb == OLEIVERB_INPLACEACTIVATE) + { + IOleClientSite_OnShowWindow(This->client_site, TRUE); + return S_OK; + } + + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **verb) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p) stub\n", This, verb); + *verb = NULL; + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_Update(IOleObject *iface) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p) stub\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p) stub\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *clsid) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p) stub\n", This, clsid); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD type_type, OLECHAR **type) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%u, %p) stub\n", This, type_type, type); + *type = NULL; + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD aspect, SIZEL *size_limit) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%u, %p) stub\n", This, aspect, size_limit); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD aspect, SIZEL *size_limit) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%u, %p) stub\n", This, aspect, size_limit); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *sink, DWORD *conn) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p, %p) stub\n", This, sink, conn); + *conn = 0; + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD conn) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%u) stub\n", This, conn); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **advise) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p) stub\n", This, advise); + *advise = NULL; + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD aspect, DWORD *status) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%u, %p) stub\n", This, aspect, status); + *status = 0; + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *palette) +{ + DHTMLEditImpl *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p) stub\n", This, palette); + return E_NOTIMPL; +} + +static const IOleObjectVtbl OleObjectVtbl = { + OleObject_QueryInterface, + OleObject_AddRef, + OleObject_Release, + OleObject_SetClientSite, + OleObject_GetClientSite, + OleObject_SetHostNames, + OleObject_Close, + OleObject_SetMoniker, + OleObject_GetMoniker, + OleObject_InitFromData, + OleObject_GetClipboardData, + OleObject_DoVerb, + OleObject_EnumVerbs, + OleObject_Update, + OleObject_IsUpToDate, + OleObject_GetUserClassID, + OleObject_GetUserType, + OleObject_SetExtent, + OleObject_GetExtent, + OleObject_Advise, + OleObject_Unadvise, + OleObject_EnumAdvise, + OleObject_GetMiscStatus, + OleObject_SetColorScheme +}; + HRESULT dhtml_edit_create(REFIID iid, void **out) { DHTMLEditImpl *This; @@ -689,6 +912,7 @@ HRESULT dhtml_edit_create(REFIID iid, void **out) This->IDHTMLEdit_iface.lpVtbl = &DHTMLEditVtbl; This->IQuickActivate_iface.lpVtbl = &QuickActivateVtbl; This->IViewObject_iface.lpVtbl = &ViewObjectVtbl; + This->IOleObject_iface.lpVtbl = &OleObjectVtbl; This->ref = 1;
*out = &This->IDHTMLEdit_iface;
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/dhtmled.ocx/edit.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+)
diff --git a/dlls/dhtmled.ocx/edit.c b/dlls/dhtmled.ocx/edit.c index 804c32dfb7..80ec00614d 100644 --- a/dlls/dhtmled.ocx/edit.c +++ b/dlls/dhtmled.ocx/edit.c @@ -30,6 +30,7 @@ typedef struct IQuickActivate IQuickActivate_iface; IViewObject IViewObject_iface; IOleObject IOleObject_iface; + IOleControl IOleControl_iface; IOleClientSite *client_site; LONG ref; } DHTMLEditImpl; @@ -54,6 +55,11 @@ static inline DHTMLEditImpl *impl_from_IOleObject(IOleObject *iface) return CONTAINING_RECORD(iface, DHTMLEditImpl, IOleObject_iface); }
+static inline DHTMLEditImpl *impl_from_IOleControl(IOleControl *iface) +{ + return CONTAINING_RECORD(iface, DHTMLEditImpl, IOleControl_iface); +} + static HRESULT dhtml_edit_addref(DHTMLEditImpl *This) { LONG ref = InterlockedIncrement(&This->ref); @@ -94,6 +100,12 @@ static HRESULT dhtml_edit_qi(DHTMLEditImpl *This, REFIID iid, void **out) *out = &This->IOleObject_iface; return S_OK; } + else if (IsEqualGUID(iid, &IID_IOleControl)) + { + dhtml_edit_addref(This); + *out = &This->IOleControl_iface; + return S_OK; + }
*out = NULL; ERR("no interface for %s\n", debugstr_guid(iid)); @@ -897,6 +909,59 @@ static const IOleObjectVtbl OleObjectVtbl = { OleObject_SetColorScheme };
+static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID iid, void **out) +{ + return dhtml_edit_qi(impl_from_IOleControl(iface), iid, out); +} + +static ULONG WINAPI OleControl_AddRef(IOleControl *iface) +{ + return dhtml_edit_addref(impl_from_IOleControl(iface)); +} + +static ULONG WINAPI OleControl_Release(IOleControl *iface) +{ + return dhtml_edit_release(impl_from_IOleControl(iface)); +} + +static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL freeze) +{ + DHTMLEditImpl *This = impl_from_IOleControl(iface); + FIXME("(%p)->(%u) stub\n", This, freeze); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *value) +{ + DHTMLEditImpl *This = impl_from_IOleControl(iface); + FIXME("(%p)->(%p) stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID disp_id) +{ + DHTMLEditImpl *This = impl_from_IOleControl(iface); + FIXME("(%p)->(%d) stub\n", This, disp_id); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *msg) +{ + DHTMLEditImpl *This = impl_from_IOleControl(iface); + FIXME("(%p)->(%p) stub\n", This, msg); + return E_NOTIMPL; +} + +static const IOleControlVtbl OleControlVtbl = { + OleControl_QueryInterface, + OleControl_AddRef, + OleControl_Release, + OleControl_GetControlInfo, + OleControl_OnMnemonic, + OleControl_FreezeEvents, + OleControl_OnAmbientPropertyChange +}; + HRESULT dhtml_edit_create(REFIID iid, void **out) { DHTMLEditImpl *This; @@ -913,6 +978,7 @@ HRESULT dhtml_edit_create(REFIID iid, void **out) This->IQuickActivate_iface.lpVtbl = &QuickActivateVtbl; This->IViewObject_iface.lpVtbl = &ViewObjectVtbl; This->IOleObject_iface.lpVtbl = &OleObjectVtbl; + This->IOleControl_iface.lpVtbl = &OleControlVtbl; This->ref = 1;
*out = &This->IDHTMLEdit_iface;
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/dhtmled.ocx/edit.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+)
diff --git a/dlls/dhtmled.ocx/edit.c b/dlls/dhtmled.ocx/edit.c index 80ec00614d..c68e9d62fd 100644 --- a/dlls/dhtmled.ocx/edit.c +++ b/dlls/dhtmled.ocx/edit.c @@ -31,6 +31,7 @@ typedef struct IViewObject IViewObject_iface; IOleObject IOleObject_iface; IOleControl IOleControl_iface; + IPersistStreamInit IPersistStreamInit_iface; IOleClientSite *client_site; LONG ref; } DHTMLEditImpl; @@ -60,6 +61,11 @@ static inline DHTMLEditImpl *impl_from_IOleControl(IOleControl *iface) return CONTAINING_RECORD(iface, DHTMLEditImpl, IOleControl_iface); }
+static inline DHTMLEditImpl *impl_from_IPersistStreamInit(IPersistStreamInit *iface) +{ + return CONTAINING_RECORD(iface, DHTMLEditImpl, IPersistStreamInit_iface); +} + static HRESULT dhtml_edit_addref(DHTMLEditImpl *This) { LONG ref = InterlockedIncrement(&This->ref); @@ -106,6 +112,13 @@ static HRESULT dhtml_edit_qi(DHTMLEditImpl *This, REFIID iid, void **out) *out = &This->IOleControl_iface; return S_OK; } + else if (IsEqualGUID(iid, &IID_IPersistStreamInit) || + IsEqualGUID(iid, &IID_IPersistStream)) + { + dhtml_edit_addref(This); + *out = &This->IPersistStreamInit_iface; + return S_OK; + }
*out = NULL; ERR("no interface for %s\n", debugstr_guid(iid)); @@ -962,6 +975,76 @@ static const IOleControlVtbl OleControlVtbl = { OleControl_OnAmbientPropertyChange };
+static HRESULT WINAPI PersistStreamInit_QueryInterface(IPersistStreamInit *iface, REFIID iid, void **out) +{ + return dhtml_edit_qi(impl_from_IPersistStreamInit(iface), iid, out); +} + +static ULONG WINAPI PersistStreamInit_AddRef(IPersistStreamInit *iface) +{ + return dhtml_edit_addref(impl_from_IPersistStreamInit(iface)); +} + +static ULONG WINAPI PersistStreamInit_Release(IPersistStreamInit *iface) +{ + return dhtml_edit_release(impl_from_IPersistStreamInit(iface)); +} + +static HRESULT WINAPI PersistStreamInit_GetClassID(IPersistStreamInit *iface, CLSID *clsid) +{ + DHTMLEditImpl *This = impl_from_IPersistStreamInit(iface); + FIXME("(%p)->(%p) stub\n", This, clsid); + return E_NOTIMPL; +} + +static HRESULT WINAPI PersistStreamInit_IsDirty(IPersistStreamInit *iface) +{ + DHTMLEditImpl *This = impl_from_IPersistStreamInit(iface); + FIXME("(%p) stub\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, IStream *stream) +{ + DHTMLEditImpl *This = impl_from_IPersistStreamInit(iface); + FIXME("(%p)->(%p) stub\n", This, stream); + return S_OK; +} + +static HRESULT WINAPI PersistStreamInit_Save(IPersistStreamInit *iface, IStream *stream, BOOL clear_dirty) +{ + DHTMLEditImpl *This = impl_from_IPersistStreamInit(iface); + FIXME("(%p)->(%p, %u) stub\n", This, stream, clear_dirty); + return E_NOTIMPL; +} + +static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface, ULARGE_INTEGER *value) +{ + DHTMLEditImpl *This = impl_from_IPersistStreamInit(iface); + FIXME("(%p)->(%p) stub\n", This, value); + value->QuadPart = 0; + return E_NOTIMPL; +} + +static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface) +{ + DHTMLEditImpl *This = impl_from_IPersistStreamInit(iface); + FIXME("(%p) stub\n", This); + return E_NOTIMPL; +} + +static const IPersistStreamInitVtbl PersistStreamInitVtbl = { + PersistStreamInit_QueryInterface, + PersistStreamInit_AddRef, + PersistStreamInit_Release, + PersistStreamInit_GetClassID, + PersistStreamInit_IsDirty, + PersistStreamInit_Load, + PersistStreamInit_Save, + PersistStreamInit_GetSizeMax, + PersistStreamInit_InitNew +}; + HRESULT dhtml_edit_create(REFIID iid, void **out) { DHTMLEditImpl *This; @@ -979,6 +1062,7 @@ HRESULT dhtml_edit_create(REFIID iid, void **out) This->IViewObject_iface.lpVtbl = &ViewObjectVtbl; This->IOleObject_iface.lpVtbl = &OleObjectVtbl; This->IOleControl_iface.lpVtbl = &OleControlVtbl; + This->IPersistStreamInit_iface.lpVtbl = &PersistStreamInitVtbl; This->ref = 1;
*out = &This->IDHTMLEdit_iface;
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/dhtmled.ocx/edit.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+)
diff --git a/dlls/dhtmled.ocx/edit.c b/dlls/dhtmled.ocx/edit.c index c68e9d62fd..a929b4c4e9 100644 --- a/dlls/dhtmled.ocx/edit.c +++ b/dlls/dhtmled.ocx/edit.c @@ -32,6 +32,7 @@ typedef struct IOleObject IOleObject_iface; IOleControl IOleControl_iface; IPersistStreamInit IPersistStreamInit_iface; + IConnectionPointContainer IConnectionPointContainer_iface; IOleClientSite *client_site; LONG ref; } DHTMLEditImpl; @@ -66,6 +67,11 @@ static inline DHTMLEditImpl *impl_from_IPersistStreamInit(IPersistStreamInit *if return CONTAINING_RECORD(iface, DHTMLEditImpl, IPersistStreamInit_iface); }
+static inline DHTMLEditImpl *impl_from_IConnectionPointContainer(IConnectionPointContainer *iface) +{ + return CONTAINING_RECORD(iface, DHTMLEditImpl, IConnectionPointContainer_iface); +} + static HRESULT dhtml_edit_addref(DHTMLEditImpl *This) { LONG ref = InterlockedIncrement(&This->ref); @@ -119,6 +125,12 @@ static HRESULT dhtml_edit_qi(DHTMLEditImpl *This, REFIID iid, void **out) *out = &This->IPersistStreamInit_iface; return S_OK; } + else if (IsEqualGUID(iid, &IID_IConnectionPointContainer)) + { + dhtml_edit_addref(This); + *out = &This->IConnectionPointContainer_iface; + return S_OK; + }
*out = NULL; ERR("no interface for %s\n", debugstr_guid(iid)); @@ -1045,6 +1057,47 @@ static const IPersistStreamInitVtbl PersistStreamInitVtbl = { PersistStreamInit_InitNew };
+static HRESULT WINAPI ConnectionPointContainer_QueryInterface(IConnectionPointContainer *iface, REFIID iid, void **out) +{ + return dhtml_edit_qi(impl_from_IConnectionPointContainer(iface), iid, out); +} + +static ULONG WINAPI ConnectionPointContainer_AddRef(IConnectionPointContainer *iface) +{ + return dhtml_edit_addref(impl_from_IConnectionPointContainer(iface)); +} + +static ULONG WINAPI ConnectionPointContainer_Release(IConnectionPointContainer *iface) +{ + return dhtml_edit_release(impl_from_IConnectionPointContainer(iface)); +} + +static HRESULT WINAPI ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer *iface, + IEnumConnectionPoints **conn_points) +{ + DHTMLEditImpl *This = impl_from_IConnectionPointContainer(iface); + FIXME("(%p)->(%p) stub\n", This, conn_points); + *conn_points = NULL; + return E_NOTIMPL; +} + +static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer *iface, REFIID iid, + IConnectionPoint **out) +{ + DHTMLEditImpl *This = impl_from_IConnectionPointContainer(iface); + FIXME("(%p)->(%s, %p) stub\n", This, debugstr_guid(iid), out); + *out = NULL; + return CONNECT_E_NOCONNECTION; +} + +static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl = { + ConnectionPointContainer_QueryInterface, + ConnectionPointContainer_AddRef, + ConnectionPointContainer_Release, + ConnectionPointContainer_EnumConnectionPoints, + ConnectionPointContainer_FindConnectionPoint +}; + HRESULT dhtml_edit_create(REFIID iid, void **out) { DHTMLEditImpl *This; @@ -1063,6 +1116,7 @@ HRESULT dhtml_edit_create(REFIID iid, void **out) This->IOleObject_iface.lpVtbl = &OleObjectVtbl; This->IOleControl_iface.lpVtbl = &OleControlVtbl; This->IPersistStreamInit_iface.lpVtbl = &PersistStreamInitVtbl; + This->IConnectionPointContainer_iface.lpVtbl = &ConnectionPointContainerVtbl; This->ref = 1;
*out = &This->IDHTMLEdit_iface;