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