Jactry Zeng : riched20: Implement IRichEditOle::GetObject.
Alexandre Julliard
julliard at winehq.org
Mon Apr 16 15:26:25 CDT 2018
Module: wine
Branch: master
Commit: 7409454345e5d0e1a6bae33525754c7687ba1e58
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7409454345e5d0e1a6bae33525754c7687ba1e58
Author: Jactry Zeng <jzeng at codeweavers.com>
Date: Fri Apr 13 15:57:15 2018 +0800
riched20: Implement IRichEditOle::GetObject.
Signed-off-by: Jactry Zeng <jzeng at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/riched20/caret.c | 2 +-
dlls/riched20/editor.h | 2 +-
dlls/riched20/richole.c | 57 +++++++++++++++++++++++++++++++++++++++++++------
3 files changed, 53 insertions(+), 8 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index 1d35696..4664f0c 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -480,7 +480,7 @@ static struct re_object* create_re_object(const REOBJECT *reo)
WARN("Fail to allocate re_object.\n");
return NULL;
}
- ME_CopyReObject(&reobj->obj, reo);
+ ME_CopyReObject(&reobj->obj, reo, REO_GETOBJ_ALL_INTERFACES);
return reobj;
}
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index 1a9bec3..0f0e56e 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -231,7 +231,7 @@ int ME_GetParaBorderWidth(const ME_Context *c, int flags) DECLSPEC_HIDDEN;
LRESULT CreateIRichEditOle(IUnknown *outer_unk, ME_TextEditor *editor, LPVOID *ppvObj) DECLSPEC_HIDDEN;
void ME_DrawOLE(ME_Context *c, int x, int y, ME_Run* run, BOOL selected) DECLSPEC_HIDDEN;
void ME_GetOLEObjectSize(const ME_Context *c, ME_Run *run, SIZE *pSize) DECLSPEC_HIDDEN;
-void ME_CopyReObject(REOBJECT* dst, const REOBJECT* src) DECLSPEC_HIDDEN;
+void ME_CopyReObject(REOBJECT *dst, const REOBJECT *src, DWORD flags) DECLSPEC_HIDDEN;
void ME_DeleteReObject(struct re_object *re_object) DECLSPEC_HIDDEN;
void ME_GetITextDocumentInterface(IRichEditOle *iface, LPVOID *ppvObj) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index 6b2ef41..5c7be5e 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -1371,8 +1371,38 @@ IRichEditOle_fnGetObject(IRichEditOle *me, LONG iob,
REOBJECT *lpreobject, DWORD dwFlags)
{
IRichEditOleImpl *This = impl_from_IRichEditOle(me);
- FIXME("stub %p\n",This);
- return E_NOTIMPL;
+ struct re_object *reobj = NULL;
+ LONG count = 0;
+
+ TRACE("(%p)->(%x, %p, %x)\n", This, iob, lpreobject, dwFlags);
+
+ if (!lpreobject || !lpreobject->cbStruct)
+ return E_INVALIDARG;
+
+ if (iob == REO_IOB_USE_CP)
+ {
+ ME_Cursor cursor;
+
+ TRACE("character offset: %d\n", lpreobject->cp);
+ ME_CursorFromCharOfs(This->editor, lpreobject->cp, &cursor);
+ if (!cursor.pRun->member.run.reobj)
+ return E_INVALIDARG;
+ else
+ reobj = cursor.pRun->member.run.reobj;
+ }
+ else
+ {
+ if (iob > IRichEditOle_GetObjectCount(me))
+ return E_INVALIDARG;
+ LIST_FOR_EACH_ENTRY(reobj, &This->editor->reobj_list, struct re_object, entry)
+ {
+ if (count == iob)
+ break;
+ count++;
+ }
+ }
+ ME_CopyReObject(lpreobject, &reobj->obj, dwFlags);
+ return S_OK;
}
static LONG WINAPI
@@ -5455,13 +5485,28 @@ void ME_DeleteReObject(struct re_object *reobj)
heap_free(reobj);
}
-void ME_CopyReObject(REOBJECT* dst, const REOBJECT* src)
+void ME_CopyReObject(REOBJECT *dst, const REOBJECT *src, DWORD flags)
{
*dst = *src;
+ dst->poleobj = NULL;
+ dst->pstg = NULL;
+ dst->polesite = NULL;
- if (dst->poleobj) IOleObject_AddRef(dst->poleobj);
- if (dst->pstg) IStorage_AddRef(dst->pstg);
- if (dst->polesite) IOleClientSite_AddRef(dst->polesite);
+ if ((flags & REO_GETOBJ_POLEOBJ) && src->poleobj)
+ {
+ dst->poleobj = src->poleobj;
+ IOleObject_AddRef(dst->poleobj);
+ }
+ if ((flags & REO_GETOBJ_PSTG) && src->pstg)
+ {
+ dst->pstg = src->pstg;
+ IStorage_AddRef(dst->pstg);
+ }
+ if ((flags & REO_GETOBJ_POLESITE) && src->polesite)
+ {
+ dst->polesite = src->polesite;
+ IOleClientSite_AddRef(dst->polesite);
+ }
}
void ME_GetITextDocumentInterface(IRichEditOle *iface, LPVOID *ppvObj)
More information about the wine-cvs
mailing list