diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 87be6535cac..784a578b2ed 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 0b6f6aca8a5..8a366bd9537 100644 --- a/dlls/mshtml/main.c +++ b/dlls/mshtml/main.c @@ -54,24 +54,34 @@ static HDC display_dc; static WCHAR *status_strings[IDS_STATUS_LAST-IDS_STATUS_FIRST+1]; static IMultiLanguage2 *mlang; +static BOOL ensure_mlang(void) +{ + IMultiLanguage2 *new_mlang; + HRESULT hres; + + if(mlang) + return TRUE; + + 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(!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(InterlockedCompareExchangePointer((void**)&mlang, new_mlang, NULL)) - IMultiLanguage2_Release(new_mlang); - } + if(!ensure_mlang()) + return CP_UTF8; hres = IMultiLanguage2_GetCharsetInfo(mlang, charset, &info); if(FAILED(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 2f03501bc19..f57dff24a34 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;