Umlaut bug fixes
authorWerner Koch <wk@gnupg.org>
Tue, 25 Apr 2006 14:51:54 +0000 (14:51 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 25 Apr 2006 14:51:54 +0000 (14:51 +0000)
12 files changed:
src/ChangeLog
src/Makefile.am
src/common.c
src/gpgmsg.cpp
src/passphrase-dialog.c
src/pgpmime.c
src/recipient-dialog.c
src/util.h
src/verify-dialog.c
src/w32-gettext.c
src/w32-gettext.h
src/xmalloc.h [new file with mode: 0644]

index 8dacf4e..5daeb1d 100644 (file)
@@ -1,3 +1,19 @@
+2006-04-25  Werner Koch  <wk@g10code.com>
+
+       * xmalloc.h: New.  Moved prototypes from util.h 
+       * w32-gettext.h:  Include it.
+       * common.c (utf8_to_wincp): Removed and replaced all callers by
+       utf8_to_native.
+       * common.c (wchar_to_utf8, utf8_to_wchar): Moved to ..
+       * w32-gettext.c: .. here.
+       (utf8_to_native): Make sure that we always return
+       a string and never NULL.
+       (native_to_utf8): New.
+       (native_to_wchar): New.
+       * gpgmsg.cpp (decrypt): Use native_to_utf8 for i18n strings
+       expected to be utf-8.
+       * pgpmime.c (pgpmime_decrypt, pgpmime_verify): Ditto.
+
 2006-04-24  Werner Koch  <wk@g10code.com>
 
        * gpgmsg.cpp (decrypt): New arg INFO_ONLY.
index cafc8dd..0898a25 100644 (file)
@@ -35,7 +35,7 @@ gpgol_SOURCES = \
        msgcache.c msgcache.h       \
         engine-gpgme.c engine.h    \
        rfc822parse.c rfc822parse.h \
-        common.c util.h intern.h    \
+        common.c util.h intern.h xmalloc.h   \
        passcache.c passcache.h     \
         config-dialog.c                    \
         passphrase-dialog.c         \
index 2007fc3..4b0a203 100644 (file)
@@ -17,6 +17,8 @@
  * along with GPGol; if not, write to the Free Software Foundation, 
  * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
  */
+
+#include <config.h>
 #include <windows.h>
 #include <time.h>
 
@@ -187,33 +189,6 @@ w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d, LPSTR e)
 }
 
 
-/* Return a malloced string encoded in UTF-8 from the wide char input
-   string STRING.  Caller must xfree this value. On failure returns
-   NULL; caller may use GetLastError to get the actual error number.
-   The result of calling this function with STRING set to NULL is not
-   defined. */
-char *
-wchar_to_utf8 (const wchar_t *string)
-{
-  int n;
-  char *result;
-
-  /* Note, that CP_UTF8 is not defined in Windows versions earlier
-     than NT.*/
-  n = WideCharToMultiByte (CP_UTF8, 0, string, -1, NULL, 0, NULL, NULL);
-  if (n < 0)
-    return NULL;
-
-  result = xmalloc (n+1);
-  n = WideCharToMultiByte (CP_UTF8, 0, string, -1, result, n, NULL, NULL);
-  if (n < 0)
-    {
-      xfree (result);
-      return NULL;
-    }
-  return result;
-}
-
 
 /* Same as above, but only convert the first LEN wchars.  */
 char *
@@ -238,31 +213,6 @@ wchar_to_utf8_2 (const wchar_t *string, size_t len)
   return result;
 }
 
-/* Return a malloced wide char string from an UTF-8 encoded input
-   string STRING.  Caller must xfree this value. On failure returns
-   NULL; caller may use GetLastError to get the actual error number.
-   The result of calling this function with STRING set to NULL is not
-   defined. */
-wchar_t *
-utf8_to_wchar (const char *string)
-{
-  int n;
-  wchar_t *result;
-
-  n = MultiByteToWideChar (CP_UTF8, 0, string, -1, NULL, 0);
-  if (n < 0)
-    return NULL;
-
-  result = xmalloc ((n+1) * sizeof *result);
-  n = MultiByteToWideChar (CP_UTF8, 0, string, -1, result, n);
-  if (n < 0)
-    {
-      xfree (result);
-      return NULL;
-    }
-  return result;
-}
-
 
 /* Same as above but convert only the first LEN characters.  STRING
    must be at least LEN characters long. */
@@ -288,17 +238,6 @@ utf8_to_wchar2 (const char *string, size_t len)
 }
 
 
-char *utf8_to_native (const char *string);
-    
-/* Convert the UTF8 encoding string STRING into the current
-   Windows charset and return it. */
-char *
-utf8_to_wincp (const char *string)
-{
-  return utf8_to_native (string);
-}
-
-  
 /* Assume STRING is a Latin-1 encoded and convert it to utf-8.
    Returns a newly malloced UTF-8 string. */
 char *
index 79e4d7a..517ee81 100644 (file)
@@ -1208,10 +1208,15 @@ GpgMsgImpl::decrypt (HWND hwnd, bool info_only)
          because this might lead to storing the new text in the
          message.  */
       if (is_pgpmime_sig || is_pgpmime_enc)
-        update_display (hwnd, this, NULL, 0, 
-                        _("[This is a PGP/MIME message]\r\n\r\n"
-                          "[Use the \"Decrypt\" button in the message window "
-                          "to show its content.]"));        
+        {
+          char *tmp = native_to_utf8 
+            (_("[This is a PGP/MIME message]\r\n\r\n"
+               "[Use the \"Decrypt\" button in the message window "
+               "to show its content.]"));        
+          update_display (hwnd, this, NULL, 0, tmp);
+          xfree (tmp);
+        }
+      
       release_attach_info (table);
       xfree (body);
       return 0;
@@ -1284,9 +1289,13 @@ GpgMsgImpl::decrypt (HWND hwnd, bool info_only)
          message.  This is useful in case of such messages with
          longish attachments which might take long to decrypt. */
       if (!body || !*body)
-        update_display (hwnd, this, exchange_cb, 0, 
-                        _("[This is a PGP/MIME message]"));        
-
+        {
+          char *tmp = native_to_utf8 (_("[This is a PGP/MIME message]"));
+          update_display (hwnd, this, exchange_cb, 0, tmp);
+          xfree (tmp);
+        }
+      
+      
       hr = message->OpenAttach (1, NULL, MAPI_BEST_ACCESS, &att);      
       if (FAILED (hr))
         {
index a4d9ddd..b35671d 100644 (file)
@@ -153,7 +153,7 @@ load_recipbox (HWND dlg, int ctlid, gpgme_ctx_t ctx)
     {
       if (key && key->uids && key->uids->uid)
        {
-         char *utf8_uid = utf8_to_wincp (key->uids->uid);
+         char *utf8_uid = utf8_to_native (key->uids->uid);
          SendDlgItemMessage (dlg, ctlid, LB_ADDSTRING, 0,
                              (LPARAM)(const char *)utf8_uid);
          xfree (utf8_uid);
@@ -249,7 +249,7 @@ load_secbox (HWND dlg, int ctlid)
       if (!key->uids->name)
         name = strdup ("");
       else
-       name = utf8_to_wincp (key->uids->name);
+       name = utf8_to_native (key->uids->name);
       email = key->uids->email;
       if (!email)
        email = "";
@@ -739,7 +739,7 @@ passphrase_callback_box (void *opaque, const char *uid_hint,
       else
         s = "[no user Id]";
       xfree (dec->user_id);
-      dec->user_id = utf8_to_wincp (s);
+      dec->user_id = utf8_to_native (s);
       dec->last_was_bad = prev_was_bad;
       if (dec->flags & 0x01)
         {
index 958de00..d73d975 100644 (file)
@@ -686,6 +686,7 @@ pgpmime_decrypt (LPSTREAM instream, int ttl, char **body,
   struct gpgme_data_cbs cbs;
   gpgme_data_t plaintext;
   pgpmime_context_t ctx;
+  char *tmp;
 
   *body = NULL;
 
@@ -709,9 +710,10 @@ pgpmime_decrypt (LPSTREAM instream, int ttl, char **body,
   if (err)
     goto leave;
 
-  err = op_decrypt_stream_to_gpgme (instream, plaintext, ttl,
-                                    _("[PGP/MIME message]"), attestation,
-                                    preview_mode);
+  tmp = native_to_utf8 (_("[PGP/MIME message]"));
+  err = op_decrypt_stream_to_gpgme (instream, plaintext, ttl, tmp,
+                                    attestation, preview_mode);
+  xfree (tmp);
   if (!err && (ctx->parser_error || ctx->line_too_long))
     err = gpg_error (GPG_ERR_GENERAL);
 
@@ -727,7 +729,10 @@ pgpmime_decrypt (LPSTREAM instream, int ttl, char **body,
             }
         }
       else
-        *body = xstrdup (_("[PGP/MIME message without plain text body]"));
+        {
+          *body = native_to_utf8 (_("[PGP/MIME message "
+                                    "without plain text body]"));
+        }
     }
 
  leave:
@@ -799,18 +804,23 @@ pgpmime_verify (const char *message, int ttl, char **body,
             }
         }
       else
-        *body = xstrdup (_("[PGP/MIME signed message without a "
-                           "plain text body]"));
+        {
+          *body = native_to_utf8 (_("[PGP/MIME signed message without a "
+                                    "plain text body]"));
+        }
     }
 
   /* Now actually verify the signature. */
   if (!err && ctx->signed_data && ctx->sig_data)
     {
+      char *tmp;
+
       gpgme_data_seek (ctx->signed_data, 0, SEEK_SET);
       gpgme_data_seek (ctx->sig_data, 0, SEEK_SET);
+      tmp = native_to_utf8 (_("[PGP/MIME signature]"));
       err = op_verify_detached_sig_gpgme (ctx->signed_data, ctx->sig_data,
-                                          _("[PGP/MIME signature]"),
-                                          attestation);
+                                          tmp, attestation);
+      xfree (tmp);
     }
 
 
index f7680ae..7a2e9eb 100644 (file)
@@ -179,7 +179,7 @@ load_rsetbox (HWND hwnd, size_t *r_arraysize)
 
       ListView_InsertItem (hwnd, &lvi);
       
-      s = utf8_to_wincp (key->uids->name);
+      s = utf8_to_native (key->uids->name);
       ListView_SetItemText (hwnd, 0, COL_NAME, s);
       xfree (s);
       
index 0f73f3e..a7ff9f4 100644 (file)
@@ -50,15 +50,10 @@ extern "C" {
 
 
 /*-- common.c --*/
-void* xmalloc (size_t n);
-void* xcalloc (size_t m, size_t n);
-char* xstrdup (const char *s);
-void  xfree (void *p);
-void out_of_core (void);
 
-char *wchar_to_utf8 (const wchar_t *string);
+#include "xmalloc.h"
+
 char *wchar_to_utf8_2 (const wchar_t *string, size_t len);
-wchar_t *utf8_to_wchar (const char *string);
 wchar_t *utf8_to_wchar2 (const char *string, size_t len);
 char *latin1_to_utf8 (const char *string);
 
index 873f43c..cfe4843 100644 (file)
@@ -67,7 +67,7 @@ load_akalist (HWND dlg, gpgme_key_t key)
     return n;
   for (u=u->next; u; u=u->next) 
     {
-      uid = utf8_to_wincp (u->uid);
+      uid = utf8_to_native (u->uid);
       SendDlgItemMessage (dlg, IDC_VRY_AKALIST, LB_ADDSTRING,
                          0, (LPARAM)(const char*)uid);
       xfree (uid);
@@ -143,7 +143,7 @@ load_sigbox (HWND dlg, gpgme_verify_result_t ctx)
   
   if (key && key->uids) 
     {
-      p = utf8_to_wincp (key->uids->uid);
+      p = utf8_to_native (key->uids->uid);
       SetDlgItemText (dlg, IDC_VRY_ISSUER, p);
       xfree (p);
       
index 672b716..d6e89a2 100644 (file)
@@ -33,6 +33,7 @@
 #include <stdint.h>
 
 #include "w32-gettext.h"
+#include "xmalloc.h"
 
 \f
 /* localname.c from gettext.  */
@@ -1432,12 +1433,36 @@ wchar_to_native (const wchar_t *string)
 }
 
 
+static wchar_t *
+native_to_wchar (const char *string)
+{
+  int n;
+  wchar_t *result;
+
+  n = MultiByteToWideChar (CP_ACP, 0, string, -1, NULL, 0);
+  if (n < 0)
+    return NULL;
+
+  result = malloc ((n+1) * sizeof *result);
+  if (!result)
+    return NULL;
+
+  n = MultiByteToWideChar (CP_ACP, 0, string, -1, result, n);
+  if (n < 0)
+    {
+      free (result);
+      return NULL;
+    }
+  return result;
+}
+
+
 /* Return a malloced wide char string from an UTF-8 encoded input
    string STRING.  Caller must free this value. On failure returns
    NULL; caller may use GetLastError to get the actual error number.
    The result of calling this function with STRING set to NULL is not
    defined. */
-static wchar_t *
+wchar_t *
 utf8_to_wchar (const char *string)
 {
   int n;
@@ -1461,6 +1486,36 @@ utf8_to_wchar (const char *string)
 }
 
 
+/* Return a malloced string encoded in UTF-8 from the wide char input
+   string STRING.  Caller must xfree this value. On failure returns
+   NULL; caller may use GetLastError to get the actual error number.
+   The result of calling this function with STRING set to NULL is not
+   defined. */
+char *
+wchar_to_utf8 (const wchar_t *string)
+{
+  int n;
+  char *result;
+
+  /* Note, that CP_UTF8 is not defined in Windows versions earlier
+     than NT.*/
+  n = WideCharToMultiByte (CP_UTF8, 0, string, -1, NULL, 0, NULL, NULL);
+  if (n < 0)
+    return NULL;
+
+  result = xmalloc (n+1);
+  n = WideCharToMultiByte (CP_UTF8, 0, string, -1, result, n, NULL, NULL);
+  if (n < 0)
+    {
+      xfree (result);
+      return NULL;
+    }
+  return result;
+}
+
+
+/* Convert UTF8 to the native codepage.  This function is guaranteed
+   to never return NULL.  Caller must xfree the return value. */
 char *
 utf8_to_native (const char *string)
 {
@@ -1469,15 +1524,41 @@ utf8_to_native (const char *string)
 
   wstring = utf8_to_wchar (string);
   if (!wstring)
-    return NULL;
+    return xstrdup ("[Error: utf8_to_wchar failed]");
 
   result = wchar_to_native (wstring);
   free (wstring);
+  if (!result)
+    result = xstrdup ("[Error: wchar_to_native failed]");
 
   return result;
 }
 
 
+/* Convert native character set to utf-8.  This is required if we want
+   to get an utf-8 string from a gettext translated function which
+   internally uses utf8_to_native.  It is guaranteed that NULL is
+   never returned.  Caller must xfree the return value. */
+char *
+native_to_utf8 (const char *string)
+{
+  char *result; 
+  wchar_t *wstring;
+
+  wstring = native_to_wchar (string);
+  if (!wstring)
+    return xstrdup ("[Error: native_to_wchar failed]");
+
+  result = wchar_to_utf8 (wstring);
+  free (wstring);
+  if (!result)
+    result = xstrdup ("[Error: wchar_to_utf8 failed]");
+
+  return result;
+}
+
+
+
 static const char*
 get_string (struct loaded_domain *domain, u32 idx)
 {
index 3ee65ef..2fbbb03 100644 (file)
@@ -53,4 +53,14 @@ const char *gettext_localename (void);
 
 static inline const char *gettext_localename (void) { return ""; }
 
+
 #endif /* !ENABLE_NLS */
+
+/* Conversion function. */
+char *wchar_to_utf8 (const wchar_t *string);
+wchar_t *utf8_to_wchar (const char *string);
+
+char *utf8_to_native (const char *string);
+char *native_to_utf8 (const char *string);
+
+
diff --git a/src/xmalloc.h b/src/xmalloc.h
new file mode 100644 (file)
index 0000000..69f026f
--- /dev/null
@@ -0,0 +1,43 @@
+/* xmalloc.h - xmalloc prototypes
+ *     Copyright (C) 2006 g10 Code GmbH
+ *
+ * This file is part of GPGol.
+ * 
+ * GPGol is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ * 
+ * GPGol 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 Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#ifndef XMALLOC_H
+#define XMALLOC_H
+
+#ifdef __cplusplus
+extern "C" {
+#if 0
+}
+#endif
+#endif
+
+/*-- common.c --*/
+void* xmalloc (size_t n);
+void* xcalloc (size_t m, size_t n);
+char* xstrdup (const char *s);
+void  xfree (void *p);
+void out_of_core (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*XMALLOC_H*/