summaryrefslogtreecommitdiffstats
path: root/intl/locale/windows/nsWinCharset.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'intl/locale/windows/nsWinCharset.cpp')
-rw-r--r--intl/locale/windows/nsWinCharset.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/intl/locale/windows/nsWinCharset.cpp b/intl/locale/windows/nsWinCharset.cpp
new file mode 100644
index 000000000..c84307267
--- /dev/null
+++ b/intl/locale/windows/nsWinCharset.cpp
@@ -0,0 +1,101 @@
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/ArrayUtils.h"
+
+#include "nsIPlatformCharset.h"
+#include "nsUConvPropertySearch.h"
+#include <windows.h>
+#include "nsWin32Locale.h"
+#include "nsCOMPtr.h"
+#include "nsReadableUtils.h"
+#include "nsServiceManagerUtils.h"
+#include "nsPlatformCharset.h"
+#include "nsEncoderDecoderUtils.h"
+
+using namespace mozilla;
+
+static const nsUConvProp kWinCharsets[] = {
+#include "wincharset.properties.h"
+};
+
+NS_IMPL_ISUPPORTS(nsPlatformCharset, nsIPlatformCharset)
+
+nsPlatformCharset::nsPlatformCharset()
+{
+ nsAutoString acpKey(NS_LITERAL_STRING("acp."));
+ acpKey.AppendInt(int32_t(::GetACP() & 0x00FFFF), 10);
+ MapToCharset(acpKey, mCharset);
+}
+
+nsPlatformCharset::~nsPlatformCharset()
+{
+}
+
+nsresult
+nsPlatformCharset::MapToCharset(nsAString& inANSICodePage, nsACString& outCharset)
+{
+ nsAutoCString key;
+ LossyCopyUTF16toASCII(inANSICodePage, key);
+
+ nsresult rv = nsUConvPropertySearch::SearchPropertyValue(kWinCharsets,
+ ArrayLength(kWinCharsets), key, outCharset);
+ if (NS_FAILED(rv)) {
+ outCharset.AssignLiteral("windows-1252");
+ return NS_SUCCESS_USING_FALLBACK_LOCALE;
+ }
+ return rv;
+}
+
+NS_IMETHODIMP
+nsPlatformCharset::GetCharset(nsPlatformCharsetSel selector,
+ nsACString& oResult)
+{
+ oResult = mCharset;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsPlatformCharset::GetDefaultCharsetForLocale(const nsAString& localeName, nsACString& oResult)
+{
+ LCID localeAsLCID;
+
+ //
+ // convert locale name to a code page (through the LCID)
+ //
+ nsresult rv;
+ oResult.Truncate();
+
+ rv = nsWin32Locale::GetPlatformLocale(localeName, &localeAsLCID);
+ if (NS_FAILED(rv)) { return rv; }
+
+ wchar_t acp_name[6];
+ if (GetLocaleInfoW(localeAsLCID, LOCALE_IDEFAULTANSICODEPAGE, acp_name,
+ ArrayLength(acp_name))==0) {
+ return NS_ERROR_FAILURE;
+ }
+ nsAutoString acp_key(NS_LITERAL_STRING("acp."));
+ acp_key.Append(acp_name);
+
+ return MapToCharset(acp_key, oResult);
+}
+
+NS_IMETHODIMP
+nsPlatformCharset::Init()
+{
+ return NS_OK;
+}
+
+nsresult
+nsPlatformCharset::InitGetCharset(nsACString &oString)
+{
+ return NS_OK;
+}
+
+nsresult
+nsPlatformCharset::VerifyCharset(nsCString &aCharset)
+{
+ return NS_OK;
+}