diff --git a/intl/build/nsI18nModule.cpp b/intl/build/nsI18nModule.cpp index a652e5bc239..60c1d409606 100644 --- a/intl/build/nsI18nModule.cpp +++ b/intl/build/nsI18nModule.cpp @@ -92,7 +92,6 @@ NS_DEFINE_NAMED_CID(NS_LANGUAGEATOMSERVICE_CID); NS_DEFINE_NAMED_CID(NS_CHARSETALIAS_CID); NS_DEFINE_NAMED_CID(NS_PLATFORMCHARSET_CID); #ifdef XP_WIN -NS_DEFINE_NAMED_CID(NS_WIN32LOCALE_CID); NS_DEFINE_NAMED_CID(NS_COLLATION_CID); NS_DEFINE_NAMED_CID(NS_DATETIMEFORMAT_CID); #endif @@ -130,7 +129,6 @@ static const mozilla::Module::CIDEntry kIntlCIDs[] = { { &kNS_CHARSETALIAS_CID, false, NULL, nsCharsetAlias2Constructor }, { &kNS_PLATFORMCHARSET_CID, false, NULL, nsPlatformCharsetConstructor }, #ifdef XP_WIN - { &kNS_WIN32LOCALE_CID, false, NULL, nsIWin32LocaleImplConstructor }, { &kNS_COLLATION_CID, false, NULL, nsCollationWinConstructor }, { &kNS_DATETIMEFORMAT_CID, false, NULL, nsDateTimeFormatWinConstructor }, #endif @@ -170,7 +168,6 @@ static const mozilla::Module::ContractIDEntry kIntlContracts[] = { { NS_CHARSETALIAS_CONTRACTID, &kNS_CHARSETALIAS_CID }, { NS_PLATFORMCHARSET_CONTRACTID, &kNS_PLATFORMCHARSET_CID }, #ifdef XP_WIN - { NS_WIN32LOCALE_CONTRACTID, &kNS_WIN32LOCALE_CID }, { NS_COLLATION_CONTRACTID, &kNS_COLLATION_CID }, { NS_DATETIMEFORMAT_CONTRACTID, &kNS_DATETIMEFORMAT_CID }, #endif diff --git a/intl/locale/public/Makefile.in b/intl/locale/public/Makefile.in index de416409a7d..c9216002e52 100644 --- a/intl/locale/public/Makefile.in +++ b/intl/locale/public/Makefile.in @@ -52,7 +52,7 @@ EXPORTS = \ nsIMacLocale.h \ nsIPosixLocale.h \ nsIOS2Locale.h \ - nsIWin32Locale.h \ + nsWin32Locale.h \ nsICharsetAlias.h \ nsIPlatformCharset.h \ nsLocaleCID.h \ diff --git a/intl/locale/public/nsIWin32Locale.h b/intl/locale/public/nsWin32Locale.h similarity index 73% rename from intl/locale/public/nsIWin32Locale.h rename to intl/locale/public/nsWin32Locale.h index d9d64567222..7af880803a7 100644 --- a/intl/locale/public/nsIWin32Locale.h +++ b/intl/locale/public/nsWin32Locale.h @@ -34,29 +34,31 @@ * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ -#ifndef nsIWin32Locale_h__ -#define nsIWin32Locale_h__ +#ifndef nsWin32Locale_h__ +#define nsWin32Locale_h__ - -#include "nsISupports.h" #include "nscore.h" #include "nsString.h" #include -// {D92D57C2-BA1D-11d2-AF0C-0060089FE59B} -#define NS_IWIN32LOCALE_IID \ -{ 0xd92d57c2, 0xba1d, 0x11d2, \ -{ 0xaf, 0xc, 0x0, 0x60, 0x8, 0x9f, 0xe5, 0x9b }} +class nsWin32Locale { +public: + static nsresult GetPlatformLocale(const nsAString& locale, LCID* winLCID); + static void GetXPLocale(LCID winLCID, nsAString& locale); -class nsIWin32Locale : public nsISupports { -public: - NS_DECLARE_STATIC_IID_ACCESSOR(NS_IWIN32LOCALE_IID) +private: + // Static class - Don't allow instantiation. + nsWin32Locale(void) {} - NS_IMETHOD GetPlatformLocale(const nsAString& locale, LCID* winLCID) = 0; - NS_IMETHOD GetXPLocale(LCID winLCID, nsAString& locale) = 0; + typedef LCID (WINAPI*LocaleNameToLCIDPtr)(LPCWSTR lpName, DWORD dwFlags); + typedef int (WINAPI*LCIDToLocaleNamePtr)(LCID Locale, LPWSTR lpName, + int cchName, DWORD dwFlags); + + static LocaleNameToLCIDPtr localeNameToLCID; + static LCIDToLocaleNamePtr lcidToLocaleName; + + static void initFunctionPointers (); }; -NS_DEFINE_STATIC_IID_ACCESSOR(nsIWin32Locale, NS_IWIN32LOCALE_IID) - #endif diff --git a/intl/locale/src/nsLocaleConstructors.h b/intl/locale/src/nsLocaleConstructors.h index d4edef5b65b..7c77d422161 100644 --- a/intl/locale/src/nsLocaleConstructors.h +++ b/intl/locale/src/nsLocaleConstructors.h @@ -59,7 +59,6 @@ #endif #ifdef XP_WIN -#include "nsIwin32LocaleImpl.h" #include "nsCollationWin.h" #include "nsDateTimeFormatWin.h" #endif @@ -107,7 +106,6 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsCharsetAlias2) NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPlatformCharset, Init) #ifdef XP_WIN -NS_GENERIC_FACTORY_CONSTRUCTOR(nsIWin32LocaleImpl) NS_GENERIC_FACTORY_CONSTRUCTOR(nsCollationWin) NS_GENERIC_FACTORY_CONSTRUCTOR(nsDateTimeFormatWin) #endif diff --git a/intl/locale/src/nsLocaleService.cpp b/intl/locale/src/nsLocaleService.cpp index 8c0ea00e058..3b3abcfd89d 100644 --- a/intl/locale/src/nsLocaleService.cpp +++ b/intl/locale/src/nsLocaleService.cpp @@ -55,7 +55,7 @@ #include #if defined(XP_WIN) -# include "nsIWin32Locale.h" +# include "nsWin32Locale.h" #elif defined(XP_OS2) # include "unidef.h" # include "nsIOS2Locale.h" @@ -138,34 +138,24 @@ nsLocaleService::nsLocaleService(void) : mSystemLocale(0), mApplicationLocale(0) { #ifdef XP_WIN - nsCOMPtr win32Converter = do_GetService(NS_WIN32LOCALE_CONTRACTID); - - NS_ASSERTION(win32Converter, "nsLocaleService: can't get win32 converter\n"); - nsAutoString xpLocale; - if (win32Converter) { - - nsresult result; - // - // get the system LCID - // - LCID win_lcid = GetSystemDefaultLCID(); - if (win_lcid==0) { return;} - result = win32Converter->GetXPLocale(win_lcid, xpLocale); - if (NS_FAILED(result)) { return;} - result = NewLocale(xpLocale, getter_AddRefs(mSystemLocale)); - if (NS_FAILED(result)) { return;} + // + // get the system LCID + // + LCID win_lcid = GetSystemDefaultLCID(); + NS_ENSURE_TRUE(win_lcid, ); + nsWin32Locale::GetXPLocale(win_lcid, xpLocale); + nsresult rv = NewLocale(xpLocale, getter_AddRefs(mSystemLocale)); + NS_ENSURE_SUCCESS(rv, ); - // - // get the application LCID - // - win_lcid = GetUserDefaultLCID(); - if (win_lcid==0) { return;} - result = win32Converter->GetXPLocale(win_lcid, xpLocale); - if (NS_FAILED(result)) { return;} - result = NewLocale(xpLocale, getter_AddRefs(mApplicationLocale)); - if (NS_FAILED(result)) { return;} - } + // + // get the application LCID + // + win_lcid = GetUserDefaultLCID(); + NS_ENSURE_TRUE(win_lcid, ); + nsWin32Locale::GetXPLocale(win_lcid, xpLocale); + rv = NewLocale(xpLocale, getter_AddRefs(mApplicationLocale)); + NS_ENSURE_SUCCESS(rv, ); #endif #if defined(XP_UNIX) && !defined(XP_MACOSX) nsCOMPtr posixConverter = do_GetService(NS_POSIXLOCALE_CONTRACTID); diff --git a/intl/locale/src/windows/Makefile.in b/intl/locale/src/windows/Makefile.in index e5a8d50d324..c51def7b339 100644 --- a/intl/locale/src/windows/Makefile.in +++ b/intl/locale/src/windows/Makefile.in @@ -51,7 +51,7 @@ LIBXUL_LIBRARY = 1 CPPSRCS = \ nsCollationWin.cpp \ nsDateTimeFormatWin.cpp \ - nsIWin32LocaleImpl.cpp \ + nsWin32Locale.cpp \ nsWinCharset.cpp \ $(NULL) diff --git a/intl/locale/src/windows/nsCollationWin.cpp b/intl/locale/src/windows/nsCollationWin.cpp index 81d726c4ab5..6364c405824 100644 --- a/intl/locale/src/windows/nsCollationWin.cpp +++ b/intl/locale/src/windows/nsCollationWin.cpp @@ -43,7 +43,7 @@ #include "nsLocaleCID.h" #include "nsILocaleService.h" #include "nsIPlatformCharset.h" -#include "nsIWin32Locale.h" +#include "nsWin32Locale.h" #include "nsCOMPtr.h" #include "prmem.h" #include "plstr.h" @@ -100,14 +100,10 @@ nsresult nsCollationWin::Initialize(nsILocale* locale) } // Get LCID and charset name from locale, if available - nsCOMPtr win32Locale = - do_GetService(NS_WIN32LOCALE_CONTRACTID); - if (win32Locale) { - LCID lcid; - res = win32Locale->GetPlatformLocale(localeStr, &lcid); - if (NS_SUCCEEDED(res)) { - mLCID = lcid; - } + LCID lcid; + res = nsWin32Locale::GetPlatformLocale(localeStr, &lcid); + if (NS_SUCCEEDED(res)) { + mLCID = lcid; } nsCOMPtr platformCharset = diff --git a/intl/locale/src/windows/nsDateTimeFormatWin.cpp b/intl/locale/src/windows/nsDateTimeFormatWin.cpp index 7821907272d..439fcec5478 100644 --- a/intl/locale/src/windows/nsDateTimeFormatWin.cpp +++ b/intl/locale/src/windows/nsDateTimeFormatWin.cpp @@ -41,7 +41,7 @@ #include "nsIComponentManager.h" #include "nsLocaleCID.h" #include "nsILocaleService.h" -#include "nsIWin32Locale.h" +#include "nsWin32Locale.h" #include "nsUnicharUtils.h" #include "nsCRT.h" #include "nsCOMPtr.h" @@ -102,11 +102,7 @@ nsresult nsDateTimeFormatWin::Initialize(nsILocale* locale) // Get LCID and charset name from locale, if available if (NS_SUCCEEDED(res) && !localeStr.IsEmpty()) { mLocale.Assign(localeStr); // cache locale name - - nsCOMPtr win32Locale = do_GetService(NS_WIN32LOCALE_CONTRACTID); - if (win32Locale) { - res = win32Locale->GetPlatformLocale(mLocale, (LCID *) &mLCID); - } + res = nsWin32Locale::GetPlatformLocale(mLocale, (LCID *) &mLCID); } return res; diff --git a/intl/locale/src/windows/nsIwin32LocaleImpl.h b/intl/locale/src/windows/nsIwin32LocaleImpl.h deleted file mode 100644 index 8772364f4c4..00000000000 --- a/intl/locale/src/windows/nsIwin32LocaleImpl.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either of the GNU General Public License Version 2 or later (the "GPL"), - * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nsIWin32LocaleImpl_h__ -#define nsIWin32LocaleImpl_h__ - - -#include "nsISupports.h" -#include "nscore.h" -#include "nsString.h" -#include "nsIWin32Locale.h" -#include - -class nsIWin32LocaleImpl: public nsIWin32Locale -{ - - NS_DECL_ISUPPORTS - -public: - - nsIWin32LocaleImpl(void); - ~nsIWin32LocaleImpl(void); - - NS_IMETHOD GetPlatformLocale(const nsAString& locale, LCID* winLCID); - NS_IMETHOD GetXPLocale(LCID winLCID, nsAString& locale); - - typedef LCID (WINAPI*LocaleNameToLCIDPtr)(LPCWSTR lpName, DWORD dwFlags); - typedef int (WINAPI*LCIDToLocaleNamePtr)(LCID Locale, LPWSTR lpName, - int cchName, DWORD dwFlags); - - static LocaleNameToLCIDPtr localeNameToLCID; - static LCIDToLocaleNamePtr lcidToLocaleName; - -private: - static HMODULE sKernelDLL; -}; - -#endif diff --git a/intl/locale/src/windows/nsIWin32LocaleImpl.cpp b/intl/locale/src/windows/nsWin32Locale.cpp similarity index 94% rename from intl/locale/src/windows/nsIWin32LocaleImpl.cpp rename to intl/locale/src/windows/nsWin32Locale.cpp index 735b4a01c16..12d5ffeaf60 100644 --- a/intl/locale/src/windows/nsIWin32LocaleImpl.cpp +++ b/intl/locale/src/windows/nsWin32Locale.cpp @@ -35,17 +35,15 @@ * * ***** END LICENSE BLOCK ***** */ -#include "nsISupports.h" #include "nscore.h" #include "nsString.h" +#include "nsXPCOMStrings.h" #include "nsReadableUtils.h" -#include "nsIwin32LocaleImpl.h" +#include "nsWin32Locale.h" #include "nsLocaleCID.h" #include "prprf.h" #include #include "nsCRT.h" - #include "nsReadableUtils.h" -#include "nsXPCOMStrings.h" struct iso_pair { @@ -60,9 +58,8 @@ struct iso_map iso_pair sublang_list[20]; }; -HMODULE nsIWin32LocaleImpl::sKernelDLL = NULL; -nsIWin32LocaleImpl::LocaleNameToLCIDPtr nsIWin32LocaleImpl::localeNameToLCID = NULL; -nsIWin32LocaleImpl::LCIDToLocaleNamePtr nsIWin32LocaleImpl::lcidToLocaleName = NULL; +nsWin32Locale::LocaleNameToLCIDPtr nsWin32Locale::localeNameToLCID = NULL; +nsWin32Locale::LCIDToLocaleNamePtr nsWin32Locale::lcidToLocaleName = NULL; // Older versions of VC++ and Win32 SDK and mingw don't have // macros for languages and sublanguages recently added to Win32. @@ -606,34 +603,31 @@ iso_pair dbg_list[] = #define CROATIAN_ISO_CODE "hr" #define SERBIAN_ISO_CODE "sr" -/* nsIWin32LocaleImpl */ -NS_IMPL_ISUPPORTS1(nsIWin32LocaleImpl,nsIWin32Locale) - -nsIWin32LocaleImpl::nsIWin32LocaleImpl(void) +void +nsWin32Locale::initFunctionPointers(void) { + static PRBool sInitialized = PR_FALSE; // We use the Vista and above functions if we have them - sKernelDLL = LoadLibraryW(L"kernel32.dll"); - if (sKernelDLL) { - localeNameToLCID = (LocaleNameToLCIDPtr) GetProcAddress(sKernelDLL, "LocaleNameToLCID"); - lcidToLocaleName = (LCIDToLocaleNamePtr) GetProcAddress(sKernelDLL, "LCIDToLocaleName"); + if (!sInitialized) { + HMODULE kernelDLL = GetModuleHandleW(L"kernel32.dll"); + if (kernelDLL) { + localeNameToLCID = (LocaleNameToLCIDPtr) GetProcAddress(kernelDLL, "LocaleNameToLCID"); + lcidToLocaleName = (LCIDToLocaleNamePtr) GetProcAddress(kernelDLL, "LCIDToLocaleName"); + } + sInitialized = PR_TRUE; } } -nsIWin32LocaleImpl::~nsIWin32LocaleImpl(void) -{ - if (sKernelDLL) - FreeLibrary(sKernelDLL); -} - // // the mapping routines are a first approximation to get us going on // the tier-1 languages. we are making an assumption that we can map // language and country codes separately on Windows, which isn't true // - -NS_IMETHODIMP -nsIWin32LocaleImpl::GetPlatformLocale(const nsAString& locale,LCID* winLCID) +nsresult +nsWin32Locale::GetPlatformLocale(const nsAString& locale, LCID* winLCID) { + initFunctionPointers (); + if (localeNameToLCID) { nsAutoString locale_autostr(locale); LCID lcid = localeNameToLCID(locale_autostr.get(), 0); @@ -683,9 +677,11 @@ nsIWin32LocaleImpl::GetPlatformLocale(const nsAString& locale,LCID* winLCID) #define LOCALE_NAME_MAX_LENGTH 85 #endif -NS_IMETHODIMP -nsIWin32LocaleImpl::GetXPLocale(LCID winLCID, nsAString& locale) +void +nsWin32Locale::GetXPLocale(LCID winLCID, nsAString& locale) { + initFunctionPointers (); + if (lcidToLocaleName) { WCHAR ret_locale[LOCALE_NAME_MAX_LENGTH]; @@ -695,7 +691,7 @@ nsIWin32LocaleImpl::GetXPLocale(LCID winLCID, nsAString& locale) if (rv != 0) { locale.Assign(ret_locale); - return NS_OK; + return; } } @@ -710,14 +706,12 @@ nsIWin32LocaleImpl::GetXPLocale(LCID winLCID, nsAString& locale) if (lang_id == LANG_NORWEGIAN) { if (sublang_id == SUBLANG_NORWEGIAN_BOKMAL) { locale.AssignASCII("nb-NO"); - return NS_OK; - } - if (sublang_id == SUBLANG_NORWEGIAN_NYNORSK) { + } else if (sublang_id == SUBLANG_NORWEGIAN_NYNORSK) { locale.AssignASCII("nn-NO"); - return NS_OK; + } else { + locale.AssignASCII("no-NO"); } - locale.AssignASCII("no-NO"); - return NS_OK; + return; } for(i=0;i -#include "nsIWin32Locale.h" +#include "nsWin32Locale.h" #include "nsCOMPtr.h" #include "nsReadableUtils.h" #include "nsLocaleCID.h" @@ -94,7 +94,6 @@ nsPlatformCharset::GetCharset(nsPlatformCharsetSel selector, NS_IMETHODIMP nsPlatformCharset::GetDefaultCharsetForLocale(const nsAString& localeName, nsACString& oResult) { - nsCOMPtr winLocale; LCID localeAsLCID; // @@ -103,10 +102,7 @@ nsPlatformCharset::GetDefaultCharsetForLocale(const nsAString& localeName, nsACS nsresult rv; oResult.Truncate(); - winLocale = do_GetService(NS_WIN32LOCALE_CONTRACTID, &rv); - if (NS_FAILED(rv)) { return rv; } - - rv = winLocale->GetPlatformLocale(localeName, &localeAsLCID); + rv = nsWin32Locale::GetPlatformLocale(localeName, &localeAsLCID); if (NS_FAILED(rv)) { return rv; } PRUnichar acp_name[6];