Jacek Caban : mshtml: Simplify get_node_obj.

Alexandre Julliard julliard at winehq.org
Tue Oct 2 14:09:40 CDT 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Oct  2 15:45:15 2012 +0200

mshtml: Simplify get_node_obj.

---

 dlls/mshtml/htmlnode.c |   37 ++++++++++++++++++++++++-------------
 1 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index b0cf4c3..91ffe6d 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -33,7 +33,7 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
-static HTMLDOMNode *get_node_obj(HTMLDocumentNode*,IUnknown*);
+static HTMLDOMNode *get_node_obj(IHTMLDOMNode*);
 static HRESULT create_node(HTMLDocumentNode*,nsIDOMNode*,HTMLDOMNode**);
 
 typedef struct {
@@ -503,7 +503,7 @@ static HRESULT WINAPI HTMLDOMNode_insertBefore(IHTMLDOMNode *iface, IHTMLDOMNode
 
     TRACE("(%p)->(%p %s %p)\n", This, newChild, debugstr_variant(&refChild), node);
 
-    new_child = get_node_obj(This->doc, (IUnknown*)newChild);
+    new_child = get_node_obj(newChild);
     if(!new_child) {
         ERR("invalid newChild\n");
         return E_INVALIDARG;
@@ -513,9 +513,17 @@ static HRESULT WINAPI HTMLDOMNode_insertBefore(IHTMLDOMNode *iface, IHTMLDOMNode
     case VT_NULL:
         break;
     case VT_DISPATCH: {
+        IHTMLDOMNode *ref_iface;
+
         if(!V_DISPATCH(&refChild))
             break;
-        ref_node = get_node_obj(This->doc, (IUnknown*)V_DISPATCH(&refChild));
+
+        hres = IDispatch_QueryInterface(V_DISPATCH(&refChild), &IID_IHTMLDOMNode, (void**)&ref_iface);
+        if(FAILED(hres))
+            break;
+
+        ref_node = get_node_obj(ref_iface);
+        IHTMLDOMNode_Release(ref_iface);
         if(!ref_node) {
             ERR("unvalid node\n");
             hres = E_FAIL;
@@ -561,7 +569,7 @@ static HRESULT WINAPI HTMLDOMNode_removeChild(IHTMLDOMNode *iface, IHTMLDOMNode
 
     TRACE("(%p)->(%p %p)\n", This, oldChild, node);
 
-    node_obj = get_node_obj(This->doc, (IUnknown*)oldChild);
+    node_obj = get_node_obj(oldChild);
     if(!node_obj)
         return E_FAIL;
 
@@ -593,11 +601,11 @@ static HRESULT WINAPI HTMLDOMNode_replaceChild(IHTMLDOMNode *iface, IHTMLDOMNode
 
     TRACE("(%p)->(%p %p %p)\n", This, newChild, oldChild, node);
 
-    node_new = get_node_obj(This->doc, (IUnknown*)newChild);
+    node_new = get_node_obj(newChild);
     if(!node_new)
         return E_FAIL;
 
-    node_old = get_node_obj(This->doc, (IUnknown*)oldChild);
+    node_old = get_node_obj(oldChild);
     if(!node_old) {
         node_release(node_new);
         return E_FAIL;
@@ -678,7 +686,7 @@ static HRESULT WINAPI HTMLDOMNode_appendChild(IHTMLDOMNode *iface, IHTMLDOMNode
 
     TRACE("(%p)->(%p %p)\n", This, newChild, node);
 
-    node_obj = get_node_obj(This->doc, (IUnknown*)newChild);
+    node_obj = get_node_obj(newChild);
     if(!node_obj)
         return E_FAIL;
 
@@ -886,13 +894,16 @@ static const IHTMLDOMNodeVtbl HTMLDOMNodeVtbl = {
     HTMLDOMNode_get_nextSibling
 };
 
-static HTMLDOMNode *get_node_obj(HTMLDocumentNode *This, IUnknown *iface)
+static HTMLDOMNode *get_node_obj(IHTMLDOMNode *iface)
 {
-    IHTMLDOMNode *node;
-    HRESULT hres;
+    HTMLDOMNode *ret;
+
+    if(iface->lpVtbl != &HTMLDOMNodeVtbl)
+        return NULL;
 
-    hres = IUnknown_QueryInterface(iface, &IID_IHTMLDOMNode, (void**)&node);
-    return hres == S_OK && node->lpVtbl == &HTMLDOMNodeVtbl ? impl_from_IHTMLDOMNode(node) : NULL;
+    ret = impl_from_IHTMLDOMNode(iface);
+    node_addref(ret);
+    return ret;
 }
 
 static inline HTMLDOMNode *impl_from_IHTMLDOMNode2(IHTMLDOMNode2 *iface)
@@ -1192,7 +1203,7 @@ HRESULT get_node(HTMLDocumentNode *This, nsIDOMNode *nsnode, BOOL create, HTMLDO
     assert(nsres == NS_OK);
 
     if(unk) {
-        *ret = get_node_obj(This, (IUnknown*)unk);
+        *ret = get_node_obj((IHTMLDOMNode*)unk);
         return NS_OK;
     }
 




More information about the wine-cvs mailing list