-
- if ( m_configIsDummy && wxConfig::Get(FALSE) != NULL )
- {
- // VS: in case we created dummy m_config (see above), we want to switch back
- // to the real one as soon as one becomes available.
- delete m_config;
- m_config = wxConfig::Get(FALSE);
- m_configIsDummy = FALSE;
- // FIXME: ideally, we should add keys from dummy config to the real one now,
- // but it is a low-priority task because typical wxWin application
- // either doesn't use wxConfig at all or creates wxConfig object in
- // wxApp::OnInit(), before any real interaction with the user takes
- // place...
- }
-
- return m_config;
-}
-
-const wxString& wxFontMapper::GetConfigPath()
-{
- if ( !m_configRootPath )
- {
- // use the default
- m_configRootPath = GetDefaultConfigPath();
- }
-
- return m_configRootPath;
-}
-#endif
-
-bool wxFontMapper::ChangePath(const wxString& pathNew, wxString *pathOld)
-{
-#if wxUSE_CONFIG
- wxConfigBase *config = GetConfig();
- if ( !config )
- return FALSE;
-
- *pathOld = config->GetPath();
-
- wxString path = GetConfigPath();
- if ( path.IsEmpty() || path.Last() != wxCONFIG_PATH_SEPARATOR )
- {
- path += wxCONFIG_PATH_SEPARATOR;
- }
-
- wxASSERT_MSG( !pathNew || (pathNew[0] != wxCONFIG_PATH_SEPARATOR),
- wxT("should be a relative path") );
-
- path += pathNew;
-
- config->SetPath(path);
-
- return TRUE;
-#else
- return FALSE;
-#endif
-}
-
-void wxFontMapper::RestorePath(const wxString& pathOld)
-{
-#if wxUSE_CONFIG
- GetConfig()->SetPath(pathOld);
-#else
-#endif
-}
-
-// ----------------------------------------------------------------------------
-// charset/encoding correspondence
-// ----------------------------------------------------------------------------
-
-/* static */
-wxString wxFontMapper::GetEncodingDescription(wxFontEncoding encoding)
-{
- if ( encoding == wxFONTENCODING_DEFAULT )
- {
- return _("Default encoding");
- }
-
- size_t count = WXSIZEOF(gs_encodingDescs);
-
- wxASSERT_MSG( count == WXSIZEOF(gs_encodings),
- wxT("inconsitency detected - forgot to update one of the arrays?") );
-
- for ( size_t i = 0; i < count; i++ )
- {
- if ( gs_encodings[i] == encoding )
- {
- return wxGetTranslation(gs_encodingDescs[i]);
- }
- }
-
- wxString str;
- str.Printf(_("Unknown encoding (%d)"), encoding);
-
- return str;
-}
-
-/* static */
-wxString wxFontMapper::GetEncodingName(wxFontEncoding encoding)
-{
- if ( encoding == wxFONTENCODING_DEFAULT )
- {
- return _("default");
- }
-
- size_t count = WXSIZEOF(gs_encodingNames);
-
- wxASSERT_MSG( count == WXSIZEOF(gs_encodings),
- wxT("inconsistency detected - forgot to update one of the arrays?") );
-
- for ( size_t i = 0; i < count; i++ )
- {
- if ( gs_encodings[i] == encoding )
- {
- return gs_encodingNames[i];
- }
- }
-
- wxString str;
- str.Printf(_("unknown-%d"), encoding);
-
- return str;
-}
-
-wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset,
- bool interactive)
-{
- // a special pseudo encoding which means "don't ask me about this charset
- // any more" - we need it to avoid driving the user crazy with asking him
- // time after time about the same charset which he [presumably] doesn't
- // have the fonts fot
- static const int wxFONTENCODING_UNKNOWN = -2;
-
- wxFontEncoding encoding = wxFONTENCODING_SYSTEM;
-
- // we're going to modify it, make a copy
- wxString cs = charset;
-
-#if wxUSE_CONFIG
- // first try the user-defined settings
- wxString pathOld;
- if ( ChangePath(FONTMAPPER_CHARSET_PATH, &pathOld) )
- {
- wxConfigBase *config = GetConfig();
-
- // do we have an encoding for this charset?
- long value = config->Read(charset, -1l);
- if ( value != -1 )
- {
- if ( value == wxFONTENCODING_UNKNOWN )
- {
- // don't try to find it, in particular don't ask the user
- return wxFONTENCODING_SYSTEM;
- }
-
- if ( value >= 0 && value <= wxFONTENCODING_MAX )
- {
- encoding = (wxFontEncoding)value;
- }
- else
- {
- wxLogDebug(wxT("corrupted config data: invalid encoding %ld for charset '%s' ignored"),
- value, charset.c_str());
- }
- }
-
- if ( encoding == wxFONTENCODING_SYSTEM )
- {
- // may be we have an alias?
- config->SetPath(FONTMAPPER_CHARSET_ALIAS_PATH);
-
- wxString alias = config->Read(charset);
- if ( !!alias )
- {
- // yes, we do - use it instead
- cs = alias;
- }
- }
-
- RestorePath(pathOld);
- }
-#endif // wxUSE_CONFIG
-
- // if didn't find it there, try to recognize it ourselves
- if ( encoding == wxFONTENCODING_SYSTEM )
- {
- // trim any spaces
- cs.Trim(TRUE);
- cs.Trim(FALSE);
-
- // discard the optional quotes
- if ( !cs.empty() )
- {
- if ( cs[0u] == _T('"') && cs.Last() == _T('"') )
- {
- cs = wxString(cs.c_str(), cs.length() - 1);
- }
- }
-
- cs.MakeUpper();
-
- // nl_langinfo() under Solaris returns 646 by default which stands for
- // ISO-646, i.e. 7 bit ASCII and we should recognize it to avoid
- // warnings about unrecognized encoding on each program startup
- if ( cs.empty() || cs == _T("US-ASCII") || cs == _T("646") )
- {
- encoding = wxFONTENCODING_DEFAULT;
- }
- else if ( cs == wxT("UTF-7") )
- {
- encoding = wxFONTENCODING_UTF7;
- }
- else if ( cs == wxT("UTF-8") )
- {
- encoding = wxFONTENCODING_UTF8;
- }
- else if ( cs == wxT("KOI8-R") ||
- cs == wxT("KOI8-U") ||
- cs == wxT("KOI8-RU") )
- {
- // although koi8-ru is not strictly speaking the same as koi8-r,
- // they are similar enough to make mapping it to koi8 better than
- // not reckognizing it at all
- encoding = wxFONTENCODING_KOI8;
- }
- else if ( cs.Left(3) == wxT("ISO") )
- {
- // the dash is optional (or, to be exact, it is not, but
- // several brokenmails "forget" it)
- const wxChar *p = cs.c_str() + 3;
- if ( *p == wxT('-') )
- p++;
-
- unsigned int value;
- if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 )
- {
- // make it 0 based and check that it is strictly positive in
- // the process (no such thing as iso8859-0 encoding)
- if ( (value-- > 0) &&
- (value < wxFONTENCODING_ISO8859_MAX -
- wxFONTENCODING_ISO8859_1) )
- {
- // it's a valid ISO8859 encoding
- value += wxFONTENCODING_ISO8859_1;
- encoding = (wxFontEncoding)value;
- }
- }
- }
- else // check for Windows charsets
- {
- size_t len;
- if ( cs.Left(7) == wxT("WINDOWS") )
- {
- len = 7;
- }
- else if ( cs.Left(2) == wxT("CP") )
- {
- len = 2;
- }
- else // not a Windows encoding
- {
- len = 0;
- }
-
- if ( len )
- {
- const wxChar *p = cs.c_str() + len;
- if ( *p == wxT('-') )
- p++;
-
- int value;
- if ( wxSscanf(p, wxT("%u"), &value) == 1 )
- {
- if ( value >= 1250 )
- {
- value -= 1250;
- if ( value < wxFONTENCODING_CP12_MAX -
- wxFONTENCODING_CP1250 )
- {
- // a valid Windows code page
- value += wxFONTENCODING_CP1250;
- encoding = (wxFontEncoding)value;
- }
- }
-
- switch ( value )
- {
- case 932:
- encoding = wxFONTENCODING_CP932;
- break;
-
- case 936:
- encoding = wxFONTENCODING_CP936;
- break;
-
- case 949:
- encoding = wxFONTENCODING_CP949;
- break;
-
- case 950:
- encoding = wxFONTENCODING_CP950;
- break;
- }
- }
- }
- }
- //else: unknown
- }
-
-#if wxUSE_GUI
- // if still no luck, ask the user - unless disabled
- if ( (encoding == wxFONTENCODING_SYSTEM) && interactive )