Jacek Caban : urlmon: Correctly handle creating object failure.

Alexandre Julliard julliard at winehq.org
Fri Feb 22 05:49:40 CST 2008


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Feb 22 02:09:12 2008 +0100

urlmon: Correctly handle creating object failure.

---

 dlls/urlmon/binding.c |   57 +++++++++++++++++++++++++++++-------------------
 1 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c
index a966f2e..6bd2946 100644
--- a/dlls/urlmon/binding.c
+++ b/dlls/urlmon/binding.c
@@ -420,31 +420,17 @@ static void load_doc_mon(Binding *binding, IPersistMoniker *persist)
         FIXME("Load failed: %08x\n", hres);
 }
 
-static void create_object(Binding *binding)
+static HRESULT create_mime_object(Binding *binding, const CLSID *clsid, LPCWSTR clsid_str)
 {
     IPersistMoniker *persist;
-    LPWSTR clsid_str;
-    CLSID clsid;
     HRESULT hres;
 
-    if(!binding->mime) {
-        FIXME("MIME unavailable\n");
-        return;
-    }
-
-    if(!(clsid_str = get_mime_clsid(binding->mime, &clsid))) {
-        FIXME("Could not find object for MIME %s\n", debugstr_w(binding->mime));
-        return;
-    }
-
-    IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_CLASSIDAVAILABLE, clsid_str);
-
-    IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_BEGINSYNCOPERATION, NULL);
-
-    hres = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
+    hres = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
                             &binding->iid, (void**)&binding->obj);
-    if(FAILED(hres))
-        FIXME("CoCreateInstance failed: %08x\n", hres);
+    if(FAILED(hres)) {
+        WARN("CoCreateInstance failed: %08x\n", hres);
+        return INET_E_CANNOT_INSTANTIATE_OBJECT;
+    }
 
     binding->state |= BINDING_OBJAVAIL;
 
@@ -467,13 +453,38 @@ static void create_object(Binding *binding)
         /* FIXME: Try query IPersistFile */
     }
 
-    heap_free(clsid_str);
-
     IBindStatusCallback_OnObjectAvailable(binding->callback, &binding->iid, binding->obj);
 
+    return S_OK;
+}
+
+static void create_object(Binding *binding)
+{
+    LPWSTR clsid_str;
+    CLSID clsid;
+    HRESULT hres;
+
+    if(!binding->mime) {
+        FIXME("MIME not available\n");
+        return;
+    }
+
+    if(!(clsid_str = get_mime_clsid(binding->mime, &clsid))) {
+        FIXME("Could not find object for MIME %s\n", debugstr_w(binding->mime));
+        return;
+    }
+
+    IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_CLASSIDAVAILABLE, clsid_str);
+    IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_BEGINSYNCOPERATION, NULL);
+
+    hres = create_mime_object(binding, &clsid, clsid_str);
+    heap_free(clsid_str);
+
     IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_ENDSYNCOPERATION, NULL);
 
-    stop_binding(binding, S_OK, NULL);
+    stop_binding(binding, hres, NULL);
+    if(FAILED(hres))
+        IInternetProtocol_Terminate(binding->protocol, 0);
 }
 
 #define STGMEDUNK_THIS(iface) DEFINE_THIS(stgmed_buf_t, Unknown, iface)




More information about the wine-cvs mailing list