mshtml: Send more informative messages to OleInPlaceFrame

Jacek Caban jacek at codeweavers.com
Mon Aug 2 06:43:51 CDT 2010


 On 08/02/10 13:30, Alexander Nicolaysen Sørnes wrote:
> These are displayed in Internet Explorer.
>
>
> Alexander N. Sørnes
>

+LPCWSTR get_statustext(INT id, BOOL has_arg, LPCWSTR arg_in)

WHy do you need has_arg argument? Isn't NULL arg_in enough to recognize no argument?

+{
+    static LPWSTR strings[NUM_STATUS_STRINGS];
+    int index = id - IDS_STATUS_DONE;
+    DWORD maxlen = 255;
+    DWORD len = maxlen;
+    LPWSTR* p = &strings[index];
+
+    if(!*p)
+    {
+        if(has_arg)
+            len *= 3;
+
+        *p = heap_alloc(len * sizeof(WCHAR));
+        len = LoadStringW(hInst, id, *p, len);
+        len++;
+
+        if(!has_arg)
+            *p = heap_realloc(*p, len * sizeof(WCHAR));
+    }
+
+    if(has_arg)
+    {
+        LPWSTR p2 = strings[index] + maxlen;
+        LPCWSTR arg = arg_in;
+
+        if(!arg)
+        {
+            const WCHAR empty = 0;
+            arg = ∅
+            ERR("Missing arg for message (id=%d) '%s'\n", id, debugstr_w(strings[index]));
+        }
+        snprintfW(p2, (maxlen * 2) - 1, strings[index], arg);
+
+        return p2;
+    }
+
+    return *p;
+}

This caching mechanism is broken and not thread safe.

+            LPCWSTR text = get_statustext(IDS_STATUS_DONE, FALSE, NULL);
+            IOleInPlaceFrame_SetStatusText(doc_obj->frame, text);

The helper function should take care of calling SetStatusText.

     if(doc->frame)
-        IOleInPlaceFrame_SetStatusText(doc->frame, NULL /* FIXME */);
+    {
+        LPCWSTR text = get_statustext(IDS_STATUS_DOWNLOADINGFROM, TRUE, task->url);
+        CoTaskMemFree(task->url);
+        IOleInPlaceFrame_SetStatusText(doc->frame, text);
+    }


You leak task->url here if doc->frame is NULL.


Jacek




More information about the wine-devel mailing list