msxml3: Fix putProperty() for declaration handler.
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index e74967e..fca390a 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -2244,25 +2244,45 @@
{
if(This->isParsing) return E_FAIL;
- if(V_UNKNOWN(&value))
+ switch (V_VT(&value))
{
- if(vbInterface)
- IVBSAXDeclHandler_AddRef((IVBSAXDeclHandler*)V_UNKNOWN(&value));
+ case VT_EMPTY:
+ if (vbInterface)
+ {
+ if (This->vbdeclHandler)
+ {
+ IVBSAXDeclHandler_Release(This->vbdeclHandler);
+ This->vbdeclHandler = NULL;
+ }
+ }
else
- ISAXDeclHandler_AddRef((ISAXDeclHandler*)V_UNKNOWN(&value));
- }
- if((vbInterface && This->vbdeclHandler)
- || (!vbInterface && This->declHandler))
- {
- if(vbInterface)
- IVBSAXDeclHandler_Release(This->vbdeclHandler);
+ if (This->declHandler)
+ {
+ ISAXDeclHandler_Release(This->declHandler);
+ This->declHandler = NULL;
+ }
+ break;
+ case VT_UNKNOWN:
+ if (V_UNKNOWN(&value)) IUnknown_AddRef(V_UNKNOWN(&value));
+
+ if ((vbInterface && This->vbdeclHandler) ||
+ (!vbInterface && This->declHandler))
+ {
+ if (vbInterface)
+ IVBSAXDeclHandler_Release(This->vbdeclHandler);
+ else
+ ISAXDeclHandler_Release(This->declHandler);
+ }
+
+ if (vbInterface)
+ This->vbdeclHandler = (IVBSAXDeclHandler*)V_UNKNOWN(&value);
else
- ISAXDeclHandler_Release(This->declHandler);
+ This->declHandler = (ISAXDeclHandler*)V_UNKNOWN(&value);
+ break;
+ default:
+ return E_INVALIDARG;
}
- if(vbInterface)
- This->vbdeclHandler = (IVBSAXDeclHandler*)V_UNKNOWN(&value);
- else
- This->declHandler = (ISAXDeclHandler*)V_UNKNOWN(&value);
+
return S_OK;
}
@@ -2358,6 +2378,14 @@
return S_OK;
}
+ if (!memcmp(PropertyDeclHandlerW, prop, sizeof(PropertyDeclHandlerW)))
+ {
+ V_VT(value) = VT_UNKNOWN;
+ V_UNKNOWN(value) = vb ? (IUnknown*)This->vbdeclHandler : (IUnknown*)This->declHandler;
+ if (V_UNKNOWN(value)) IUnknown_AddRef(V_UNKNOWN(value));
+ return S_OK;
+ }
+
FIXME("(%p)->(%s) unsupported property\n", This, debugstr_w(prop));
return E_NOTIMPL;