gpg: Try to use the passphrase from the primary for --quick-addkey.
[gnupg.git] / common / utf8conv.c
index bfd00c7..83e6eae 100644 (file)
@@ -2,9 +2,9 @@
  * Copyright (C) 1994, 1998, 1999, 2000, 2001, 2003, 2006,
  *               2008, 2010  Free Software Foundation, Inc.
  *
- * This file is part of JNLIB, which is a subsystem of GnuPG.
+ * This file is part of GnuPG.
  *
- * JNLIB is free software; you can redistribute it and/or modify it
+ * GnuPG is free software; you can redistribute it and/or modify it
  * under the terms of either
  *
  *   - the GNU Lesser General Public License as published by the Free
@@ -19,7 +19,7 @@
  *
  * or both in parallel, as here.
  *
- * JNLIB is distributed in the hope that it will be useful, but
+ * GnuPG is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
 #include <langinfo.h>
 #endif
 #include <errno.h>
-#ifndef HAVE_ANDROID_SYSTEM
+
+#if HAVE_W32_SYSTEM
+# /* Tell libgpg-error to provide the iconv macros.  */
+# define GPGRT_ENABLE_W32_ICONV_MACROS 1
+#elif HAVE_ANDROID_SYSTEM
+# /* No iconv support.  */
+#else
 # include <iconv.h>
 #endif
 
+
 #include "util.h"
 #include "common-defs.h"
 #include "i18n.h"
@@ -127,12 +134,10 @@ handle_iconv_error (const char *to, const char *from, int use_fallback)
 
   if (use_fallback)
     {
-      /* To avoid further error messages we fallback to Latin-1 for the
-         native encoding.  This is justified as one can expect that on a
-         utf-8 enabled system nl_langinfo() will work and thus we won't
-         never get to here.  Thus Latin-1 seems to be a reasonable
-         default.  */
-      active_charset_name = "iso-8859-1";
+      /* To avoid further error messages we fallback to UTF-8 for the
+         native encoding.  Nowadays this seems to be the best bet in
+         case of errors from iconv or nl_langinfo.  */
+      active_charset_name = "utf-8";
       no_translation = 0;
       use_iconv = 0;
     }
@@ -246,8 +251,8 @@ set_native_charset (const char *newset)
      as Latin-1.  This makes sense because many Unix system don't have
      their locale set up properly and thus would get annoying error
      messages and we have to handle all the "bug" reports. Latin-1 has
-     always been the character set used for 8 bit characters on Unix
-     systems. */
+     traditionally been the character set used for 8 bit characters on
+     Unix systems. */
   if ( !*newset
        || !ascii_strcasecmp (newset, "8859-1" )
        || !ascii_strcasecmp (newset, "646" )
@@ -702,7 +707,8 @@ jnlib_iconv (jnlib_iconv_t cd,
              const char **inbuf, size_t *inbytesleft,
              char **outbuf, size_t *outbytesleft)
 {
-  return iconv ((iconv_t)cd, (char**)inbuf, inbytesleft, outbuf, outbytesleft);
+  return iconv ((iconv_t)cd, (ICONV_CONST char**)inbuf, inbytesleft,
+                outbuf, outbytesleft);
 }
 
 /* Wrapper function for iconv_close, required for W32 as we dlopen that
@@ -715,17 +721,17 @@ jnlib_iconv_close (jnlib_iconv_t cd)
 
 
 #ifdef HAVE_W32_SYSTEM
-/* Return a malloced string encoded in UTF-8 from the wide char input
+/* Return a malloced string encoded for CODEPAGE from the wide char input
    string STRING.  Caller must free this value.  Returns NULL and sets
    ERRNO on failure.  Calling this function with STRING set to NULL is
    not defined.  */
-char *
-wchar_to_utf8 (const wchar_t *string)
+static char *
+wchar_to_cp (const wchar_t *string, unsigned int codepage)
 {
   int n;
   char *result;
 
-  n = WideCharToMultiByte (CP_UTF8, 0, string, -1, NULL, 0, NULL, NULL);
+  n = WideCharToMultiByte (codepage, 0, string, -1, NULL, 0, NULL, NULL);
   if (n < 0)
     {
       gpg_err_set_errno (EINVAL);
@@ -736,7 +742,7 @@ wchar_to_utf8 (const wchar_t *string)
   if (!result)
     return NULL;
 
-  n = WideCharToMultiByte (CP_UTF8, 0, string, -1, result, n, NULL, NULL);
+  n = WideCharToMultiByte (codepage, 0, string, -1, result, n, NULL, NULL);
   if (n < 0)
     {
       xfree (result);
@@ -747,18 +753,18 @@ wchar_to_utf8 (const wchar_t *string)
 }
 
 
-/* Return a malloced wide char string from an UTF-8 encoded input
+/* Return a malloced wide char string from a CODEPAGE encoded input
    string STRING.  Caller must free this value.  Returns NULL and sets
    ERRNO on failure.  Calling this function with STRING set to NULL is
    not defined.  */
-wchar_t *
-utf8_to_wchar (const char *string)
+static wchar_t *
+cp_to_wchar (const char *string, unsigned int codepage)
 {
   int n;
   size_t nbytes;
   wchar_t *result;
 
-  n = MultiByteToWideChar (CP_UTF8, 0, string, -1, NULL, 0);
+  n = MultiByteToWideChar (codepage, 0, string, -1, NULL, 0);
   if (n < 0)
     {
       gpg_err_set_errno (EINVAL);
@@ -775,7 +781,7 @@ utf8_to_wchar (const char *string)
   if (!result)
     return NULL;
 
-  n = MultiByteToWideChar (CP_UTF8, 0, string, -1, result, n);
+  n = MultiByteToWideChar (codepage, 0, string, -1, result, n);
   if (n < 0)
     {
       xfree (result);
@@ -784,4 +790,49 @@ utf8_to_wchar (const char *string)
     }
   return result;
 }
+
+
+/* Return a malloced string encoded in the active code page from the
+ * wide char input string STRING.  Caller must free this value.
+ * Returns NULL and sets ERRNO on failure.  Calling this function with
+ * STRING set to NULL is not defined.  */
+char *
+wchar_to_native (const wchar_t *string)
+{
+  return wchar_to_cp (string, CP_ACP);
+}
+
+
+/* Return a malloced wide char string from an UTF-8 encoded input
+ * string STRING.  Caller must free this value.  Returns NULL and sets
+ * ERRNO on failure.  Calling this function with STRING set to NULL is
+ * not defined.  */
+wchar_t *
+native_to_wchar (const char *string)
+{
+  return cp_to_wchar (string, CP_ACP);
+}
+
+
+/* Return a malloced string encoded in UTF-8 from the wide char input
+ * string STRING.  Caller must free this value.  Returns NULL and sets
+ * ERRNO on failure.  Calling this function with STRING set to NULL is
+ * not defined.  */
+char *
+wchar_to_utf8 (const wchar_t *string)
+{
+  return wchar_to_cp (string, CP_UTF8);
+}
+
+
+/* Return a malloced wide char string from an UTF-8 encoded input
+ * string STRING.  Caller must free this value.  Returns NULL and sets
+ * ERRNO on failure.  Calling this function with STRING set to NULL is
+ * not defined.  */
+wchar_t *
+utf8_to_wchar (const char *string)
+{
+  return cp_to_wchar (string, CP_UTF8);
+}
+
 #endif /*HAVE_W32_SYSTEM*/