[balsa/wip/gtk4: 218/351] gmime-gpgme-signature: Declare it final



commit 1a61cb5e2d6161720030539ed8823d4d88d3e9e3
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Tue Mar 13 13:47:48 2018 -0400

    gmime-gpgme-signature: Declare it final
    
    Use G_DECLARE_FINAL_TYPE for GmimeGpgmeSignature, take all members
    private, and provide getters and a setter.

 libbalsa/body.c                  |   39 ++++--
 libbalsa/gmime-gpgme-signature.c |  286 ++++++++++++++++++++++++--------------
 libbalsa/gmime-gpgme-signature.h |   92 ++++++-------
 libbalsa/gmime-multipart-crypt.c |    2 +-
 libbalsa/libbalsa-gpgme.c        |    2 +-
 libbalsa/rfc3156.c               |   14 ++-
 src/balsa-message.c              |   20 ++--
 src/balsa-mime-widget-crypto.c   |   34 +++--
 src/balsa-mime-widget-message.c  |   17 ++-
 src/balsa-print-object-header.c  |    7 +-
 src/print-gtk.c                  |    3 +-
 11 files changed, 313 insertions(+), 203 deletions(-)
---
diff --git a/libbalsa/body.c b/libbalsa/body.c
index 83d2f4f..d93e942 100644
--- a/libbalsa/body.c
+++ b/libbalsa/body.c
@@ -874,21 +874,32 @@ libbalsa_message_body_get_by_id(LibBalsaMessageBody * body,
 
 #ifdef HAVE_GPGME
 LibBalsaMsgProtectState
-libbalsa_message_body_protect_state(LibBalsaMessageBody *body)
+libbalsa_message_body_protect_state(LibBalsaMessageBody * body)
 {
-       LibBalsaMsgProtectState state;
-
-       if ((body == NULL) || (body->sig_info == NULL) || (body->sig_info->status == GPG_ERR_NOT_SIGNED) ||
-               (body->sig_info->status == GPG_ERR_CANCELED)) {
-               state = LIBBALSA_MSG_PROTECT_NONE;
-       } else if (body->sig_info->status != GPG_ERR_NO_ERROR) {
-               state = LIBBALSA_MSG_PROTECT_SIGN_BAD;
-       } else if ((body->sig_info->summary & GPGME_SIGSUM_VALID) == GPGME_SIGSUM_VALID) {
-               state = LIBBALSA_MSG_PROTECT_SIGN_GOOD;
-       } else {
-               state = LIBBALSA_MSG_PROTECT_SIGN_NOTRUST;
-       }
+    gpgme_error_t status;
+    LibBalsaMsgProtectState state;
+
+    if ((body == NULL) || (body->sig_info == NULL)) {
+        return LIBBALSA_MSG_PROTECT_NONE;
+    }
+
+    status = g_mime_gpgme_sigstat_get_status(body->sig_info);
+
+    if (status == GPG_ERR_NOT_SIGNED || status == GPG_ERR_CANCELED) {
+        state = LIBBALSA_MSG_PROTECT_NONE;
+    } else if (status != GPG_ERR_NO_ERROR) {
+        state = LIBBALSA_MSG_PROTECT_SIGN_BAD;
+    } else {
+        gpgme_sigsum_t summary =
+            g_mime_gpgme_sigstat_get_summary(body->sig_info);
+
+        if ((summary & GPGME_SIGSUM_VALID) == GPGME_SIGSUM_VALID) {
+            state = LIBBALSA_MSG_PROTECT_SIGN_GOOD;
+        } else {
+            state = LIBBALSA_MSG_PROTECT_SIGN_NOTRUST;
+        }
+    }
 
-       return state;
+    return state;
 }
 #endif
diff --git a/libbalsa/gmime-gpgme-signature.c b/libbalsa/gmime-gpgme-signature.c
index 746a60e..23f5199 100644
--- a/libbalsa/gmime-gpgme-signature.c
+++ b/libbalsa/gmime-gpgme-signature.c
@@ -1,24 +1,24 @@
 /* -*-mode:c; c-style:k&r; c-basic-offset:4; -*- */
 /*
  * gmime/gpgme glue layer library
- * Copyright (C) 2004-2016 Albrecht Dreß <albrecht dress arcor de>
+ * Copyright (C) 2004-2018 Albrecht Dreß <albrecht dress arcor de>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option) 
+ * the Free Software Foundation; either version 2, or (at your option)
  * any later version.
- *  
+ *
  * This program 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  
+ * 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.
- *  
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #if defined(HAVE_CONFIG_H) && HAVE_CONFIG_H
-# include "config.h"
+#   include "config.h"
 #endif                          /* HAVE_CONFIG_H */
 
 #include <ctype.h>
@@ -34,116 +34,120 @@
 #include "gmime-gpgme-signature.h"
 
 #ifdef G_LOG_DOMAIN
-#  undef G_LOG_DOMAIN
+#   undef G_LOG_DOMAIN
 #endif
 #define G_LOG_DOMAIN "crypto"
 
 
 /* stuff for the signature status as returned by gpgme as an GObject */
-static GObjectClass *g_mime_gpgme_sigstat_parent_class = NULL;
-
-static void g_mime_gpgme_sigstat_class_init(GMimeGpgmeSigstatClass *
-                                           klass);
-static void g_mime_gpgme_sigstat_finalize(GMimeGpgmeSigstat * self);
 
+static void g_mime_gpgme_sigstat_class_init(GMimeGpgmeSigstatClass *klass);
+static void g_mime_gpgme_sigstat_init(GMimeGpgmeSigstat *sigstat);
+static void g_mime_gpgme_sigstat_finalize(GMimeGpgmeSigstat *sigstat);
 
 /* GMimeGpgmeSigstat related stuff */
-GType
-g_mime_gpgme_sigstat_get_type(void)
-{
-    static GType g_mime_gpgme_sigstat_type = 0;
-
-    if (!g_mime_gpgme_sigstat_type) {
-       static const GTypeInfo g_mime_gpgme_sigstat_info = {
-           sizeof(GMimeGpgmeSigstatClass),     /* class_size */
-           NULL,               /* base_init */
-           NULL,               /* base_finalize */
-           (GClassInitFunc) g_mime_gpgme_sigstat_class_init,   /* class_init */
-           NULL,               /* class_finalize */
-           NULL,               /* class_data */
-           sizeof(GMimeGpgmeSigstat),  /* instance_size */
-           0,                  /* n_preallocs */
-           NULL,           /* instance_init */
-           /* no value_table */
-       };
-
-       g_mime_gpgme_sigstat_type =
-           g_type_register_static(G_TYPE_OBJECT, "GMimeGpgmeSigstat",
-                                  &g_mime_gpgme_sigstat_info, 0);
-    }
 
-    return g_mime_gpgme_sigstat_type;
+struct _GMimeGpgmeSigstat {
+    GObject parent;
+
+    /* results form gpgme's verify operation */
+    gpgme_protocol_t protocol;
+    gpgme_sigsum_t summary;
+    gpgme_error_t status;
+    gpgme_validity_t validity;
+    gchar *fingerprint;
+    time_t sign_time;
+
+    /* information about the key used to create the signature */
+    gpgme_key_t key;
+};
+
+struct _GMimeGpgmeSigstatClass {
+    GObjectClass parent;
+};
+
+G_DEFINE_TYPE(GMimeGpgmeSigstat, g_mime_gpgme_sigstat, G_TYPE_OBJECT)
+
+static void
+g_mime_gpgme_sigstat_init(GMimeGpgmeSigstat *sigstat)
+{
 }
 
 
 GMimeGpgmeSigstat *
 g_mime_gpgme_sigstat_new(gpgme_ctx_t ctx)
 {
-       GMimeGpgmeSigstat *result;
+    GMimeGpgmeSigstat *sigstat;
 
-       result = GMIME_GPGME_SIGSTAT(g_object_new(GMIME_TYPE_GPGME_SIGSTAT, NULL));
-       result->protocol = gpgme_get_protocol(ctx);
-       result->status = GPG_ERR_NOT_SIGNED;
-    return result;
+    sigstat = GMIME_GPGME_SIGSTAT(g_object_new(GMIME_TYPE_GPGME_SIGSTAT, NULL));
+    sigstat->protocol = gpgme_get_protocol(ctx);
+    sigstat->status = GPG_ERR_NOT_SIGNED;
+
+    return sigstat;
 }
 
 
 GMimeGpgmeSigstat *
 g_mime_gpgme_sigstat_new_from_gpgme_ctx(gpgme_ctx_t ctx)
 {
-    GMimeGpgmeSigstat *sig_stat;
+    GMimeGpgmeSigstat *sigstat;
     gpgme_verify_result_t result;
 
     g_return_val_if_fail(ctx, NULL);
-    sig_stat = g_mime_gpgme_sigstat_new(ctx);
+    sigstat = g_mime_gpgme_sigstat_new(ctx);
 
     /* try to retrieve the result of a verify operation */
     result = gpgme_op_verify_result(ctx);
     if ((result != NULL) && (result->signatures != NULL)) {
         /* there is at least one signature */
-        sig_stat->fingerprint = g_strdup(result->signatures->fpr);
-        sig_stat->sign_time = result->signatures->timestamp;
-        sig_stat->summary = result->signatures->summary;
-        sig_stat->status = gpgme_err_code(result->signatures->status);
-        sig_stat->validity = result->signatures->validity;
+        sigstat->fingerprint = g_strdup(result->signatures->fpr);
+        sigstat->sign_time = result->signatures->timestamp;
+        sigstat->summary = result->signatures->summary;
+        sigstat->status = gpgme_err_code(result->signatures->status);
+        sigstat->validity = result->signatures->validity;
     }
 
-       return sig_stat;
+    return sigstat;
 }
 
+
 void
 g_mime_gpgme_sigstat_load_key(GMimeGpgmeSigstat *sigstat)
 {
-       g_return_if_fail(GMIME_IS_GPGME_SIGSTAT(sigstat));
+    g_return_if_fail(GMIME_IS_GPGME_SIGSTAT(sigstat));
 
-       if ((sigstat->key == NULL) && ((sigstat->summary & GPGME_SIGSUM_KEY_MISSING) == 0)) {
-               gpgme_ctx_t ctx;
+    if ((sigstat->key == NULL) && ((sigstat->summary & GPGME_SIGSUM_KEY_MISSING) == 0)) {
+        gpgme_ctx_t ctx;
 
-               ctx = libbalsa_gpgme_new_with_proto(sigstat->protocol, NULL, NULL, NULL);
-               sigstat->key = libbalsa_gpgme_load_key(ctx, sigstat->fingerprint, NULL);
-               gpgme_release(ctx);
-       }
+        ctx = libbalsa_gpgme_new_with_proto(sigstat->protocol, NULL, NULL, NULL);
+        sigstat->key = libbalsa_gpgme_load_key(ctx, sigstat->fingerprint, NULL);
+        gpgme_release(ctx);
+    }
 }
 
+
 const gchar *
-g_mime_gpgme_sigstat_protocol_name(const GMimeGpgmeSigstat *sigstat)
+g_mime_gpgme_sigstat_protocol_name(GMimeGpgmeSigstat *sigstat)
 {
-       g_return_val_if_fail(GMIME_IS_GPGME_SIGSTAT(sigstat), NULL);
+    g_return_val_if_fail(GMIME_IS_GPGME_SIGSTAT(sigstat), NULL);
 
     switch (sigstat->protocol) {
     case GPGME_PROTOCOL_OpenPGP:
-       return _("PGP signature: ");
+        return _("PGP signature: ");
+
     case GPGME_PROTOCOL_CMS:
-       return _("S/MIME signature: ");
+        return _("S/MIME signature: ");
+
     default:
-       return _("(unknown protocol) ");
+        return _("(unknown protocol) ");
     }
 }
 
+
 static inline void
 append_time_t(GString     *str,
-                         const gchar *format,
-                         time_t       when,
+              const gchar *format,
+              time_t       when,
               const gchar *date_string)
 {
     if (when != (time_t) 0) {
@@ -155,30 +159,33 @@ append_time_t(GString     *str,
     }
 }
 
+
 gchar *
-g_mime_gpgme_sigstat_to_gchar(const GMimeGpgmeSigstat *info,
-                                                         gboolean                 full_details,
-                                                         const gchar             *date_string)
+g_mime_gpgme_sigstat_to_gchar(GMimeGpgmeSigstat *sigstat,
+                              gboolean           full_details,
+                              const gchar       *date_string)
 {
     GString *msg;
 
-    g_return_val_if_fail(GMIME_IS_GPGME_SIGSTAT(info), NULL);
+    g_return_val_if_fail(GMIME_IS_GPGME_SIGSTAT(sigstat), NULL);
     g_return_val_if_fail(date_string != NULL, NULL);
-    msg = g_string_new(g_mime_gpgme_sigstat_protocol_name(info));
-    msg = g_string_append(msg, libbalsa_gpgme_sig_stat_to_gchar(info->status));
-    g_string_append_printf(msg, _("\nSignature validity: %s"), libbalsa_gpgme_validity_to_gchar(info-> 
validity));
-    append_time_t(msg, _("\nSigned on: %s"), info->sign_time, date_string);
-    if (info->fingerprint) {
-       g_string_append_printf(msg, _("\nKey fingerprint: %s"), info->fingerprint);
+
+    msg = g_string_new(g_mime_gpgme_sigstat_protocol_name(sigstat));
+    msg = g_string_append(msg, libbalsa_gpgme_sig_stat_to_gchar(sigstat->status));
+    g_string_append_printf(msg, _("\nSignature validity: %s"),
+                           libbalsa_gpgme_validity_to_gchar(sigstat->validity));
+    append_time_t(msg, _("\nSigned on: %s"), sigstat->sign_time, date_string);
+    if (sigstat->fingerprint != NULL) {
+        g_string_append_printf(msg, _("\nKey fingerprint: %s"), sigstat->fingerprint);
     }
 
     /* append key data */
-    if (full_details && (info->key != NULL)) {
-       gchar *key_data;
+    if (full_details && (sigstat->key != NULL)) {
+        gchar *key_data;
 
-       key_data = libbalsa_gpgme_key_to_gchar(info->key, info->fingerprint);
-       g_string_append_printf(msg, "\n%s", key_data);
-       g_free(key_data);
+        key_data = libbalsa_gpgme_key_to_gchar(sigstat->key, sigstat->fingerprint);
+        g_string_append_printf(msg, "\n%s", key_data);
+        g_free(key_data);
     }
 
     return g_string_free(msg, FALSE);
@@ -186,25 +193,27 @@ g_mime_gpgme_sigstat_to_gchar(const GMimeGpgmeSigstat *info,
 
 
 static void
-g_mime_gpgme_sigstat_class_init(GMimeGpgmeSigstatClass * klass)
+g_mime_gpgme_sigstat_class_init(GMimeGpgmeSigstatClass *klass)
 {
     GObjectClass *gobject_klass = G_OBJECT_CLASS(klass);
-    g_mime_gpgme_sigstat_parent_class = g_type_class_peek(G_TYPE_OBJECT);
 
     gobject_klass->finalize =
-       (GObjectFinalizeFunc) g_mime_gpgme_sigstat_finalize;
+        (GObjectFinalizeFunc) g_mime_gpgme_sigstat_finalize;
 }
 
+
 static void
-g_mime_gpgme_sigstat_finalize(GMimeGpgmeSigstat * self)
+g_mime_gpgme_sigstat_finalize(GMimeGpgmeSigstat *sigstat)
 {
-    g_free(self->fingerprint);
-    if (self->key)
-       gpgme_key_unref(self->key);
+    g_free(sigstat->fingerprint);
+    if (sigstat->key) {
+        gpgme_key_unref(sigstat->key);
+    }
 
-    g_mime_gpgme_sigstat_parent_class->finalize(G_OBJECT(self));
+    G_OBJECT_CLASS(g_mime_gpgme_sigstat_parent_class)->finalize(G_OBJECT(sigstat));
 }
 
+
 static gchar *
 hex_decode(const gchar *hexstr)
 {
@@ -213,25 +222,29 @@ hex_decode(const gchar *hexstr)
     int inlen;
 
     inlen = strlen(hexstr);
-    if ((inlen & 1) == 1)
+    if ((inlen & 1) == 1) {
         return g_strdup(hexstr);
+    }
 
     result = g_new0(gchar, (inlen >> 1) + 1);
     for (outp = result; *hexstr; outp++) {
-        if (isdigit(*hexstr))
+        if (isdigit(*hexstr)) {
             *outp = (*hexstr - '0') << 4;
-        else
-            *outp = (toupper(*hexstr) -'A' + 10) << 4;
+        } else {
+            *outp = (toupper(*hexstr) - 'A' + 10) << 4;
+        }
         hexstr++;
-        if (isdigit(*hexstr))
+        if (isdigit(*hexstr)) {
             *outp |= *hexstr - '0';
-        else
-            *outp |= toupper(*hexstr) -'A' + 10;
+        } else {
+            *outp |= toupper(*hexstr) - 'A' + 10;
+        }
         hexstr++;
     }
     return result;
 }
 
+
 /*
  * Change some fields in a S/MIME certificate to human-readable text.
  * Note: doesn't do any sophisticated error-checking...
@@ -254,8 +267,9 @@ libbalsa_cert_subject_readable(const gchar *subject)
     GString *result;
     gchar *readable_subject;
 
-    if (!subject)
+    if (!subject) {
         return NULL;
+    }
 
     result = g_string_new(NULL);
     elements = g_strsplit(subject, ",", -1);
@@ -267,28 +281,96 @@ libbalsa_cert_subject_readable(const gchar *subject)
             *equals++ = '\0';
             for (ldap_elem = ldap_id_list;
                  ldap_elem->ldap_id && strcmp(ldap_elem->ldap_id, elements[n]);
-                 ldap_elem++);
-            if (ldap_elem->ldap_id)
+                 ldap_elem++) {
+            }
+            if (ldap_elem->ldap_id) {
                 result = g_string_append(result, ldap_elem->readable);
-            else
+            } else {
                 result = g_string_append(result, elements[n]);
+            }
             result = g_string_append_c(result, '=');
-            
+
             if (*equals == '#') {
                 gchar *decoded;
 
                 decoded = hex_decode(equals + 1);
                 result = g_string_append(result, decoded);
                 g_free(decoded);
-            } else
+            } else {
                 result = g_string_append(result, equals);
-        } else
+            }
+        } else {
             result = g_string_append(result, elements[n]);
-        if (elements[n + 1])
+        }
+        if (elements[n + 1]) {
             result = g_string_append_c(result, ',');
+        }
     }
     g_strfreev(elements);
     readable_subject = g_string_free(result, FALSE);
     libbalsa_utf8_sanitize(&readable_subject, TRUE, NULL);
     return readable_subject;
 }
+
+
+/*
+ * Getters
+ */
+
+gpgme_error_t
+g_mime_gpgme_sigstat_get_status(GMimeGpgmeSigstat *sigstat)
+{
+    g_return_val_if_fail(GMIME_IS_GPGME_SIGSTAT(sigstat), (gpgme_error_t) 0);
+
+    return sigstat->status;
+}
+
+
+gpgme_sigsum_t
+g_mime_gpgme_sigstat_get_summary(GMimeGpgmeSigstat *sigstat)
+{
+    g_return_val_if_fail(GMIME_IS_GPGME_SIGSTAT(sigstat), (gpgme_sigsum_t) 0);
+
+    return sigstat->summary;
+}
+
+
+gpgme_protocol_t
+g_mime_gpgme_sigstat_get_protocol(GMimeGpgmeSigstat *sigstat)
+{
+    g_return_val_if_fail(GMIME_IS_GPGME_SIGSTAT(sigstat), (gpgme_protocol_t) 0);
+
+    return sigstat->protocol;
+}
+
+
+gpgme_key_t
+g_mime_gpgme_sigstat_get_key(GMimeGpgmeSigstat *sigstat)
+{
+    g_return_val_if_fail(GMIME_IS_GPGME_SIGSTAT(sigstat), NULL);
+
+    return sigstat->key;
+}
+
+
+const gchar *
+g_mime_gpgme_sigstat_get_fingerprint(GMimeGpgmeSigstat *sigstat)
+{
+    g_return_val_if_fail(GMIME_IS_GPGME_SIGSTAT(sigstat), NULL);
+
+    return sigstat->fingerprint;
+}
+
+
+/*
+ * Setter
+ */
+
+void
+g_mime_gpgme_sigstat_set_status(GMimeGpgmeSigstat *sigstat,
+                                gpgme_error_t      status)
+{
+    g_return_if_fail(GMIME_IS_GPGME_SIGSTAT(sigstat));
+
+    sigstat->status = status;
+}
diff --git a/libbalsa/gmime-gpgme-signature.h b/libbalsa/gmime-gpgme-signature.h
index 7fde9d0..90711b0 100644
--- a/libbalsa/gmime-gpgme-signature.h
+++ b/libbalsa/gmime-gpgme-signature.h
@@ -1,18 +1,18 @@
 /* -*-mode:c; c-style:k&r; c-basic-offset:4; -*- */
 /*
  * gmime/gpgme glue layer library
- * Copyright (C) 2004-2016 Albrecht Dreß <albrecht dress arcor de>
+ * Copyright (C) 2004-2018 Albrecht Dreß <albrecht dress arcor de>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option) 
+ * the Free Software Foundation; either version 2, or (at your option)
  * any later version.
- *  
+ *
  * This program 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  
+ * 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.
- *  
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
@@ -26,54 +26,48 @@
 G_BEGIN_DECLS
 
 /* the signature status as returned by gpgme as a GObject */
-#define GMIME_TYPE_GPGME_SIGSTAT           (g_mime_gpgme_sigstat_get_type())
-#define GMIME_GPGME_SIGSTAT(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), GMIME_TYPE_GPGME_SIGSTAT, 
GMimeGpgmeSigstat))
-#define GMIME_GPGME_SIGSTAT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), GMIME_TYPE_GPGME_SIGSTAT, 
GMimeGpgmeSigstatClass))
-#define GMIME_IS_GPGME_SIGSTAT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), GMIME_TYPE_GPGME_SIGSTAT))
-#define GMIME_IS_GPGME_SIGSTAT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GMIME_TYPE_GPGME_SIGSTAT))
-#define GMIME_GPGME_SIGSTAT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), GMIME_TYPE_GPGME_SIGSTAT, 
GMimeGpgmeSigstatClass))
-
-typedef struct _GMimeGpgmeSigstat GMimeGpgmeSigstat;
-typedef struct _GMimeGpgmeSigstatClass GMimeGpgmeSigstatClass;
-typedef struct _sig_uid_t sig_uid_t;
-
-struct _GMimeGpgmeSigstat {
-    GObject parent;
-
-    /* results form gpgme's verify operation */
-    gpgme_protocol_t protocol;
-    gpgme_sigsum_t summary;
-    gpgme_error_t status;
-    gpgme_validity_t validity;
-    gchar *fingerprint;
-    time_t sign_time;
-
-    /* information about the key used to create the signature */
-    gpgme_key_t key;
-};
-
-struct _GMimeGpgmeSigstatClass {
-    GObjectClass parent;
-};
-
-
-GType g_mime_gpgme_sigstat_get_type(void);
-GMimeGpgmeSigstat *g_mime_gpgme_sigstat_new(gpgme_ctx_t ctx)
-       G_GNUC_WARN_UNUSED_RESULT;
+
+#define GMIME_TYPE_GPGME_SIGSTAT (g_mime_gpgme_sigstat_get_type())
+
+G_DECLARE_FINAL_TYPE(GMimeGpgmeSigstat,
+                     g_mime_gpgme_sigstat,
+                     GMIME,
+                     GPGME_SIGSTAT,
+                     GObject)
+
+GMimeGpgmeSigstat * g_mime_gpgme_sigstat_new(gpgme_ctx_t ctx)
+G_GNUC_WARN_UNUSED_RESULT;
 GMimeGpgmeSigstat *g_mime_gpgme_sigstat_new_from_gpgme_ctx(gpgme_ctx_t ctx)
-       G_GNUC_WARN_UNUSED_RESULT;
-void g_mime_gpgme_sigstat_load_key(GMimeGpgmeSigstat *sigstat);
+G_GNUC_WARN_UNUSED_RESULT;
+void               g_mime_gpgme_sigstat_load_key(GMimeGpgmeSigstat *sigstat);
 
-const gchar *g_mime_gpgme_sigstat_protocol_name(const GMimeGpgmeSigstat *sigstat);
-gchar *g_mime_gpgme_sigstat_to_gchar(const GMimeGpgmeSigstat *info,
-                                                                        gboolean                 
full_details,
-                                                                        const gchar             *date_string)
-       G_GNUC_WARN_UNUSED_RESULT;
+const gchar       *g_mime_gpgme_sigstat_protocol_name(GMimeGpgmeSigstat *sigstat);
+gchar             *g_mime_gpgme_sigstat_to_gchar(GMimeGpgmeSigstat *sigstat,
+                                                 gboolean           full_details,
+                                                 const gchar       *date_string)
+G_GNUC_WARN_UNUSED_RESULT;
 
 gchar *libbalsa_cert_subject_readable(const gchar *subject)
-       G_GNUC_WARN_UNUSED_RESULT;
+G_GNUC_WARN_UNUSED_RESULT;
+
+/*
+ * Getters
+ */
+
+gpgme_error_t    g_mime_gpgme_sigstat_get_status(GMimeGpgmeSigstat *sigstat);
+gpgme_sigsum_t   g_mime_gpgme_sigstat_get_summary(GMimeGpgmeSigstat *sigstat);
+gpgme_protocol_t g_mime_gpgme_sigstat_get_protocol(GMimeGpgmeSigstat *sigstat);
+gpgme_key_t      g_mime_gpgme_sigstat_get_key(GMimeGpgmeSigstat *sigstat);
+const gchar     *g_mime_gpgme_sigstat_get_fingerprint(GMimeGpgmeSigstat *sigstat);
+
+/*
+ * Setter
+ */
+
+void g_mime_gpgme_sigstat_set_status(GMimeGpgmeSigstat *sigstat,
+                                     gpgme_error_t      status);
 
 
 G_END_DECLS
 
-#endif                         /* __GMIME_GPGME_SIGNATURE_H__ */
+#endif                          /* __GMIME_GPGME_SIGNATURE_H__ */
diff --git a/libbalsa/gmime-multipart-crypt.c b/libbalsa/gmime-multipart-crypt.c
index 9457196..465f561 100644
--- a/libbalsa/gmime-multipart-crypt.c
+++ b/libbalsa/gmime-multipart-crypt.c
@@ -537,7 +537,7 @@ g_mime_gpgme_mpe_decrypt(GMimeMultipartEncrypted * mpe,
 
     /* cache the decrypted part */
     if (signature) {
-       if (sigstat->status != GPG_ERR_NOT_SIGNED)
+       if (g_mime_gpgme_sigstat_get_status(sigstat) != GPG_ERR_NOT_SIGNED)
            *signature = sigstat;
        else
            g_object_unref(G_OBJECT(sigstat));
diff --git a/libbalsa/libbalsa-gpgme.c b/libbalsa/libbalsa-gpgme.c
index a093e69..a09f807 100644
--- a/libbalsa/libbalsa-gpgme.c
+++ b/libbalsa/libbalsa-gpgme.c
@@ -347,7 +347,7 @@ libbalsa_gpgme_verify(GMimeStream * content, GMimeStream * sig_plain,
        libbalsa_gpgme_set_error(error, err,
                               _("signature verification failed"));
        result = g_mime_gpgme_sigstat_new(ctx);
-       result->status = err;
+       g_mime_gpgme_sigstat_set_status(result, err);
     } else
        result = g_mime_gpgme_sigstat_new_from_gpgme_ctx(ctx);
 
diff --git a/libbalsa/rfc3156.c b/libbalsa/rfc3156.c
index b84cecb..695f421 100644
--- a/libbalsa/rfc3156.c
+++ b/libbalsa/rfc3156.c
@@ -460,7 +460,9 @@ libbalsa_body_decrypt(LibBalsaMessageBody *body, gpgme_protocol_t protocol, GtkW
 
     libbalsa_message_body_set_mime_body(body, mime_obj);
     if (sig_state) {
-       if (sig_state->status != GPG_ERR_NOT_SIGNED)
+        gpgme_error_t status = g_mime_gpgme_sigstat_get_status(sig_state);
+
+       if (status != GPG_ERR_NOT_SIGNED)
            body->sig_info = sig_state;
        else
            g_object_unref(G_OBJECT(sig_state));
@@ -541,7 +543,7 @@ libbalsa_rfc2440_verify(GMimePart * part, GMimeGpgmeSigstat ** sig_info)
            retval = GPG_ERR_GENERAL;
        }
     } else
-       retval = result->status;
+       retval = g_mime_gpgme_sigstat_get_status(result);
 
     /* return the signature info if requested */
     if (sig_info != NULL) {
@@ -597,13 +599,15 @@ libbalsa_rfc2440_decrypt(GMimePart * part, GMimeGpgmeSigstat ** sig_info,
            retval = GPG_ERR_GENERAL;
        }
     } else {
-       if (result->status == GPG_ERR_NOT_SIGNED)
+        gpgme_error_t status = g_mime_gpgme_sigstat_get_status(result);
+
+       if (status == GPG_ERR_NOT_SIGNED)
            retval = GPG_ERR_NO_ERROR;
        else
-           retval = result->status;
+           retval = status;
 
        /* return the signature info if requested */
-       if (sig_info && result->status != GPG_ERR_NOT_SIGNED)
+       if (sig_info && status != GPG_ERR_NOT_SIGNED)
            *sig_info = result;
        else
            g_object_unref(G_OBJECT(result));
diff --git a/src/balsa-message.c b/src/balsa-message.c
index 7c1fdae..aa30b59 100644
--- a/src/balsa-message.c
+++ b/src/balsa-message.c
@@ -2669,6 +2669,7 @@ get_crypto_content_icon(LibBalsaMessageBody * body, const gchar * content_type,
     GdkPixbuf *icon;
     gchar * new_title;
     const gchar * icon_name;
+    gpgme_error_t status;
 
     if ((libbalsa_message_body_protection(body) &
          (LIBBALSA_PROTECT_ENCRYPT | LIBBALSA_PROTECT_ERROR)) ==
@@ -2683,21 +2684,21 @@ get_crypto_content_icon(LibBalsaMessageBody * body, const gchar * content_type,
     if (!icon_title)
         return icon;
 
+    status = g_mime_gpgme_sigstat_get_status(body->sig_info);
     if (*icon_title &&
        g_ascii_strcasecmp(content_type, "application/pgp-signature") &&
        g_ascii_strcasecmp(content_type, "application/pkcs7-signature") &&
-       g_ascii_strcasecmp(content_type, "application/x-pkcs7-signature"))
+       g_ascii_strcasecmp(content_type, "application/x-pkcs7-signature")) {
        new_title = g_strconcat(*icon_title, "; ",
                g_mime_gpgme_sigstat_protocol_name(body->sig_info),
-                               libbalsa_gpgme_sig_stat_to_gchar(body->sig_info->status),
+                               libbalsa_gpgme_sig_stat_to_gchar(status),
                                NULL);
-    else
+    } else
        new_title = g_strconcat(g_mime_gpgme_sigstat_protocol_name(body->sig_info),
-                               libbalsa_gpgme_sig_stat_to_gchar(body->sig_info->status),
+                               libbalsa_gpgme_sig_stat_to_gchar(status),
                                NULL);
 
-    if (*icon_title)
-       g_free(*icon_title);
+    g_free(*icon_title);
     *icon_title = new_title;
 
     return icon;
@@ -2910,7 +2911,8 @@ libbalsa_msg_try_mp_signed(LibBalsaMessage * message, LibBalsaMessageBody *body,
                                 _("Detected a good signature"));
            break;
        case LIBBALSA_MSG_PROTECT_SIGN_NOTRUST:
-           if (body->parts->next->sig_info->protocol == GPGME_PROTOCOL_CMS)
+           if (g_mime_gpgme_sigstat_get_protocol(body->parts->next->sig_info)
+                == GPGME_PROTOCOL_CMS)
                libbalsa_information
                    (LIBBALSA_INFORMATION_MESSAGE,
                     _("Detected a good signature with insufficient "
@@ -2928,7 +2930,7 @@ libbalsa_msg_try_mp_signed(LibBalsaMessage * message, LibBalsaMessageBody *body,
                 _("Checking the signature of the message sent by %s with "
                   "subject “%s” returned:\n%s"),
                 chk_crypto->sender, chk_crypto->subject,
-                libbalsa_gpgme_sig_stat_to_gchar(body->parts->next->sig_info->status));
+                
libbalsa_gpgme_sig_stat_to_gchar(g_mime_gpgme_sigstat_get_status(body->parts->next->sig_info)));
            break;
        default:
            break;
@@ -3031,7 +3033,7 @@ libbalsa_msg_part_2440(LibBalsaMessage * message, LibBalsaMessageBody * body,
     libbalsa_mailbox_unlock_store(body->message->mailbox);
 
     if (body->sig_info && sig_res == GPG_ERR_NO_ERROR) {
-        if ((body->sig_info->summary & GPGME_SIGSUM_VALID) == GPGME_SIGSUM_VALID) {
+        if ((g_mime_gpgme_sigstat_get_summary(body->sig_info) & GPGME_SIGSUM_VALID) == GPGME_SIGSUM_VALID) {
                g_debug("%s: detected a good signature", __func__);
         } else {
             libbalsa_information
diff --git a/src/balsa-mime-widget-crypto.c b/src/balsa-mime-widget-crypto.c
index 06c8f8e..246088f 100644
--- a/src/balsa-mime-widget-crypto.c
+++ b/src/balsa-mime-widget-crypto.c
@@ -111,9 +111,13 @@ balsa_mime_widget_signature_widget(LibBalsaMessageBody * mime_body,
     GtkWidget *vbox, *label;
     GtkWidget *signature_widget;
     gchar **lines;
+    gpgme_error_t status;
 
-    if (!mime_body->sig_info ||
-       mime_body->sig_info->status == GPG_ERR_NOT_SIGNED)
+    if (mime_body->sig_info == NULL)
+       return NULL;
+
+    status = g_mime_gpgme_sigstat_get_status(mime_body->sig_info);
+    if (status == GPG_ERR_NOT_SIGNED)
        return NULL;
 
     infostr = g_mime_gpgme_sigstat_to_gchar(mime_body->sig_info, FALSE, balsa_app.date_string);
@@ -128,17 +132,19 @@ balsa_mime_widget_signature_widget(LibBalsaMessageBody * mime_body,
     gtk_label_set_selectable(GTK_LABEL(label), TRUE);
     gtk_widget_set_halign(label, GTK_ALIGN_START);
     gtk_box_pack_start(GTK_BOX(vbox), label);
-    if (mime_body->sig_info->protocol == GPGME_PROTOCOL_OpenPGP) {
+    if (g_mime_gpgme_sigstat_get_protocol(mime_body->sig_info)
+            == GPGME_PROTOCOL_OpenPGP) {
         GtkWidget *button;
 
-        if (mime_body->sig_info->status == GPG_ERR_NO_PUBKEY) {
+        if (status == GPG_ERR_NO_PUBKEY) {
             button = gtk_button_new_with_mnemonic(_("_Search key server for this key"));
         } else {
             button = gtk_button_new_with_mnemonic(_("_Search key server for updates of this key"));
         }
         g_signal_connect(G_OBJECT(button), "clicked",
                          G_CALLBACK(on_gpg_key_button),
-                         (gpointer)mime_body->sig_info->fingerprint);
+                         (gpointer) g_mime_gpgme_sigstat_get_fingerprint
+                                    (mime_body->sig_info));
         gtk_box_pack_start(GTK_BOX(vbox), button);
     }
 
@@ -154,8 +160,9 @@ balsa_mime_widget_signature_widget(LibBalsaMessageBody * mime_body,
     /* add a callback to load the key when the user wants to show the details
      * Note: do *not* pass mime_body->sig_info to the callback, as it will be replaced when the user 
re-checks the signature or
      * opens the message again in a separate window */
-    if (((mime_body->sig_info->summary & GPGME_SIGSUM_KEY_MISSING) == 0) &&
-       (mime_body->sig_info->key == NULL)) {
+    if (((g_mime_gpgme_sigstat_get_summary(mime_body->sig_info)
+          & GPGME_SIGSUM_KEY_MISSING) == 0) &&
+       (g_mime_gpgme_sigstat_get_key(mime_body->sig_info) == NULL)) {
        g_signal_connect(expander, "activate", (GCallback) show_public_key_data, mime_body);
        g_object_set_data(G_OBJECT(expander), "vbox", vbox);
     }
@@ -353,16 +360,23 @@ show_public_key_data(GtkExpander *expander,
 
        g_message("%s: %p %p %p", __func__, expander, body, body->sig_info);
        if (body->sig_info != NULL) {
-               if (body->sig_info->key == NULL) {
+                gpgme_key_t key;
+
+                key = g_mime_gpgme_sigstat_get_key(body->sig_info);
+               if (key == NULL) {
                        g_mime_gpgme_sigstat_load_key(body->sig_info);
                }
 
-               if ((g_object_get_data(G_OBJECT(expander), "vbox") != NULL) && (body->sig_info->key != NULL)) 
{
+               if (g_object_get_data(G_OBJECT(expander), "vbox") != NULL &&
+                    key != NULL) {
                        GtkWidget *key_widget;
                        GtkBox *vbox;
+                        const gchar *fingerprint;
 
                        vbox = GTK_BOX(g_object_steal_data(G_OBJECT(expander), "vbox"));
-                       key_widget = libbalsa_gpgme_key(body->sig_info->key, body->sig_info->fingerprint, 0U, 
FALSE);
+                        fingerprint =
+                            g_mime_gpgme_sigstat_get_fingerprint(body->sig_info);
+                       key_widget = libbalsa_gpgme_key(key, fingerprint, 0U, FALSE);
                        gtk_box_pack_start(vbox, key_widget);
                        gtk_box_reorder_child(vbox, key_widget, 1U);
                }
diff --git a/src/balsa-mime-widget-message.c b/src/balsa-mime-widget-message.c
index 010a1ee..9a282f9 100644
--- a/src/balsa-mime-widget-message.c
+++ b/src/balsa-mime-widget-message.c
@@ -785,12 +785,13 @@ bmw_message_set_headers_d(BalsaMessage           * bm,
        if (part->parts
            && part->parts->next
            && part->parts->next->sig_info
-           && part->parts->next->sig_info->status !=
+           && g_mime_gpgme_sigstat_get_status(part->parts->next->sig_info) !=
            GPG_ERR_NOT_SIGNED)
            /* top-level part is RFC 3156 or RFC 2633 signed */
            add_header_sigstate(grid, part->parts->next->sig_info);
        else if (part->sig_info
-                && part->sig_info->status != GPG_ERR_NOT_SIGNED)
+                && g_mime_gpgme_sigstat_get_status(part->sig_info) !=
+                 GPG_ERR_NOT_SIGNED)
            /* top-level is OpenPGP (RFC 2440) signed */
            add_header_sigstate(grid, part->sig_info);
     }
@@ -849,13 +850,13 @@ add_header_sigstate(GtkGrid * grid, GMimeGpgmeSigstat * siginfo)
     gchar *format;
     gchar *msg;
     GtkWidget *label;
+    gpgme_error_t status;
 
-    format = siginfo->status ==
-        GPG_ERR_NO_ERROR ? "<i>%s%s</i>" : "<b><i>%s%s</i></b>";
-    msg = g_markup_printf_escaped
-        (format,
-               g_mime_gpgme_sigstat_protocol_name(siginfo),
-         libbalsa_gpgme_sig_stat_to_gchar(siginfo->status));
+    status = g_mime_gpgme_sigstat_get_status(siginfo);
+    format = status == GPG_ERR_NO_ERROR ? "<i>%s%s</i>" : "<b><i>%s%s</i></b>";
+    msg = g_markup_printf_escaped(format,
+                                  g_mime_gpgme_sigstat_protocol_name(siginfo),
+                                  libbalsa_gpgme_sig_stat_to_gchar(status));
 
     label = gtk_label_new(NULL);
     gtk_label_set_markup(GTK_LABEL(label), msg);
diff --git a/src/balsa-print-object-header.c b/src/balsa-print-object-header.c
index 86deb18..7ade7ec 100644
--- a/src/balsa-print-object-header.c
+++ b/src/balsa-print-object-header.c
@@ -234,7 +234,8 @@ balsa_print_object_header_new_real(GList * list,
 
            g_string_append_printf(header_buf, "%s%s\n",
                g_mime_gpgme_sigstat_protocol_name(siginfo),
-                                   libbalsa_gpgme_sig_stat_to_gchar(siginfo->status));
+                                   libbalsa_gpgme_sig_stat_to_gchar
+                                   (g_mime_gpgme_sigstat_get_status(siginfo)));
        }
     }
 #endif                         /* HAVE_GPGME */
@@ -389,8 +390,8 @@ balsa_print_object_header_crypto(GList *list, GtkPrintContext * context,
     pango_font_description_free(header_font);
 
     /* check if the key needs to be loaded */
-    if (((body->sig_info->summary & GPGME_SIGSUM_KEY_MISSING) == 0) &&
-       (body->sig_info->key == NULL)) {
+    if (((g_mime_gpgme_sigstat_get_summary(body->sig_info) & GPGME_SIGSUM_KEY_MISSING) == 0) &&
+       (g_mime_gpgme_sigstat_get_key(body->sig_info) == NULL)) {
        g_mime_gpgme_sigstat_load_key(body->sig_info);
     }
 
diff --git a/src/print-gtk.c b/src/print-gtk.c
index 441a53f..74f32a6 100644
--- a/src/print-gtk.c
+++ b/src/print-gtk.c
@@ -195,7 +195,8 @@ scan_body(GList *bpo_list, GtkPrintContext * context, BalsaPrintSetup * psetup,
        if (add_signature) {
            gchar *header =
                g_strdup_printf(_("This is an inline %s signed %s message part:"),
-                               body->sig_info->protocol == GPGME_PROTOCOL_OpenPGP ?
+                               g_mime_gpgme_sigstat_get_protocol(body->sig_info)
+                                == GPGME_PROTOCOL_OpenPGP ?
                                _("OpenPGP") : _("S/MIME"), conttype);
            bpo_list = balsa_print_object_separator(bpo_list, psetup);
            bpo_list = balsa_print_object_header_crypto(bpo_list, context, body, header, psetup);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]