Alexander Nicolaysen Sørnes : mshtml: Send more informative messages to OleInPlaceFrame.

Alexandre Julliard julliard at winehq.org
Wed Aug 4 12:27:23 CDT 2010


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

Author: Alexander Nicolaysen Sørnes <alex at thehandofagony.com>
Date:   Fri Jul 30 21:56:05 2010 +0200

mshtml: Send more informative messages to OleInPlaceFrame.

---

 dlls/mshtml/En.rc            |    6 +++++
 dlls/mshtml/main.c           |   49 ++++++++++++++++++++++++++++++++++++++++++
 dlls/mshtml/mshtml_private.h |    1 +
 dlls/mshtml/nsevents.c       |    6 +---
 dlls/mshtml/persist.c        |   40 ++++++++++++++++++++-------------
 dlls/mshtml/resource.h       |    4 +++
 6 files changed, 86 insertions(+), 20 deletions(-)

diff --git a/dlls/mshtml/En.rc b/dlls/mshtml/En.rc
index e44b373..ba55bf7 100644
--- a/dlls/mshtml/En.rc
+++ b/dlls/mshtml/En.rc
@@ -20,6 +20,12 @@
 
 LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
 
+ STRINGTABLE
+ {
+    IDS_STATUS_DONE            "Done"
+    IDS_STATUS_DOWNLOADINGFROM "Downloading from %s..."
+}
+
 STRINGTABLE
 {
     IDS_HTMLDISABLED    "HTML rendering is currently disabled."
diff --git a/dlls/mshtml/main.c b/dlls/mshtml/main.c
index f54c6e3..d61c1f4 100644
--- a/dlls/mshtml/main.c
+++ b/dlls/mshtml/main.c
@@ -40,6 +40,7 @@
 
 #define INIT_GUID
 #include "mshtml_private.h"
+#include "resource.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
@@ -48,6 +49,7 @@ DWORD mshtml_tls = TLS_OUT_OF_INDEXES;
 
 static HINSTANCE shdoclc = NULL;
 static HDC display_dc;
+static LPWSTR status_strings[NUM_STATUS_STRINGS];
 
 static void thread_detach(void)
 {
@@ -63,6 +65,13 @@ static void thread_detach(void)
     heap_free(thread_data);
 }
 
+void free_strings(void)
+{
+    int i;
+    for(i = 0; i < NUM_STATUS_STRINGS; i++)
+        heap_free(status_strings[i]);
+}
+
 static void process_detach(void)
 {
     close_gecko();
@@ -74,6 +83,46 @@ static void process_detach(void)
         TlsFree(mshtml_tls);
     if(display_dc)
         DeleteObject(display_dc);
+
+    free_strings();
+}
+
+void set_statustext(HTMLDocumentObj* doc, INT id, LPCWSTR arg)
+{
+    int index = id - IDS_STATUS_DONE;
+    LPWSTR p = status_strings[index];
+
+    if(!doc->frame)
+        return;
+
+    if(!p)
+    {
+        DWORD len = 255;
+        p = heap_alloc(len * sizeof(WCHAR));
+        len = LoadStringW(hInst, id, p, len);
+        len++;
+        p = heap_realloc(p, len * sizeof(WCHAR));
+        if(InterlockedCompareExchangePointer((void**)&status_strings[index], p, NULL))
+        {
+            heap_free(p);
+            p = status_strings[index];
+        }
+    }
+
+    if(arg)
+    {
+        DWORD len = lstrlenW(p) + lstrlenW(arg) - 1;
+        LPWSTR buf = heap_alloc(len * sizeof(WCHAR));
+
+        snprintfW(buf, len - 1, p, arg);
+
+        p = buf;
+    }
+
+    IOleInPlaceFrame_SetStatusText(doc->frame, p);
+
+    if(arg)
+        heap_free(p);
 }
 
 HINSTANCE get_shdoclc(void)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 2db2410..ee92806 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -1024,5 +1024,6 @@ static inline void windowref_release(windowref_t *ref)
 
 HDC get_display_dc(void);
 HINSTANCE get_shdoclc(void);
+void set_statustext(HTMLDocumentObj*,INT,LPCWSTR);
 
 extern HINSTANCE hInst;
diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c
index 6da5ded..8dda1e5 100644
--- a/dlls/mshtml/nsevents.c
+++ b/dlls/mshtml/nsevents.c
@@ -34,6 +34,7 @@
 
 #include "mshtml_private.h"
 #include "htmlevent.h"
+#include "resource.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
@@ -239,10 +240,7 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event
         if(doc_obj->view_sink)
             IAdviseSink_OnViewChange(doc_obj->view_sink, DVASPECT_CONTENT, -1);
 
-        if(doc_obj->frame) {
-            static const WCHAR wszDone[] = {'D','o','n','e',0};
-            IOleInPlaceFrame_SetStatusText(doc_obj->frame, wszDone);
-        }
+        set_statustext(doc_obj, IDS_STATUS_DONE, NULL);
 
         update_title(doc_obj);
     }
diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c
index 44ccd0f..76e3773 100644
--- a/dlls/mshtml/persist.c
+++ b/dlls/mshtml/persist.c
@@ -37,6 +37,7 @@
 
 #include "mshtml_private.h"
 #include "htmlevent.h"
+#include "resource.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
@@ -44,6 +45,7 @@ typedef struct {
     task_t header;
     HTMLDocumentObj *doc;
     BOOL set_download;
+    LPOLESTR url;
 } download_proc_task_t;
 
 static BOOL use_gecko_script(LPCWSTR url)
@@ -134,8 +136,8 @@ static void set_downloading_proc(task_t *_task)
 
     TRACE("(%p)\n", doc);
 
-    if(doc->frame)
-        IOleInPlaceFrame_SetStatusText(doc->frame, NULL /* FIXME */);
+    set_statustext(doc, IDS_STATUS_DOWNLOADINGFROM, task->url);
+    CoTaskMemFree(task->url);
 
     if(!doc->client)
         return;
@@ -243,26 +245,31 @@ HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannel
     }
 
     hres = create_doc_uri(This->window, url, &nsuri);
-    CoTaskMemFree(url);
-    if(FAILED(hres))
-        return hres;
 
-    if(async_bsc) {
-        bscallback = async_bsc;
-    }else {
-        hres = create_channelbsc(mon, NULL, NULL, 0, &bscallback);
-        if(FAILED(hres))
-            return hres;
+    if(SUCCEEDED(hres))
+    {
+        if(async_bsc) {
+            bscallback = async_bsc;
+        }else {
+            hres = create_channelbsc(mon, NULL, NULL, 0, &bscallback);
+        }
     }
 
-    hres = load_nsuri(This->window, nsuri, bscallback, LOAD_INITIAL_DOCUMENT_URI);
-    nsISupports_Release((nsISupports*)nsuri); /* FIXME */
     if(SUCCEEDED(hres))
-        set_window_bscallback(This->window, bscallback);
-    if(bscallback != async_bsc)
-        IUnknown_Release((IUnknown*)bscallback);
+    {
+        hres = load_nsuri(This->window, nsuri, bscallback, LOAD_INITIAL_DOCUMENT_URI);
+        nsISupports_Release((nsISupports*)nsuri); /* FIXME */
+        if(SUCCEEDED(hres))
+            set_window_bscallback(This->window, bscallback);
+        if(bscallback != async_bsc)
+            IUnknown_Release((IUnknown*)bscallback);
+    }
+
     if(FAILED(hres))
+    {
+        CoTaskMemFree(url);
         return hres;
+    }
 
     HTMLDocument_LockContainer(This->doc_obj, TRUE);
 
@@ -275,6 +282,7 @@ HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannel
     download_task = heap_alloc(sizeof(download_proc_task_t));
     download_task->doc = This->doc_obj;
     download_task->set_download = set_download;
+    download_task->url = url;
     push_task(&download_task->header, set_downloading_proc, This->doc_obj->basedoc.task_magic);
 
     return S_OK;
diff --git a/dlls/mshtml/resource.h b/dlls/mshtml/resource.h
index 1e92637..fd69bfd 100644
--- a/dlls/mshtml/resource.h
+++ b/dlls/mshtml/resource.h
@@ -25,6 +25,10 @@
 #define IDS_DOWNLOADING     7502
 #define IDS_INSTALLING      7503
 
+#define NUM_STATUS_STRINGS         2
+#define IDS_STATUS_DOWNLOADINGFROM 7550
+#define IDS_STATUS_DONE            7551
+
 #define ID_DWL_DIALOG       7600
 #define ID_DWL_PROGRESS     7601
 #define ID_DWL_INSTALL      7602




More information about the wine-cvs mailing list