Module: wine Branch: master Commit: 7409454345e5d0e1a6bae33525754c7687ba1e58 URL: https://source.winehq.org/git/wine.git/?a=commit;h=7409454345e5d0e1a6bae3352...
Author: Jactry Zeng jzeng@codeweavers.com Date: Fri Apr 13 15:57:15 2018 +0800
riched20: Implement IRichEditOle::GetObject.
Signed-off-by: Jactry Zeng jzeng@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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)