X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/41524ffcc69b963ea8a5c37fceaa312dfdeb905f..e87b78335291c67025c5a763c2acfb22343f9908:/src/common/intl.cpp diff --git a/src/common/intl.cpp b/src/common/intl.cpp index 69178b2abc..aef903c92b 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -31,7 +31,11 @@ #if wxUSE_INTL // standard headers + +#ifndef __WXWINCE__ #include +#endif + #include #include #ifdef HAVE_LANGINFO_H @@ -48,6 +52,12 @@ #include "wx/dynarray.h" #endif // WX_PRECOMP +#ifdef __WIN32__ + #include "wx/msw/private.h" +#elif defined(__UNIX_LIKE__) + #include "wx/fontmap.h" // for CharsetToEncoding() +#endif + #include "wx/file.h" #include "wx/tokenzr.h" #include "wx/module.h" @@ -55,12 +65,6 @@ #include "wx/encconv.h" #include "wx/hashmap.h" -#ifdef __WIN32__ - #include "wx/msw/private.h" -#elif defined(__UNIX_LIKE__) - #include "wx/fontmap.h" // for CharsetToEncoding() -#endif - #if defined(__WXMAC__) #include "wx/mac/private.h" // includes mac headers #endif @@ -188,21 +192,37 @@ private: // all data is stored here, NULL if no data loaded size_t8 *m_pData; + // amount of memory pointed to by m_pData. + size_t32 m_nSize; + // data description size_t32 m_numStrings; // number of strings in this domain wxMsgTableEntry *m_pOrigTable, // pointer to original strings *m_pTransTable; // translated - const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 index) const - { return (const char *)(m_pData + Swap(pTable[index].ofsString)); } + // swap the 2 halves of 32 bit integer if needed + size_t32 Swap(size_t32 ui) const + { + return m_bSwapped ? (ui << 24) | ((ui & 0xff00) << 8) | + ((ui >> 8) & 0xff00) | (ui >> 24) + : ui; + } - wxString GetCharset() const; + const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 n) const + { + const wxMsgTableEntry * const ent = pTable + n; - // utility functions - // big<->little endian - inline size_t32 Swap(size_t32 ui) const; + // this check could fail for a corrupt message catalog + size_t32 ofsString = Swap(ent->ofsString); + if ( ofsString + Swap(ent->nLen) > m_nSize) + return NULL; - bool m_bSwapped; // wrong endianness? + return (const char *)(m_pData + ofsString); + } + + wxString GetCharset() const; + + bool m_bSwapped; // wrong endianness? DECLARE_NO_COPY_CLASS(wxMsgCatalogFile) }; @@ -250,22 +270,15 @@ static wxArrayString s_searchPrefixes; // wxMsgCatalogFile class // ---------------------------------------------------------------------------- -// swap the 2 halves of 32 bit integer if needed -size_t32 wxMsgCatalogFile::Swap(size_t32 ui) const -{ - return m_bSwapped ? (ui << 24) | ((ui & 0xff00) << 8) | - ((ui >> 8) & 0xff00) | (ui >> 24) - : ui; -} - wxMsgCatalogFile::wxMsgCatalogFile() { - m_pData = NULL; + m_pData = NULL; + m_nSize = 0; } wxMsgCatalogFile::~wxMsgCatalogFile() { - wxDELETEA(m_pData); + wxDELETEA(m_pData); } // return all directories to search for given prefix @@ -299,9 +312,11 @@ static wxString GetFullSearchPath(const wxChar *lang) // LC_PATH is a standard env var containing the search path for the .mo // files +#ifndef __WXWINCE__ const wxChar *pszLcPath = wxGetenv(wxT("LC_PATH")); if ( pszLcPath != NULL ) searchPath << GetAllMsgCatalogSubdirs(pszLcPath, lang); +#endif #ifdef __UNIX__ // add some standard ones and the one in the tree where wxWin was installed: @@ -414,6 +429,7 @@ bool wxMsgCatalogFile::Load(const wxChar *szDirPrefix, const wxChar *szName0) Swap(pHeader->ofsOrigTable)); m_pTransTable = (wxMsgTableEntry *)(m_pData + Swap(pHeader->ofsTransTable)); + m_nSize = nSize; // everything is fine return TRUE; @@ -616,7 +632,24 @@ bool wxLocale::Init(const wxChar *szName, wxCHECK_MSG( szLocale, FALSE, _T("no locale to set in wxLocale::Init()") ); } +#ifdef __WXWINCE__ + // FIXME: I'm guessing here + wxChar localeName[256]; + int ret = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLANGUAGE, localeName, + 256); + if (ret != 0) + { + m_pszOldLocale = wxStrdup(localeName); + } + else + m_pszOldLocale = NULL; + + // TODO: how to find languageId + // SetLocaleInfo(languageId, SORT_DEFAULT, localeName); +#else m_pszOldLocale = wxStrdup(wxSetlocale(LC_ALL, szLocale)); +#endif + if ( m_pszOldLocale == NULL ) wxLogError(_("locale '%s' can not be set."), szLocale); @@ -758,7 +791,10 @@ bool wxLocale::Init(int language, int flags) int codepage = -1; wxUint32 lcid = MAKELCID(MAKELANGID(info->WinLang, info->WinSublang), SORT_DEFAULT); + // FIXME +#ifndef __WXWINCE__ SetThreadLocale(lcid); +#endif // NB: we must translate LCID to CRT's setlocale string ourselves, // because SetThreadLocale does not modify change the // interpretation of setlocale(LC_ALL, "") call: @@ -782,7 +818,10 @@ bool wxLocale::Init(int language, int flags) } else { + // FIXME +#ifndef __WXWINCE__ retloc = wxSetlocale(LC_ALL, locale); +#endif #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS if (codepage == 0 && (const wxChar*)retloc == NULL) { @@ -794,7 +833,12 @@ bool wxLocale::Init(int language, int flags) } else { + // FIXME +#ifndef __WXWINCE__ retloc = wxSetlocale(LC_ALL, wxEmptyString); +#else + retloc = NULL; +#endif #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS if ((const wxChar*)retloc == NULL) { @@ -1514,7 +1558,12 @@ const wxLanguageInfo *wxLocale::FindLanguageInfo(const wxString& locale) wxString wxLocale::GetSysName() const { + // FIXME +#ifndef __WXWINCE__ return wxSetlocale(LC_ALL, NULL); +#else + return wxEmptyString; +#endif } // clean up @@ -1530,7 +1579,10 @@ wxLocale::~wxLocale() // restore old locale wxSetLocale(m_pOldLocale); + // FIXME +#ifndef __WXWINCE__ wxSetlocale(LC_ALL, m_pszOldLocale); +#endif free((wxChar *)m_pszOldLocale); // const_cast }