Jactry Zeng : riched20: Implement IOleInPlaceSite interface.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Mar 19 09:59:03 CDT 2015
Module: wine
Branch: master
Commit: 6c425a169ac56ea32e5ed226d60aa6f6d4415818
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6c425a169ac56ea32e5ed226d60aa6f6d4415818
Author: Jactry Zeng <jzeng at codeweavers.com>
Date: Tue Mar 17 16:17:39 2015 +0800
riched20: Implement IOleInPlaceSite interface.
---
dlls/riched20/richole.c | 131 ++++++++++++++++++++++++++++++++++++++++++
dlls/riched20/tests/richole.c | 54 +++++++++++++++++
2 files changed, 185 insertions(+)
diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index db55e84..3818cfa 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -82,6 +82,7 @@ struct ITextSelectionImpl {
struct IOleClientSiteImpl {
IOleClientSite IOleClientSite_iface;
IOleWindow IOleWindow_iface;
+ IOleInPlaceSite IOleInPlaceSite_iface;
LONG ref;
IRichEditOleImpl *reOle;
@@ -228,6 +229,8 @@ IOleClientSite_fnQueryInterface(IOleClientSite *me, REFIID riid, LPVOID *ppvObj)
*ppvObj = me;
else if (IsEqualGUID(riid, &IID_IOleWindow))
*ppvObj = &This->IOleWindow_iface;
+ else if (IsEqualGUID(riid, &IID_IOleInPlaceSite))
+ *ppvObj = &This->IOleInPlaceSite_iface;
if (*ppvObj)
{
IOleClientSite_AddRef(me);
@@ -379,6 +382,133 @@ static const IOleWindowVtbl olewinvt = {
IOleWindow_fnContextSensitiveHelp
};
+/* IOleInPlaceSite interface */
+static inline IOleClientSiteImpl *impl_from_IOleInPlaceSite(IOleInPlaceSite *iface)
+{
+ return CONTAINING_RECORD(iface, IOleClientSiteImpl, IOleInPlaceSite_iface);
+}
+
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnQueryInterface(IOleInPlaceSite *iface, REFIID riid, void **ppvObj)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppvObj);
+}
+
+static ULONG STDMETHODCALLTYPE IOleInPlaceSite_fnAddRef(IOleInPlaceSite *iface)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ return IOleClientSite_AddRef(&This->IOleClientSite_iface);
+}
+
+static ULONG STDMETHODCALLTYPE IOleInPlaceSite_fnRelease(IOleInPlaceSite *iface)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ return IOleClientSite_Release(&This->IOleClientSite_iface);
+}
+
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnGetWindow(IOleInPlaceSite *iface, HWND *phwnd)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ return IOleWindow_GetWindow(&This->IOleWindow_iface, phwnd);
+}
+
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnContextSensitiveHelp(IOleInPlaceSite *iface, BOOL fEnterMode)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ return IOleWindow_ContextSensitiveHelp(&This->IOleWindow_iface, fEnterMode);
+}
+
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnCanInPlaceActivate(IOleInPlaceSite *iface)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ FIXME("not implemented: (%p)\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnOnInPlaceActivate(IOleInPlaceSite *iface)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ FIXME("not implemented: (%p)\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnOnUIActivate(IOleInPlaceSite *iface)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ FIXME("not implemented: (%p)\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnGetWindowContext(IOleInPlaceSite *iface, IOleInPlaceFrame **ppFrame,
+ IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
+ LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ FIXME("not implemented: (%p)->(%p %p %p %p %p\n)", This, ppFrame, ppDoc, lprcPosRect, lprcClipRect, lpFrameInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnScroll(IOleInPlaceSite *iface, SIZE scrollExtent)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ FIXME("not implemented: (%p)\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnOnUIDeactivate(IOleInPlaceSite *iface, BOOL fUndoable)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ FIXME("not implemented: (%p)->(%d)\n", This, fUndoable);
+ return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnOnInPlaceDeactivate(IOleInPlaceSite *iface)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ FIXME("not implemented: (%p)\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnDiscardUndoState(IOleInPlaceSite *iface)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ FIXME("not implemented: (%p)\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnDeactivateAndUndo(IOleInPlaceSite *iface)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ FIXME("not implemented: (%p)\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnOnPosRectChange(IOleInPlaceSite *iface, LPCRECT lprcPosRect)
+{
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
+ FIXME("not implemented: (%p)->(%p)\n", This, lprcPosRect);
+ return E_NOTIMPL;
+}
+
+static const IOleInPlaceSiteVtbl olestvt =
+{
+ IOleInPlaceSite_fnQueryInterface,
+ IOleInPlaceSite_fnAddRef,
+ IOleInPlaceSite_fnRelease,
+ IOleInPlaceSite_fnGetWindow,
+ IOleInPlaceSite_fnContextSensitiveHelp,
+ IOleInPlaceSite_fnCanInPlaceActivate,
+ IOleInPlaceSite_fnOnInPlaceActivate,
+ IOleInPlaceSite_fnOnUIActivate,
+ IOleInPlaceSite_fnGetWindowContext,
+ IOleInPlaceSite_fnScroll,
+ IOleInPlaceSite_fnOnUIDeactivate,
+ IOleInPlaceSite_fnOnInPlaceDeactivate,
+ IOleInPlaceSite_fnDiscardUndoState,
+ IOleInPlaceSite_fnDeactivateAndUndo,
+ IOleInPlaceSite_fnOnPosRectChange
+};
+
static IOleClientSiteImpl *
CreateOleClientSite(IRichEditOleImpl *reOle)
{
@@ -388,6 +518,7 @@ CreateOleClientSite(IRichEditOleImpl *reOle)
clientSite->IOleClientSite_iface.lpVtbl = &ocst;
clientSite->IOleWindow_iface.lpVtbl = &olewinvt;
+ clientSite->IOleInPlaceSite_iface.lpVtbl = &olestvt;
clientSite->ref = 1;
clientSite->reOle = reOle;
return clientSite;
diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c
index a89ee55..b4fbaa1 100644
--- a/dlls/riched20/tests/richole.c
+++ b/dlls/riched20/tests/richole.c
@@ -164,6 +164,10 @@ static void test_Interfaces(void)
hres = IRichEditOle_QueryInterface(reOle, &IID_IOleWindow, (void **) &punk);
ok(hres == E_NOINTERFACE, "IRichEditOle_QueryInterface\n");
+ punk = NULL;
+ hres = IRichEditOle_QueryInterface(reOle, &IID_IOleInPlaceSite, (void **) &punk);
+ ok(hres == E_NOINTERFACE, "IRichEditOle_QueryInterface\n");
+
ITextDocument_Release(txtDoc);
IRichEditOle_Release(reOle);
refcount = IRichEditOle_Release(reOle);
@@ -956,6 +960,7 @@ static void test_IOleClientSite_QueryInterface(void)
ITextDocument *txtDoc = NULL;
IOleClientSite *clientSite = NULL, *clientSite1 = NULL, *clientSite2 = NULL;
IOleWindow *oleWin = NULL, *oleWin1 = NULL;
+ IOleInPlaceSite *olePlace = NULL, *olePlace1 = NULL;
HRESULT hres;
LONG refcount1, refcount2;
@@ -992,6 +997,26 @@ static void test_IOleClientSite_QueryInterface(void)
ok(hres == S_OK, "IOleWindow_QueryInterface: 0x%08x\n", hres);
ok(clientSite2 == clientSite1, "got wrong pointer\n");
+ /* IOleInPlaceSite interface */
+ hres = IOleClientSite_QueryInterface(clientSite, &IID_IOleInPlaceSite, (void **)&olePlace);
+ ok(hres == S_OK, "IOleClientSite_QueryInterface: 0x%08x\n", hres);
+ refcount1 = get_refcount((IUnknown *)olePlace);
+ refcount2 = get_refcount((IUnknown *)clientSite);
+ ok(refcount1 == refcount2, "got wrong ref count.\n");
+
+ hres = IOleClientSite_QueryInterface(clientSite, &IID_IOleInPlaceSite, (void **)&olePlace1);
+ ok(hres == S_OK, "IOleClientSite_QueryInterface: 0x%08x\n", hres);
+ ok(olePlace == olePlace1, "Should not return a new pointer.\n");
+ IOleInPlaceSite_Release(olePlace1);
+
+ hres = IOleWindow_QueryInterface(oleWin, &IID_IOleInPlaceSite, (void **)&olePlace1);
+ ok(hres == S_OK, "IOleWindow_QueryInterface: 0x%08x\n", hres);
+ refcount1 = get_refcount((IUnknown *)olePlace1);
+ refcount2 = get_refcount((IUnknown *)oleWin);
+ ok(refcount1 == refcount2, "got wrong ref count.\n");
+
+ IOleInPlaceSite_Release(olePlace1);
+ IOleInPlaceSite_Release(olePlace);
IOleWindow_Release(oleWin1);
IOleWindow_Release(oleWin);
IOleClientSite_Release(clientSite2);
@@ -1028,6 +1053,34 @@ static void test_IOleWindow_GetWindow(void)
release_interfaces(&w, &reOle, &txtDoc, NULL);
}
+static void test_IOleInPlaceSite_GetWindow(void)
+{
+ HWND w;
+ IRichEditOle *reOle = NULL;
+ ITextDocument *txtDoc = NULL;
+ IOleClientSite *clientSite = NULL;
+ IOleInPlaceSite *olePlace = NULL;
+ HRESULT hres;
+ HWND hwnd;
+
+ create_interfaces(&w, &reOle, &txtDoc, NULL);
+ hres = IRichEditOle_GetClientSite(reOle, &clientSite);
+ ok(hres == S_OK, "IRichEditOle_QueryInterface: 0x%08x\n", hres);
+
+ hres = IOleClientSite_QueryInterface(clientSite, &IID_IOleInPlaceSite, (void **)&olePlace);
+ ok(hres == S_OK, "IOleClientSite_QueryInterface: 0x%08x\n", hres);
+ hres = IOleInPlaceSite_GetWindow(olePlace, &hwnd);
+ ok(hres == S_OK, "IOleInPlaceSite_GetWindow: 0x%08x\n", hres);
+ ok(w == hwnd, "got wrong pointer.\n");
+
+ hres = IOleInPlaceSite_GetWindow(olePlace, NULL);
+ ok(hres == E_INVALIDARG, "IOleInPlaceSite_GetWindow: 0x%08x\n", hres);
+
+ IOleInPlaceSite_Release(olePlace);
+ IOleClientSite_Release(clientSite);
+ release_interfaces(&w, &reOle, &txtDoc, NULL);
+}
+
START_TEST(richole)
{
/* Must explicitly LoadLibrary(). The test has no references to functions in
@@ -1048,4 +1101,5 @@ START_TEST(richole)
test_ITextRange_Collapse();
test_IOleClientSite_QueryInterface();
test_IOleWindow_GetWindow();
+ test_IOleInPlaceSite_GetWindow();
}
More information about the wine-cvs
mailing list