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