Jacek Caban : mshtml: Added IOleUndoManager stub implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Sep 10 10:18:04 CDT 2007


Module: wine
Branch: master
Commit: fbdab049623b98b8e982da874f7be0047b5a829a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fbdab049623b98b8e982da874f7be0047b5a829a

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sun Sep  9 20:17:30 2007 +0200

mshtml: Added IOleUndoManager stub implementation.

---

 dlls/mshtml/htmldoc.c        |    2 +
 dlls/mshtml/mshtml_private.h |    2 +
 dlls/mshtml/service.c        |  182 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 186 insertions(+), 0 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 19da49a..5e9f0ff 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -160,6 +160,8 @@ static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface)
             IOleInPlaceObjectWindowless_InPlaceDeactivate(INPLACEWIN(This));
         if(This->ipsite)
             IOleDocumentView_SetInPlaceSite(DOCVIEW(This), NULL);
+        if(This->undomgr)
+            IOleUndoManager_Release(This->undomgr);
 
         set_document_bscallback(This, NULL);
         set_current_mon(This, NULL);
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index fbe572f..1f11d7d 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -124,6 +124,8 @@ struct HTMLDocument {
     IOleInPlaceFrame *frame;
     IOleInPlaceUIWindow *ip_window;
 
+    IOleUndoManager *undomgr;
+
     BSCallback *bscallback;
     IMoniker *mon;
     BSTR url;
diff --git a/dlls/mshtml/service.c b/dlls/mshtml/service.c
index ce4dc2e..d69c778 100644
--- a/dlls/mshtml/service.c
+++ b/dlls/mshtml/service.c
@@ -34,6 +34,175 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
+typedef struct {
+    const IOleUndoManagerVtbl  *lpOleUndoManagerVtbl;
+
+    LONG ref;
+} UndoManager;
+
+#define UNDOMGR(x)  ((IOleUndoManager*)  &(x)->lpOleUndoManagerVtbl)
+
+#define UNDOMGR_THIS(iface) DEFINE_THIS(UndoManager, OleUndoManager, iface)
+
+static HRESULT WINAPI OleUndoManager_QueryInterface(IOleUndoManager *iface, REFIID riid, void **ppv)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+
+    *ppv = NULL;
+
+    if(IsEqualGUID(riid, &IID_IUnknown)) {
+        TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
+        *ppv = UNDOMGR(This);
+    }else if(IsEqualGUID(riid, &IID_IOleUndoManager)) {
+        TRACE("(%p)->(IID_IOleUndoManager %p)\n", This, ppv);
+        *ppv = UNDOMGR(This);
+    }
+
+
+    FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI OleUndoManager_AddRef(IOleUndoManager *iface)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+    LONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI OleUndoManager_Release(IOleUndoManager *iface)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+    LONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    if(!ref)
+        mshtml_free(This);
+
+    return ref;
+}
+
+static HRESULT WINAPI OleUndoManager_Open(IOleUndoManager *iface, IOleParentUndoUnit *pPUU)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, pPUU);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleUndoManager_Close(IOleUndoManager *iface, IOleParentUndoUnit *pPUU,
+        BOOL fCommit)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+    FIXME("(%p)->(%p %x)\n", This, pPUU, fCommit);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleUndoManager_Add(IOleUndoManager *iface, IOleUndoUnit *pUU)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, pUU);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleUndoManager_GetOpenParentState(IOleUndoManager *iface, DWORD *pdwState)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, pdwState);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleUndoManager_DiscardFrom(IOleUndoManager *iface, IOleUndoUnit *pUU)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, pUU);
+    return S_OK;
+}
+
+static HRESULT WINAPI OleUndoManager_UndoTo(IOleUndoManager *iface, IOleUndoUnit *pUU)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, pUU);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleUndoManager_RedoTo(IOleUndoManager *iface, IOleUndoUnit *pUU)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, pUU);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleUndoManager_EnumUndoable(IOleUndoManager *iface,
+        IEnumOleUndoUnits **ppEnum)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, ppEnum);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleUndoManager_EnumRedoable(IOleUndoManager *iface,
+        IEnumOleUndoUnits **ppEnum)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, ppEnum);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleUndoManager_GetLastUndoDescription(IOleUndoManager *iface, BSTR *pBstr)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, pBstr);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleUndoManager_GetLastRedoDescription(IOleUndoManager *iface, BSTR *pBstr)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, pBstr);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleUndoManager_Enable(IOleUndoManager *iface, BOOL fEnable)
+{
+    UndoManager *This = UNDOMGR_THIS(iface);
+    FIXME("(%p)->(%x)\n", This, fEnable);
+    return E_NOTIMPL;
+}
+
+#undef UNDOMGR_THIS
+
+static const IOleUndoManagerVtbl OleUndoManagerVtbl = {
+    OleUndoManager_QueryInterface,
+    OleUndoManager_AddRef,
+    OleUndoManager_Release,
+    OleUndoManager_Open,
+    OleUndoManager_Close,
+    OleUndoManager_Add,
+    OleUndoManager_GetOpenParentState,
+    OleUndoManager_DiscardFrom,
+    OleUndoManager_UndoTo,
+    OleUndoManager_RedoTo,
+    OleUndoManager_EnumUndoable,
+    OleUndoManager_EnumRedoable,
+    OleUndoManager_GetLastUndoDescription,
+    OleUndoManager_GetLastRedoDescription,
+    OleUndoManager_Enable
+};
+
+static IOleUndoManager *create_undomgr(void)
+{
+    UndoManager *ret = mshtml_alloc(sizeof(UndoManager));
+
+    ret->lpOleUndoManagerVtbl = &OleUndoManagerVtbl;
+    ret->ref = 1;
+
+    return UNDOMGR(ret);
+}
+
 /**********************************************************
  * IServiceProvider impementation
  */
@@ -69,6 +238,17 @@ static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFG
         return E_NOINTERFACE;
     }
 
+    if(IsEqualGUID(&IID_IOleUndoManager, riid)) {
+        TRACE("(%p)->(IID_IOleUndoManager %p)\n", This, ppv);
+
+        if(!This->undomgr)
+            This->undomgr = create_undomgr();
+
+        IOleUndoManager_AddRef(This->undomgr);
+        *ppv = This->undomgr;
+        return S_OK;
+    }
+
     FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
     
     return E_UNEXPECTED;
@@ -84,4 +264,6 @@ static const IServiceProviderVtbl ServiceProviderVtbl = {
 void HTMLDocument_Service_Init(HTMLDocument *This)
 {
     This->lpServiceProviderVtbl = &ServiceProviderVtbl;
+
+    This->undomgr = NULL;
 }




More information about the wine-cvs mailing list