Jacek Caban : mshtml: Added IPersistStream::LoadHistory implementation.

Alexandre Julliard julliard at winehq.org
Fri Nov 9 11:03:23 CST 2012


Module: wine
Branch: master
Commit: 26d396252823aa215c29db9ea68e123c29a83a1f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=26d396252823aa215c29db9ea68e123c29a83a1f

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Nov  8 18:17:55 2012 +0100

mshtml: Added IPersistStream::LoadHistory implementation.

---

 dlls/mshtml/binding.h  |    2 +
 dlls/mshtml/navigate.c |   20 ++++++++++++++-
 dlls/mshtml/persist.c  |   60 ++++++++++++++++++++++++++++++++++++++++++-----
 3 files changed, 73 insertions(+), 9 deletions(-)

diff --git a/dlls/mshtml/binding.h b/dlls/mshtml/binding.h
index fda318b..1eee469 100644
--- a/dlls/mshtml/binding.h
+++ b/dlls/mshtml/binding.h
@@ -100,6 +100,7 @@ typedef struct {
 
 #define BINDING_NAVIGATED    0x0001
 #define BINDING_REPLACE      0x0002
+#define BINDING_FROMHIST     0x0004
 
 HRESULT set_http_header(struct list*,const WCHAR*,int,const WCHAR*,int) DECLSPEC_HIDDEN;
 HRESULT create_redirect_nschannel(const WCHAR*,nsChannel*,nsChannel**) DECLSPEC_HIDDEN;
@@ -111,6 +112,7 @@ HRESULT load_nsuri(HTMLOuterWindow*,nsWineURI*,nsChannelBSC*,DWORD) DECLSPEC_HID
 HRESULT set_moniker(HTMLDocument*,IMoniker*,IBindCtx*,nsChannelBSC*,BOOL) DECLSPEC_HIDDEN;
 void prepare_for_binding(HTMLDocument*,IMoniker*,DWORD) DECLSPEC_HIDDEN;
 HRESULT super_navigate(HTMLOuterWindow*,IUri*,DWORD,const WCHAR*,BYTE*,DWORD) DECLSPEC_HIDDEN;
+HRESULT load_uri(HTMLOuterWindow*,IUri*,DWORD) DECLSPEC_HIDDEN;
 HRESULT navigate_new_window(HTMLOuterWindow*,IUri*,const WCHAR*,IHTMLWindow2**) DECLSPEC_HIDDEN;
 
 HRESULT create_channelbsc(IMoniker*,const WCHAR*,BYTE*,DWORD,BOOL,nsChannelBSC**) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index e92440e..33ebbca 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -2119,7 +2119,8 @@ HRESULT super_navigate(HTMLOuterWindow *window, IUri *uri, DWORD flags, const WC
 
         /* Silently and repeated when real loading starts? */
         window->readystate = READYSTATE_LOADING;
-        call_docview_84(window->doc_obj);
+        if(!(flags & BINDING_FROMHIST))
+            call_docview_84(window->doc_obj);
 
         task->window = window;
         task->bscallback = bsc;
@@ -2140,7 +2141,8 @@ HRESULT super_navigate(HTMLOuterWindow *window, IUri *uri, DWORD flags, const WC
 
         /* Why silently? */
         window->readystate = READYSTATE_COMPLETE;
-        call_docview_84(window->doc_obj);
+        if(!(flags & BINDING_FROMHIST))
+            call_docview_84(window->doc_obj);
 
         IUri_AddRef(uri);
         task->window = window;
@@ -2301,6 +2303,20 @@ static HRESULT navigate_uri(HTMLOuterWindow *window, IUri *uri, const WCHAR *dis
     return hres;
 }
 
+HRESULT load_uri(HTMLOuterWindow *window, IUri *uri, DWORD flags)
+{
+    BSTR display_uri;
+    HRESULT hres;
+
+    hres = IUri_GetDisplayUri(uri, &display_uri);
+    if(FAILED(hres))
+        return hres;
+
+    hres = navigate_uri(window, uri, display_uri, flags);
+    SysFreeString(display_uri);
+    return hres;
+}
+
 HRESULT navigate_url(HTMLOuterWindow *window, const WCHAR *new_url, IUri *base_uri)
 {
     BSTR display_uri;
diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c
index 2fe1cfe..649c906 100644
--- a/dlls/mshtml/persist.c
+++ b/dlls/mshtml/persist.c
@@ -48,6 +48,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 /* Undocumented notification, see tests */
 #define CMDID_EXPLORER_UPDATEHISTORY 38
 
+static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
+
 typedef struct {
     task_t header;
     HTMLDocumentObj *doc;
@@ -339,7 +341,7 @@ void prepare_for_binding(HTMLDocument *This, IMoniker *mon, DWORD flags)
                 hres = IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 63, 0, &var, &out);
                 if(SUCCEEDED(hres))
                     VariantClear(&out);
-            }else {
+            }else if(!(flags & BINDING_FROMHIST)) {
                 V_VT(&var) = VT_I4;
                 V_I4(&var) = 0;
                 IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 37, 0, &var, NULL);
@@ -810,8 +812,6 @@ static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, LPSTREAM
     IMoniker *mon;
     HRESULT hres;
 
-    static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
-
     TRACE("(%p)->(%p)\n", This, pStm);
 
     hres = CreateURLMoniker(NULL, about_blankW, &mon);
@@ -869,8 +869,6 @@ static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface)
     IMoniker *mon;
     HRESULT hres;
 
-    static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
-
     TRACE("(%p)\n", This);
 
     hres = CreateURLMoniker(NULL, about_blankW, &mon);
@@ -936,8 +934,56 @@ static HRESULT WINAPI PersistHistory_GetClassID(IPersistHistory *iface, CLSID *p
 static HRESULT WINAPI PersistHistory_LoadHistory(IPersistHistory *iface, IStream *pStream, IBindCtx *pbc)
 {
     HTMLDocument *This = impl_from_IPersistHistory(iface);
-    FIXME("(%p)->(%p %p)\n", This, pStream, pbc);
-    return E_NOTIMPL;
+    ULONG str_len, read;
+    WCHAR *uri_str;
+    IUri *uri;
+    HRESULT hres;
+
+    TRACE("(%p)->(%p %p)\n", This, pStream, pbc);
+
+    if(!This->window) {
+        FIXME("No current window\n");
+        return E_UNEXPECTED;
+    }
+
+    if(pbc)
+        FIXME("pbc not supported\n");
+
+    if(This->doc_obj->client) {
+        IOleCommandTarget *cmdtrg = NULL;
+
+        hres = IOleClientSite_QueryInterface(This->doc_obj->client, &IID_IOleCommandTarget,
+                (void**)&cmdtrg);
+        if(SUCCEEDED(hres)) {
+            IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 138, 0, NULL, NULL);
+            IOleCommandTarget_Release(cmdtrg);
+        }
+    }
+
+    hres = IStream_Read(pStream, &str_len, sizeof(str_len), &read);
+    if(FAILED(hres))
+        return hres;
+    if(read != sizeof(str_len))
+        return E_FAIL;
+
+    uri_str = heap_alloc((str_len+1)*sizeof(WCHAR));
+    if(!uri_str)
+        return E_OUTOFMEMORY;
+
+    hres = IStream_Read(pStream, uri_str, str_len*sizeof(WCHAR), &read);
+    if(SUCCEEDED(hres) && read != str_len*sizeof(WCHAR))
+        hres = E_FAIL;
+    if(SUCCEEDED(hres)) {
+        uri_str[str_len] = 0;
+        hres = CreateUri(uri_str, 0, 0, &uri);
+    }
+    heap_free(uri_str);
+    if(FAILED(hres))
+        return hres;
+
+    hres = load_uri(This->window, uri, BINDING_FROMHIST);
+    IUri_Release(uri);
+    return hres;
 }
 
 static HRESULT WINAPI PersistHistory_SaveHistory(IPersistHistory *iface, IStream *pStream)




More information about the wine-cvs mailing list