Juan Lang : riched20: Add stub IOleClientSite interface.

Alexandre Julliard julliard at winehq.org
Sat Jan 10 11:16:34 CST 2009


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Fri Jan  9 09:08:35 2009 -0800

riched20: Add stub IOleClientSite interface.

---

 dlls/riched20/richole.c |  156 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 154 insertions(+), 2 deletions(-)

diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index 9eabb04..a5f79c7 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -52,6 +52,7 @@ DEFINE_GUID(IID_ITextRange, 0x8cc497c2, 0xa1df, 0x11ce, 0x80, 0x98, 0x00, 0xaa,
 DEFINE_GUID(IID_ITextSelection, 0x8cc497c1, 0xa1df, 0x11ce, 0x80, 0x98, 0x00, 0xaa, 0x00, 0x47, 0xbe, 0x5d);
 
 typedef struct ITextSelectionImpl ITextSelectionImpl;
+typedef struct IOleClientSiteImpl IOleClientSiteImpl;
 
 typedef struct IRichEditOleImpl {
     const IRichEditOleVtbl *lpRichEditOleVtbl;
@@ -60,6 +61,7 @@ typedef struct IRichEditOleImpl {
 
     ME_TextEditor *editor;
     ITextSelectionImpl *txtSel;
+    IOleClientSiteImpl *clientSite;
 } IRichEditOleImpl;
 
 struct ITextSelectionImpl {
@@ -69,6 +71,13 @@ struct ITextSelectionImpl {
     IRichEditOleImpl *reOle;
 };
 
+struct IOleClientSiteImpl {
+    const IOleClientSiteVtbl *lpVtbl;
+    LONG ref;
+
+    IRichEditOleImpl *reOle;
+};
+
 static inline IRichEditOleImpl *impl_from_IRichEditOle(IRichEditOle *iface)
 {
     return (IRichEditOleImpl *)((BYTE*)iface - FIELD_OFFSET(IRichEditOleImpl, lpRichEditOleVtbl));
@@ -126,6 +135,7 @@ IRichEditOle_fnRelease(IRichEditOle *me)
         TRACE ("Destroying %p\n", This);
         This->txtSel->reOle = NULL;
         ITextSelection_Release((ITextSelection *) This->txtSel);
+        IOleClientSite_Release((IOleClientSite *) This->clientSite);
         heap_free(This);
     }
     return ref;
@@ -157,12 +167,147 @@ IRichEditOle_fnConvertObject(IRichEditOle *me, LONG iob,
 }
 
 static HRESULT WINAPI
+IOleClientSite_fnQueryInterface(IOleClientSite *me, REFIID riid, LPVOID *ppvObj)
+{
+    TRACE("%p %s\n", me, debugstr_guid(riid) );
+
+    *ppvObj = NULL;
+    if (IsEqualGUID(riid, &IID_IUnknown) ||
+        IsEqualGUID(riid, &IID_IOleClientSite))
+        *ppvObj = me;
+    if (*ppvObj)
+    {
+        IOleClientSite_AddRef(me);
+        return S_OK;
+    }
+    FIXME("%p: unhandled interface %s\n", me, debugstr_guid(riid) );
+
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI
+IOleClientSite_fnAddRef(IOleClientSite *me)
+{
+    IOleClientSiteImpl *This = (IOleClientSiteImpl *) me;
+    return InterlockedIncrement(&This->ref);
+}
+
+static ULONG WINAPI
+IOleClientSite_fnRelease(IOleClientSite *me)
+{
+    IOleClientSiteImpl *This = (IOleClientSiteImpl *) me;
+    ULONG ref = InterlockedDecrement(&This->ref);
+    if (ref == 0)
+        heap_free(This);
+    return ref;
+}
+
+static HRESULT WINAPI
+IOleClientSite_fnSaveObject(IOleClientSite *me)
+{
+    IOleClientSiteImpl *This = (IOleClientSiteImpl *) me;
+    if (!This->reOle)
+        return CO_E_RELEASED;
+
+    FIXME("stub %p\n",me);
+    return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI
+IOleClientSite_fnGetMoniker(IOleClientSite *me, DWORD dwAssign, DWORD dwWhichMoniker,
+    IMoniker **ppmk)
+{
+    IOleClientSiteImpl *This = (IOleClientSiteImpl *) me;
+    if (!This->reOle)
+        return CO_E_RELEASED;
+
+    FIXME("stub %p\n",me);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+IOleClientSite_fnGetContainer(IOleClientSite *me, IOleContainer **ppContainer)
+{
+    IOleClientSiteImpl *This = (IOleClientSiteImpl *) me;
+    if (!This->reOle)
+        return CO_E_RELEASED;
+
+    FIXME("stub %p\n",me);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+IOleClientSite_fnShowObject(IOleClientSite *me)
+{
+    IOleClientSiteImpl *This = (IOleClientSiteImpl *) me;
+    if (!This->reOle)
+        return CO_E_RELEASED;
+
+    FIXME("stub %p\n",me);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+IOleClientSite_fnOnShowWindow(IOleClientSite *me, BOOL fShow)
+{
+    IOleClientSiteImpl *This = (IOleClientSiteImpl *) me;
+    if (!This->reOle)
+        return CO_E_RELEASED;
+
+    FIXME("stub %p\n",me);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+IOleClientSite_fnRequestNewObjectLayout(IOleClientSite *me)
+{
+    IOleClientSiteImpl *This = (IOleClientSiteImpl *) me;
+    if (!This->reOle)
+        return CO_E_RELEASED;
+
+    FIXME("stub %p\n",me);
+    return E_NOTIMPL;
+}
+
+static const IOleClientSiteVtbl ocst = {
+    IOleClientSite_fnQueryInterface,
+    IOleClientSite_fnAddRef,
+    IOleClientSite_fnRelease,
+    IOleClientSite_fnSaveObject,
+    IOleClientSite_fnGetMoniker,
+    IOleClientSite_fnGetContainer,
+    IOleClientSite_fnShowObject,
+    IOleClientSite_fnOnShowWindow,
+    IOleClientSite_fnRequestNewObjectLayout
+};
+
+static IOleClientSiteImpl *
+CreateOleClientSite(IRichEditOleImpl *reOle)
+{
+    IOleClientSiteImpl *clientSite = heap_alloc(sizeof *clientSite);
+    if (!clientSite)
+        return NULL;
+
+    clientSite->lpVtbl = &ocst;
+    clientSite->ref = 1;
+    clientSite->reOle = reOle;
+    return clientSite;
+}
+
+static HRESULT WINAPI
 IRichEditOle_fnGetClientSite(IRichEditOle *me,
                LPOLECLIENTSITE *lplpolesite)
 {
     IRichEditOleImpl *This = impl_from_IRichEditOle(me);
-    FIXME("stub %p\n",This);
-    return E_NOTIMPL;
+
+    TRACE("%p,%p\n",This, lplpolesite);
+
+    if(!lplpolesite)
+        return E_INVALIDARG;
+    *lplpolesite = (IOleClientSite *) This->clientSite;
+    IOleClientSite_fnAddRef(*lplpolesite);
+    return S_OK;
 }
 
 static HRESULT WINAPI
@@ -1541,6 +1686,13 @@ LRESULT CreateIRichEditOle(ME_TextEditor *editor, LPVOID *ppObj)
         heap_free(reo);
         return 0;
     }
+    reo->clientSite = CreateOleClientSite(reo);
+    if (!reo->txtSel)
+    {
+        ITextSelection_Release((ITextSelection *) reo->txtSel);
+        heap_free(reo);
+        return 0;
+    }
     TRACE("Created %p\n",reo);
     *ppObj = (LPVOID) reo;
 




More information about the wine-cvs mailing list