+// we have 2 versions of wxCharsetToCodepage(): the old one which directly
+// looks up the vlaues in the registry and the new one which is more
+// politically correct and has more chances to work on other Windows versions
+// as well but the old version is still needed for !wxUSE_FONTMAP case
+#if wxUSE_FONTMAP
+
+#include "wx/fontmap.h"
+
+extern WXDLLIMPEXP_BASE long wxEncodingToCodepage(wxFontEncoding encoding)
+{
+ // There don't seem to be symbolic names for
+ // these under Windows so I just copied the
+ // values from MSDN.
+
+ unsigned int ret;
+
+ switch (encoding)
+ {
+ case wxFONTENCODING_ISO8859_1: ret = 28591; break;
+ case wxFONTENCODING_ISO8859_2: ret = 28592; break;
+ case wxFONTENCODING_ISO8859_3: ret = 28593; break;
+ case wxFONTENCODING_ISO8859_4: ret = 28594; break;
+ case wxFONTENCODING_ISO8859_5: ret = 28595; break;
+ case wxFONTENCODING_ISO8859_6: ret = 28596; break;
+ case wxFONTENCODING_ISO8859_7: ret = 28597; break;
+ case wxFONTENCODING_ISO8859_8: ret = 28598; break;
+ case wxFONTENCODING_ISO8859_9: ret = 28599; break;
+ case wxFONTENCODING_ISO8859_10: ret = 28600; break;
+ case wxFONTENCODING_ISO8859_11: ret = 874; break;
+ // case wxFONTENCODING_ISO8859_12, // doesn't exist currently, but put it
+ case wxFONTENCODING_ISO8859_13: ret = 28603; break;
+ // case wxFONTENCODING_ISO8859_14: ret = 28604; break; // no correspondence on Windows
+ case wxFONTENCODING_ISO8859_15: ret = 28605; break;
+ case wxFONTENCODING_KOI8: ret = 20866; break;
+ case wxFONTENCODING_KOI8_U: ret = 21866; break;
+ case wxFONTENCODING_CP437: ret = 437; break;
+ case wxFONTENCODING_CP850: ret = 850; break;
+ case wxFONTENCODING_CP852: ret = 852; break;
+ case wxFONTENCODING_CP855: ret = 855; break;
+ case wxFONTENCODING_CP866: ret = 866; break;
+ case wxFONTENCODING_CP874: ret = 874; break;
+ case wxFONTENCODING_CP932: ret = 932; break;
+ case wxFONTENCODING_CP936: ret = 936; break;
+ case wxFONTENCODING_CP949: ret = 949; break;
+ case wxFONTENCODING_CP950: ret = 950; break;
+ case wxFONTENCODING_CP1250: ret = 1250; break;
+ case wxFONTENCODING_CP1251: ret = 1251; break;
+ case wxFONTENCODING_CP1252: ret = 1252; break;
+ case wxFONTENCODING_CP1253: ret = 1253; break;
+ case wxFONTENCODING_CP1254: ret = 1254; break;
+ case wxFONTENCODING_CP1255: ret = 1255; break;
+ case wxFONTENCODING_CP1256: ret = 1256; break;
+ case wxFONTENCODING_CP1257: ret = 1257; break;
+ case wxFONTENCODING_EUC_JP: ret = 20932; break;
+ case wxFONTENCODING_MACROMAN: ret = 10000; break;
+ case wxFONTENCODING_MACJAPANESE: ret = 10001; break;
+ case wxFONTENCODING_MACCHINESETRAD: ret = 10002; break;
+ case wxFONTENCODING_MACKOREAN: ret = 10003; break;
+ case wxFONTENCODING_MACARABIC: ret = 10004; break;
+ case wxFONTENCODING_MACHEBREW: ret = 10005; break;
+ case wxFONTENCODING_MACGREEK: ret = 10006; break;
+ case wxFONTENCODING_MACCYRILLIC: ret = 10007; break;
+ case wxFONTENCODING_MACTHAI: ret = 10021; break;
+ case wxFONTENCODING_MACCHINESESIMP: ret = 10008; break;
+ case wxFONTENCODING_MACCENTRALEUR: ret = 10029; break;
+ case wxFONTENCODING_MACCROATIAN: ret = 10082; break;
+ case wxFONTENCODING_MACICELANDIC: ret = 10079; break;
+ case wxFONTENCODING_MACROMANIAN: ret = 10009; break;
+ case wxFONTENCODING_UTF7: ret = 65000; break;
+ case wxFONTENCODING_UTF8: ret = 65001; break;
+ default: return -1;
+ }
+
+ if (::IsValidCodePage(ret) == 0)
+ return -1;
+
+ CPINFO info;
+ if (::GetCPInfo(ret, &info) == 0)
+ return -1;
+
+ return (long) ret;
+}
+
+extern long wxCharsetToCodepage(const char *name)
+{
+ // first get the font encoding for this charset
+ if ( !name )
+ return -1;
+
+ wxFontEncoding enc = wxFontMapperBase::Get()->CharsetToEncoding(name, false);
+ if ( enc == wxFONTENCODING_SYSTEM )
+ return -1;
+
+ // the use the helper function
+ return wxEncodingToCodepage(enc);
+}
+
+#else // !wxUSE_FONTMAP
+
+#include "wx/msw/registry.h"
+
+// this should work if Internet Exploiter is installed
+extern long wxCharsetToCodepage(const char *name)
+{
+ if (!name)
+ return GetACP();
+
+ long CP = -1;
+
+ wxString path(wxT("MIME\\Database\\Charset\\"));
+ wxString cn(name);
+
+ // follow the alias loop
+ for ( ;; )
+ {
+ wxRegKey key(wxRegKey::HKCR, path + cn);
+
+ if (!key.Exists())
+ break;
+
+ // two cases: either there's an AliasForCharset string,
+ // or there are Codepage and InternetEncoding dwords.
+ // The InternetEncoding gives us the actual encoding,
+ // the Codepage just says which Windows character set to
+ // use when displaying the data.
+ if (key.HasValue(wxT("InternetEncoding")) &&
+ key.QueryValue(wxT("InternetEncoding"), &CP))
+ break;
+
+ // no encoding, see if it's an alias
+ if (!key.HasValue(wxT("AliasForCharset")) ||
+ !key.QueryValue(wxT("AliasForCharset"), cn))
+ break;
+ }
+
+ return CP;
+}
+
+#endif // wxUSE_FONTMAP/!wxUSE_FONTMAP
+
+/*
+ Creates a hidden window with supplied window proc registering the class for
+ it if necesssary (i.e. the first time only). Caller is responsible for
+ destroying the window and unregistering the class (note that this must be
+ done because wxWidgets may be used as a DLL and so may be loaded/unloaded
+ multiple times into/from the same process so we cna't rely on automatic
+ Windows class unregistration).
+
+ pclassname is a pointer to a caller stored classname, which must initially be
+ NULL. classname is the desired wndclass classname. If function successfully
+ registers the class, pclassname will be set to classname.
+ */
+extern "C" WXDLLIMPEXP_BASE HWND
+wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc)
+{
+ wxCHECK_MSG( classname && pclassname && wndproc, NULL,
+ _T("NULL parameter in wxCreateHiddenWindow") );
+
+ // register the class fi we need to first
+ if ( *pclassname == NULL )
+ {
+ WNDCLASS wndclass;
+ wxZeroMemory(wndclass);
+
+ wndclass.lpfnWndProc = wndproc;
+ wndclass.hInstance = wxGetInstance();
+ wndclass.lpszClassName = classname;
+
+ if ( !::RegisterClass(&wndclass) )
+ {
+ wxLogLastError(wxT("RegisterClass() in wxCreateHiddenWindow"));
+
+ return NULL;
+ }
+
+ *pclassname = classname;
+ }
+
+ // next create the window
+ HWND hwnd = ::CreateWindow
+ (
+ *pclassname,
+ NULL,
+ 0, 0, 0, 0,
+ 0,
+ (HWND) NULL,
+ (HMENU)NULL,
+ wxGetInstance(),
+ (LPVOID) NULL
+ );
+
+ if ( !hwnd )
+ {
+ wxLogLastError(wxT("CreateWindow() in wxCreateHiddenWindow"));
+ }
+
+ return hwnd;
+}