msxml3: Move document loading from stream to a separate function.

This commit is contained in:
Nikolay Sivov 2012-11-26 23:07:24 -05:00 committed by Alexandre Julliard
parent 79084be3c1
commit b296b08a5c
1 changed files with 31 additions and 20 deletions

View File

@ -718,46 +718,45 @@ static HRESULT WINAPI PersistStreamInit_IsDirty(
return S_FALSE; return S_FALSE;
} }
static HRESULT WINAPI PersistStreamInit_Load( static HRESULT domdoc_load_from_stream(domdoc *doc, ISequentialStream *stream)
IPersistStreamInit *iface, LPSTREAM pStm)
{ {
domdoc *This = impl_from_IPersistStreamInit(iface);
HRESULT hr;
HGLOBAL hglobal;
DWORD read, written, len; DWORD read, written, len;
BYTE buf[4096];
char *ptr;
xmlDocPtr xmldoc = NULL; xmlDocPtr xmldoc = NULL;
HGLOBAL hglobal;
BYTE buf[4096];
HRESULT hr;
char *ptr;
TRACE("(%p)->(%p)\n", This, pStm); if (doc->stream)
{
IStream_Release(doc->stream);
doc->stream = NULL;
}
if (!pStm) hr = CreateStreamOnHGlobal(NULL, TRUE, &doc->stream);
return E_INVALIDARG;
hr = CreateStreamOnHGlobal(NULL, TRUE, &This->stream);
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
do do
{ {
IStream_Read(pStm, buf, sizeof(buf), &read); ISequentialStream_Read(stream, buf, sizeof(buf), &read);
hr = IStream_Write(This->stream, buf, read, &written); hr = IStream_Write(doc->stream, buf, read, &written);
} while(SUCCEEDED(hr) && written != 0 && read != 0); } while(SUCCEEDED(hr) && written != 0 && read != 0);
if (FAILED(hr)) if (FAILED(hr))
{ {
ERR("Failed to copy stream\n"); ERR("failed to copy stream 0x%08x\n", hr);
return hr; return hr;
} }
hr = GetHGlobalFromStream(This->stream, &hglobal); hr = GetHGlobalFromStream(doc->stream, &hglobal);
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
len = GlobalSize(hglobal); len = GlobalSize(hglobal);
ptr = GlobalLock(hglobal); ptr = GlobalLock(hglobal);
if (len != 0) if (len)
xmldoc = doparse(This, ptr, len, XML_CHAR_ENCODING_NONE); xmldoc = doparse(doc, ptr, len, XML_CHAR_ENCODING_NONE);
GlobalUnlock(hglobal); GlobalUnlock(hglobal);
if (!xmldoc) if (!xmldoc)
@ -768,7 +767,19 @@ static HRESULT WINAPI PersistStreamInit_Load(
xmldoc->_private = create_priv(); xmldoc->_private = create_priv();
return attach_xmldoc(This, xmldoc); return attach_xmldoc(doc, xmldoc);
}
static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, IStream *stream)
{
domdoc *This = impl_from_IPersistStreamInit(iface);
TRACE("(%p)->(%p)\n", This, stream);
if (!stream)
return E_INVALIDARG;
return domdoc_load_from_stream(This, (ISequentialStream*)stream);
} }
static HRESULT WINAPI PersistStreamInit_Save( static HRESULT WINAPI PersistStreamInit_Save(
@ -2140,7 +2151,7 @@ static HRESULT WINAPI domdoc_load(
else else
{ {
/* ISequentialStream */ /* ISequentialStream */
FIXME("Unknown type not supported (%d) (%p)(%p)\n", hr, pNewDoc, V_UNKNOWN(&source)->lpVtbl); FIXME("Unknown type not supported (0x%08x) (%p)(%p)\n", hr, pNewDoc, V_UNKNOWN(&source)->lpVtbl);
} }
break; break;
default: default: