Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- v3: Combined dhtmled_classes.idl into dhtmled_tlb.idl --- configure.ac | 1 + dlls/dhtmled.ocx/Makefile.in | 8 + dlls/dhtmled.ocx/dhtmled.ocx.spec | 4 + dlls/dhtmled.ocx/dhtmled_private.h | 19 ++ dlls/dhtmled.ocx/dhtmled_tlb.idl | 22 ++ dlls/dhtmled.ocx/edit.c | 534 +++++++++++++++++++++++++++++++++++++ dlls/dhtmled.ocx/main.c | 162 +++++++++++ 7 files changed, 750 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_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 69fad417ba..dafbf6faa8 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..17850f8107 --- /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_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_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..96a9444a13 --- /dev/null +++ b/dlls/dhtmled.ocx/dhtmled_tlb.idl @@ -0,0 +1,22 @@ +/* + * 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 +#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); +}
Hi Alex,
On 06.12.2017 20:13, Alex Henrie wrote:
+#pragma makedep register +#pragma makedep regtypelib
+#include "dhtmled.idl"
This won't work without at least threading() specified in dhtmled.idl. It should probably also use progid and vi_progid.
Thanks,
Jacek
2017-12-07 12:20 GMT-07:00 Jacek Caban jacek@codeweavers.com:
On 06.12.2017 20:13, Alex Henrie wrote:
+#pragma makedep register +#pragma makedep regtypelib
+#include "dhtmled.idl"
This won't work without at least threading() specified in dhtmled.idl.
You're right; I noticed that before but did not notice this time because I was testing incorrectly. I'm happy to resend patch 1 with threading attributes.
It should probably also use progid and vi_progid.
There aren't progid or vi_progid attributes in the Microsoft IDL. If we add them, what values should they have?
-Alex
Hi Alex,
On 12/7/17 8:34 PM, Alex Henrie wrote:
2017-12-07 12:20 GMT-07:00 Jacek Caban jacek@codeweavers.com:
On 06.12.2017 20:13, Alex Henrie wrote:
+#pragma makedep register +#pragma makedep regtypelib
+#include "dhtmled.idl"
This won't work without at least threading() specified in dhtmled.idl.
You're right; I noticed that before but did not notice this time because I was testing incorrectly. I'm happy to resend patch 1 with threading attributes.
It would be fine as a separated patch as well. In fact, given that we're entering code freeze today and v4 version still doesn't get registration right, I would prefer to take v3 patch now and defer the rest until after code freeze.
It should probably also use progid and vi_progid.
There aren't progid or vi_progid attributes in the Microsoft IDL.
Yeah, they are widl extensions for registration.
If we add them, what values should they have?
See relevant registry values on Windows (or maybe native installed in Wine).
Thanks, Jacek
2017-12-08 9:53 GMT-07:00 Jacek Caban jacek@codeweavers.com:
On 12/7/17 8:34 PM, Alex Henrie wrote: You're right; I noticed that before but did not notice this time because I was testing incorrectly. I'm happy to resend patch 1 with threading attributes.
It would be fine as a separated patch as well. In fact, given that we're entering code freeze today and v4 version still doesn't get registration right, I would prefer to take v3 patch now and defer the rest until after code freeze.
Okay, I'm fine with leaving this until after the code freeze. I tried to respond to your emails quickly but I guess you had already left for the day.
-Alex