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