mshtml: Use proper codepage in nsIIOService::NewURI.

This commit is contained in:
Jacek Caban 2014-10-11 17:35:19 +02:00 committed by Alexandre Julliard
parent d165c05f27
commit 0d023f1968
3 changed files with 49 additions and 3 deletions

View File

@ -35,6 +35,7 @@
#include "optary.h" #include "optary.h"
#include "rpcproxy.h" #include "rpcproxy.h"
#include "shlguid.h" #include "shlguid.h"
#include "mlang.h"
#include "wine/debug.h" #include "wine/debug.h"
@ -50,6 +51,35 @@ DWORD mshtml_tls = TLS_OUT_OF_INDEXES;
static HINSTANCE shdoclc = NULL; static HINSTANCE shdoclc = NULL;
static HDC display_dc; static HDC display_dc;
static WCHAR *status_strings[IDS_STATUS_LAST-IDS_STATUS_FIRST+1]; static WCHAR *status_strings[IDS_STATUS_LAST-IDS_STATUS_FIRST+1];
static IMultiLanguage2 *mlang;
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);
}
hres = IMultiLanguage2_GetCharsetInfo(mlang, charset, &info);
if(FAILED(hres)) {
FIXME("GetCharsetInfo failed: %08x\n", hres);
return CP_UTF8;
}
return info.uiInternetEncoding;
}
static void thread_detach(void) static void thread_detach(void)
{ {
@ -83,6 +113,8 @@ static void process_detach(void)
TlsFree(mshtml_tls); TlsFree(mshtml_tls);
if(display_dc) if(display_dc)
DeleteObject(display_dc); DeleteObject(display_dc);
if(mlang)
IMultiLanguage2_Release(mlang);
free_strings(); free_strings();
} }

View File

@ -1195,6 +1195,7 @@ static inline void windowref_release(windowref_t *ref)
heap_free(ref); heap_free(ref);
} }
UINT cp_from_charset_string(BSTR) DECLSPEC_HIDDEN;
HDC get_display_dc(void) DECLSPEC_HIDDEN; HDC get_display_dc(void) DECLSPEC_HIDDEN;
HINSTANCE get_shdoclc(void) DECLSPEC_HIDDEN; HINSTANCE get_shdoclc(void) DECLSPEC_HIDDEN;
void set_statustext(HTMLDocumentObj*,INT,LPCWSTR) DECLSPEC_HIDDEN; void set_statustext(HTMLDocumentObj*,INT,LPCWSTR) DECLSPEC_HIDDEN;

View File

@ -3317,6 +3317,7 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString *
WCHAR new_spec[INTERNET_MAX_URL_LENGTH]; WCHAR new_spec[INTERNET_MAX_URL_LENGTH];
HTMLOuterWindow *window = NULL; HTMLOuterWindow *window = NULL;
const char *spec = NULL; const char *spec = NULL;
UINT cp = CP_UTF8;
IUri *urlmon_uri; IUri *urlmon_uri;
nsresult nsres; nsresult nsres;
HRESULT hres; HRESULT hres;
@ -3343,10 +3344,22 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString *
} }
} }
if(aOriginCharset && strcasecmp(aOriginCharset, "utf-8")) if(aOriginCharset && *aOriginCharset && strncasecmp(aOriginCharset, "utf", 3)) {
FIXME("Unsupported charset %s\n", debugstr_a(aOriginCharset)); BSTR charset;
int len;
MultiByteToWideChar(CP_UTF8, 0, spec, -1, new_spec, sizeof(new_spec)/sizeof(WCHAR)); len = MultiByteToWideChar(CP_UTF8, 0, aOriginCharset, -1, NULL, 0);
charset = SysAllocStringLen(NULL, len-1);
if(!charset)
return NS_ERROR_OUT_OF_MEMORY;
MultiByteToWideChar(CP_UTF8, 0, aOriginCharset, -1, charset, len);
cp = cp_from_charset_string(charset);
SysFreeString(charset);
}
MultiByteToWideChar(cp, 0, spec, -1, new_spec, sizeof(new_spec)/sizeof(WCHAR));
if(base_wine_uri) { if(base_wine_uri) {
hres = combine_url(base_wine_uri->uri, new_spec, &urlmon_uri); hres = combine_url(base_wine_uri->uri, new_spec, &urlmon_uri);