Piotr Caban : urlmon: Added Uri IPersistStream_Load implementation.
Alexandre Julliard
julliard at winehq.org
Fri Jan 13 11:44:31 CST 2012
Module: wine
Branch: master
Commit: b430abce3b56c691823e39b486c3102817966917
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b430abce3b56c691823e39b486c3102817966917
Author: Piotr Caban <piotr at codeweavers.com>
Date: Fri Jan 13 14:30:54 2012 +0100
urlmon: Added Uri IPersistStream_Load implementation.
---
dlls/urlmon/uri.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 63 insertions(+), 7 deletions(-)
diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c
index 6ee4ce7..9d3e371 100644
--- a/dlls/urlmon/uri.c
+++ b/dlls/urlmon/uri.c
@@ -5153,13 +5153,6 @@ static HRESULT WINAPI PersistStream_IsDirty(IPersistStream *iface)
return S_FALSE;
}
-static HRESULT WINAPI PersistStream_Load(IPersistStream *iface, IStream *pStm)
-{
- Uri *This = impl_from_IPersistStream(iface);
- FIXME("(%p)->(%p)\n", This, pStm);
- return E_NOTIMPL;
-}
-
struct persist_uri {
DWORD size;
DWORD unk1[2];
@@ -5169,6 +5162,69 @@ struct persist_uri {
BYTE data[1];
};
+static HRESULT WINAPI PersistStream_Load(IPersistStream *iface, IStream *pStm)
+{
+ Uri *This = impl_from_IPersistStream(iface);
+ struct persist_uri *data;
+ parse_data parse;
+ DWORD size;
+ HRESULT hr;
+
+ TRACE("(%p)->(%p)\n", This, pStm);
+
+ if(This->create_flags)
+ return E_UNEXPECTED;
+ if(!pStm)
+ return E_INVALIDARG;
+
+ hr = IStream_Read(pStm, &size, sizeof(DWORD), NULL);
+ if(FAILED(hr))
+ return hr;
+ data = heap_alloc(size);
+ if(!data)
+ return E_OUTOFMEMORY;
+ hr = IStream_Read(pStm, &data->unk1, size-sizeof(DWORD)-2, NULL);
+ if(FAILED(hr))
+ return hr;
+
+ if(size < sizeof(struct persist_uri)) {
+ heap_free(data);
+ return S_OK;
+ }
+
+ if(*(DWORD*)data->data != Uri_PROPERTY_RAW_URI) {
+ heap_free(data);
+ ERR("Can't find raw_uri\n");
+ return E_UNEXPECTED;
+ }
+
+ This->raw_uri = SysAllocString((WCHAR*)(data->data+sizeof(DWORD)*2));
+ if(!This->raw_uri) {
+ heap_free(data);
+ return E_OUTOFMEMORY;
+ }
+ This->create_flags = data->create_flags;
+ heap_free(data);
+ TRACE("%x %s\n", This->create_flags, debugstr_w(This->raw_uri));
+
+ memset(&parse, 0, sizeof(parse_data));
+ parse.uri = This->raw_uri;
+ if(!parse_uri(&parse, This->create_flags)) {
+ SysFreeString(This->raw_uri);
+ This->create_flags = 0;
+ return E_UNEXPECTED;
+ }
+
+ hr = canonicalize_uri(&parse, This, This->create_flags);
+ if(FAILED(hr)) {
+ SysFreeString(This->raw_uri);
+ This->create_flags = 0;
+ return hr;
+ }
+
+ return S_OK;
+}
+
static inline BYTE* persist_stream_add_strprop(Uri *This, BYTE *p, DWORD type, DWORD len, WCHAR *data)
{
len *= sizeof(WCHAR);
More information about the wine-cvs
mailing list