msxml3: Accept ISequentialStream as reader input.
This commit is contained in:
parent
92110cbea8
commit
5b7a55f67f
|
@ -2295,7 +2295,7 @@ static HRESULT internal_parseBuffer(saxreader *This, const char *buffer, int siz
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT internal_parseStream(saxreader *This, IStream *stream, BOOL vbInterface)
|
static HRESULT internal_parseStream(saxreader *This, ISequentialStream *stream, BOOL vbInterface)
|
||||||
{
|
{
|
||||||
saxlocator *locator;
|
saxlocator *locator;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
@ -2304,7 +2304,7 @@ static HRESULT internal_parseStream(saxreader *This, IStream *stream, BOOL vbInt
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
dataRead = 0;
|
dataRead = 0;
|
||||||
hr = IStream_Read(stream, data, sizeof(data), &dataRead);
|
hr = ISequentialStream_Read(stream, data, sizeof(data), &dataRead);
|
||||||
if(FAILED(hr)) return hr;
|
if(FAILED(hr)) return hr;
|
||||||
|
|
||||||
hr = SAXLocator_create(This, &locator, vbInterface);
|
hr = SAXLocator_create(This, &locator, vbInterface);
|
||||||
|
@ -2331,7 +2331,7 @@ static HRESULT internal_parseStream(saxreader *This, IStream *stream, BOOL vbInt
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
dataRead = 0;
|
dataRead = 0;
|
||||||
hr = IStream_Read(stream, data, sizeof(data), &dataRead);
|
hr = ISequentialStream_Read(stream, data, sizeof(data), &dataRead);
|
||||||
if (FAILED(hr)) break;
|
if (FAILED(hr)) break;
|
||||||
|
|
||||||
ret = xmlParseChunk(locator->pParserCtxt, data, dataRead, 0);
|
ret = xmlParseChunk(locator->pParserCtxt, data, dataRead, 0);
|
||||||
|
@ -2411,7 +2411,7 @@ static HRESULT internal_parse(
|
||||||
case VT_UNKNOWN:
|
case VT_UNKNOWN:
|
||||||
case VT_DISPATCH: {
|
case VT_DISPATCH: {
|
||||||
IPersistStream *persistStream;
|
IPersistStream *persistStream;
|
||||||
IStream *stream = NULL;
|
ISequentialStream *stream = NULL;
|
||||||
IXMLDOMDocument *xmlDoc;
|
IXMLDOMDocument *xmlDoc;
|
||||||
|
|
||||||
if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
|
if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
|
||||||
|
@ -2430,29 +2430,44 @@ static HRESULT internal_parse(
|
||||||
if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
|
if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
|
||||||
&IID_IPersistStream, (void**)&persistStream) == S_OK)
|
&IID_IPersistStream, (void**)&persistStream) == S_OK)
|
||||||
{
|
{
|
||||||
hr = CreateStreamOnHGlobal(NULL, TRUE, &stream);
|
IStream *stream_copy;
|
||||||
|
|
||||||
|
hr = CreateStreamOnHGlobal(NULL, TRUE, &stream_copy);
|
||||||
if(hr != S_OK)
|
if(hr != S_OK)
|
||||||
{
|
{
|
||||||
IPersistStream_Release(persistStream);
|
IPersistStream_Release(persistStream);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = IPersistStream_Save(persistStream, stream, TRUE);
|
hr = IPersistStream_Save(persistStream, stream_copy, TRUE);
|
||||||
IPersistStream_Release(persistStream);
|
IPersistStream_Release(persistStream);
|
||||||
if(hr != S_OK)
|
if(hr == S_OK)
|
||||||
{
|
IStream_QueryInterface(stream_copy, &IID_ISequentialStream, (void**)&stream);
|
||||||
IStream_Release(stream);
|
|
||||||
stream = NULL;
|
IStream_Release(stream_copy);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(stream || IUnknown_QueryInterface(V_UNKNOWN(&varInput),
|
/* try base interface first */
|
||||||
&IID_IStream, (void**)&stream) == S_OK)
|
if(!stream)
|
||||||
|
{
|
||||||
|
IUnknown_QueryInterface(V_UNKNOWN(&varInput), &IID_ISequentialStream, (void**)&stream);
|
||||||
|
if (!stream)
|
||||||
|
/* this should never happen if IStream is implemented properly, but just in case */
|
||||||
|
IUnknown_QueryInterface(V_UNKNOWN(&varInput), &IID_IStream, (void**)&stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(stream)
|
||||||
{
|
{
|
||||||
hr = internal_parseStream(This, stream, vbInterface);
|
hr = internal_parseStream(This, stream, vbInterface);
|
||||||
IStream_Release(stream);
|
ISequentialStream_Release(stream);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WARN("IUnknown* input doesn't support any of expected interfaces\n");
|
||||||
|
hr = E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
WARN("vt %d not implemented\n", V_VT(&varInput));
|
WARN("vt %d not implemented\n", V_VT(&varInput));
|
||||||
|
|
Loading…
Reference in New Issue