Jacek Caban : mshtml: Added IHTMLDocument2:: get_defaultCharset implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jan 12 12:15:22 CST 2016


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jan 12 14:42:46 2016 +0100

mshtml: Added IHTMLDocument2::get_defaultCharset implementation.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/htmldoc.c        |  7 ++++--
 dlls/mshtml/main.c           | 53 +++++++++++++++++++++++++++++++++-----------
 dlls/mshtml/mshtml_private.h |  1 +
 3 files changed, 46 insertions(+), 15 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 87be653..784a578 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -921,8 +921,11 @@ static HRESULT WINAPI HTMLDocument_put_defaultCharset(IHTMLDocument2 *iface, BST
 static HRESULT WINAPI HTMLDocument_get_defaultCharset(IHTMLDocument2 *iface, BSTR *p)
 {
     HTMLDocument *This = impl_from_IHTMLDocument2(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    *p = charset_string_from_cp(GetACP());
+    return *p ? S_OK : E_OUTOFMEMORY;
 }
 
 static HRESULT WINAPI HTMLDocument_get_mimeType(IHTMLDocument2 *iface, BSTR *p)
diff --git a/dlls/mshtml/main.c b/dlls/mshtml/main.c
index 0b6f6ac..8a366bd 100644
--- a/dlls/mshtml/main.c
+++ b/dlls/mshtml/main.c
@@ -54,25 +54,35 @@ static HDC display_dc;
 static WCHAR *status_strings[IDS_STATUS_LAST-IDS_STATUS_FIRST+1];
 static IMultiLanguage2 *mlang;
 
-UINT cp_from_charset_string(BSTR charset)
+static BOOL ensure_mlang(void)
 {
-    MIMECSETINFO info;
+    IMultiLanguage2 *new_mlang;
     HRESULT hres;
 
-    if(!mlang) {
-        IMultiLanguage2 *new_mlang;
-
-        hres = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
-                &IID_IMultiLanguage2, (void**)&new_mlang);
-        if(FAILED(hres)) {
-            ERR("Could not create CMultiLanguage instance\n");
-            return CP_UTF8;
-        }
+    if(mlang)
+        return TRUE;
 
-        if(InterlockedCompareExchangePointer((void**)&mlang, new_mlang, NULL))
-            IMultiLanguage2_Release(new_mlang);
+    hres = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
+            &IID_IMultiLanguage2, (void**)&new_mlang);
+    if(FAILED(hres)) {
+        ERR("Could not create CMultiLanguage instance\n");
+        return FALSE;
     }
 
+    if(InterlockedCompareExchangePointer((void**)&mlang, new_mlang, NULL))
+        IMultiLanguage2_Release(new_mlang);
+
+    return TRUE;
+}
+
+UINT cp_from_charset_string(BSTR charset)
+{
+    MIMECSETINFO info;
+    HRESULT hres;
+
+    if(!ensure_mlang())
+        return CP_UTF8;
+
     hres = IMultiLanguage2_GetCharsetInfo(mlang, charset, &info);
     if(FAILED(hres)) {
         FIXME("GetCharsetInfo failed: %08x\n", hres);
@@ -82,6 +92,23 @@ UINT cp_from_charset_string(BSTR charset)
     return info.uiInternetEncoding;
 }
 
+BSTR charset_string_from_cp(UINT cp)
+{
+    MIMECPINFO info;
+    HRESULT hres;
+
+    if(!ensure_mlang())
+        return SysAllocString(NULL);
+
+    hres = IMultiLanguage2_GetCodePageInfo(mlang, cp, GetUserDefaultUILanguage(), &info);
+    if(FAILED(hres)) {
+        ERR("GetCodePageInfo failed: %08x\n", hres);
+        return SysAllocString(NULL);
+    }
+
+    return SysAllocString(info.wszWebCharset);
+}
+
 static void thread_detach(void)
 {
     thread_data_t *thread_data;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 2f03501..f57dff2 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -1271,6 +1271,7 @@ static inline void windowref_release(windowref_t *ref)
 }
 
 UINT cp_from_charset_string(BSTR) DECLSPEC_HIDDEN;
+BSTR charset_string_from_cp(UINT) DECLSPEC_HIDDEN;
 HDC get_display_dc(void) DECLSPEC_HIDDEN;
 HINSTANCE get_shdoclc(void) DECLSPEC_HIDDEN;
 void set_statustext(HTMLDocumentObj*,INT,LPCWSTR) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list