aboutsummaryrefslogtreecommitdiffstats
path: root/e-util/e-signature.c
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2009-08-07 05:48:45 +0800
committerMatthew Barnes <mbarnes@redhat.com>2009-08-07 06:42:42 +0800
commit740af34bdf59229f5c63b30b5cca6264672f6707 (patch)
tree153c02805da8ade80f8e0934fcdd529f20d8d4be /e-util/e-signature.c
parentba5c9e6f8046f76ffda4a1871d1287f9834d1211 (diff)
downloadgsoc2013-evolution-740af34bdf59229f5c63b30b5cca6264672f6707.tar.gz
gsoc2013-evolution-740af34bdf59229f5c63b30b5cca6264672f6707.tar.zst
gsoc2013-evolution-740af34bdf59229f5c63b30b5cca6264672f6707.zip
Seal up ESignature and add GObject properties.
Diffstat (limited to 'e-util/e-signature.c')
-rw-r--r--e-util/e-signature.c631
1 files changed, 501 insertions, 130 deletions
diff --git a/e-util/e-signature.c b/e-util/e-signature.c
index 86e29fe34a..1b22dbafa0 100644
--- a/e-util/e-signature.c
+++ b/e-util/e-signature.c
@@ -14,9 +14,6 @@
* License along with the program; if not, see <http://www.gnu.org/licenses/>
*
*
- * Authors:
- * Jeffrey Stedfast <fejj@ximian.com>
- *
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
*
*/
@@ -31,69 +28,327 @@
#include <libxml/parser.h>
#include <libxml/xmlmemory.h>
+#include <glib/gi18n-lib.h>
#include <gconf/gconf-client.h>
#include <libedataserver/e-uid.h>
#include "e-signature.h"
-static void e_signature_class_init (ESignatureClass *klass);
-static void e_signature_init (ESignature *sig, ESignatureClass *klass);
-static void e_signature_finalize (GObject *object);
+#define E_SIGNATURE_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_SIGNATURE, ESignaturePrivate))
-static GObjectClass *parent_class = NULL;
+struct _ESignaturePrivate {
+ gchar *filename;
+ gchar *name;
+ gchar *uid;
-GType
-e_signature_get_type (void)
+ gboolean autogenerated;
+ gboolean is_html;
+ gboolean is_script;
+};
+
+enum {
+ PROP_0,
+ PROP_AUTOGENERATED,
+ PROP_FILENAME,
+ PROP_IS_HTML,
+ PROP_IS_SCRIPT,
+ PROP_NAME,
+ PROP_UID
+};
+
+static gpointer parent_class;
+
+static gboolean
+xml_set_bool (xmlNodePtr node,
+ const gchar *name,
+ gboolean *val)
{
- static GType type = 0;
+ gboolean v_boolean;
+ gchar *buf;
- if (!type) {
- GTypeInfo type_info = {
- sizeof (ESignatureClass),
- NULL, NULL,
- (GClassInitFunc) e_signature_class_init,
- NULL, NULL,
- sizeof (ESignature),
- 0,
- (GInstanceInitFunc) e_signature_init,
- };
+ if ((buf = (gchar *)xmlGetProp (node, (xmlChar *) name))) {
+ v_boolean = (!strcmp (buf, "true") || !strcmp (buf, "yes"));
+ xmlFree (buf);
- type = g_type_register_static (G_TYPE_OBJECT, "ESignature", &type_info, 0);
+ if (v_boolean != *val) {
+ *val = v_boolean;
+ return TRUE;
+ }
}
- return type;
+ return FALSE;
}
-static void
-e_signature_class_init (ESignatureClass *klass)
+static gboolean
+xml_set_prop (xmlNodePtr node,
+ const gchar *name,
+ gchar **val)
+{
+ gchar *buf, *new_val;
+
+ buf = (gchar *)xmlGetProp (node, (xmlChar *) name);
+ new_val = g_strdup (buf);
+ xmlFree (buf);
+
+ /* We can use strcmp here whether the value is UTF8 or
+ * not, since we only care if the bytes changed.
+ */
+ if (!*val || strcmp (*val, new_val)) {
+ g_free (*val);
+ *val = new_val;
+ return TRUE;
+ } else {
+ g_free (new_val);
+ return FALSE;
+ }
+}
+
+static gboolean
+xml_set_content (xmlNodePtr node,
+ gchar **val)
{
- GObjectClass *object_class = (GObjectClass *) klass;
+ gchar *buf, *new_val;
- parent_class = g_type_class_ref (G_TYPE_OBJECT);
+ buf = (gchar *)xmlNodeGetContent (node);
+ new_val = g_strdup (buf);
+ xmlFree (buf);
- /* virtual method override */
- object_class->finalize = e_signature_finalize;
+ /* We can use strcmp here whether the value is UTF8 or
+ * not, since we only care if the bytes changed. */
+ if (!*val || strcmp (*val, new_val)) {
+ g_free (*val);
+ *val = new_val;
+ return TRUE;
+ } else {
+ g_free (new_val);
+ return FALSE;
+ }
}
static void
-e_signature_init (ESignature *sig, ESignatureClass *klass)
+signature_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
{
- ;
+ switch (property_id) {
+ case PROP_AUTOGENERATED:
+ e_signature_set_autogenerated (
+ E_SIGNATURE (object),
+ g_value_get_boolean (value));
+ return;
+
+ case PROP_FILENAME:
+ e_signature_set_filename (
+ E_SIGNATURE (object),
+ g_value_get_string (value));
+ return;
+
+ case PROP_IS_HTML:
+ e_signature_set_is_html (
+ E_SIGNATURE (object),
+ g_value_get_boolean (value));
+ return;
+
+ case PROP_IS_SCRIPT:
+ e_signature_set_is_script (
+ E_SIGNATURE (object),
+ g_value_get_boolean (value));
+ return;
+
+ case PROP_NAME:
+ e_signature_set_name (
+ E_SIGNATURE (object),
+ g_value_get_string (value));
+ return;
+
+ case PROP_UID:
+ e_signature_set_uid (
+ E_SIGNATURE (object),
+ g_value_get_string (value));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+signature_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_AUTOGENERATED:
+ g_value_set_boolean (
+ value, e_signature_get_autogenerated (
+ E_SIGNATURE (object)));
+ return;
+
+ case PROP_FILENAME:
+ g_value_set_string (
+ value, e_signature_get_filename (
+ E_SIGNATURE (object)));
+ return;
+
+ case PROP_IS_HTML:
+ g_value_set_boolean (
+ value, e_signature_get_is_html (
+ E_SIGNATURE (object)));
+ return;
+
+ case PROP_IS_SCRIPT:
+ g_value_set_boolean (
+ value, e_signature_get_is_script (
+ E_SIGNATURE (object)));
+ return;
+
+ case PROP_NAME:
+ g_value_set_string (
+ value, e_signature_get_name (
+ E_SIGNATURE (object)));
+ return;
+
+ case PROP_UID:
+ g_value_set_string (
+ value, e_signature_get_uid (
+ E_SIGNATURE (object)));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
static void
-e_signature_finalize (GObject *object)
+signature_finalize (GObject *object)
{
- ESignature *sig = (ESignature *) object;
+ ESignaturePrivate *priv;
- g_free (sig->uid);
- g_free (sig->name);
- g_free (sig->filename);
+ priv = E_SIGNATURE_GET_PRIVATE (object);
+ g_free (priv->filename);
+ g_free (priv->name);
+ g_free (priv->uid);
+
+ /* Chain up to parent's finalize() method. */
G_OBJECT_CLASS (parent_class)->finalize (object);
}
+static void
+e_signature_class_init (ESignatureClass *class)
+{
+ GObjectClass *object_class;
+
+ parent_class = g_type_class_peek_parent (class);
+ g_type_class_add_private (class, sizeof (ESignaturePrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->set_property = signature_set_property;
+ object_class->get_property = signature_get_property;
+ object_class->finalize = signature_finalize;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_AUTOGENERATED,
+ g_param_spec_boolean (
+ "autogenerated",
+ "Autogenerated",
+ NULL,
+ FALSE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_FILENAME,
+ g_param_spec_string (
+ "filename",
+ "Filename",
+ NULL,
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_IS_HTML,
+ g_param_spec_boolean (
+ "is-html",
+ "Is HTML",
+ NULL,
+ FALSE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_IS_SCRIPT,
+ g_param_spec_boolean (
+ "is-script",
+ "Is Script",
+ NULL,
+ FALSE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_NAME,
+ g_param_spec_string (
+ "name",
+ "Name",
+ NULL,
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_UID,
+ g_param_spec_string (
+ "uid",
+ "UID",
+ NULL,
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
+}
+
+static void
+e_signature_init (ESignature *signature)
+{
+ signature->priv = E_SIGNATURE_GET_PRIVATE (signature);
+}
+
+GType
+e_signature_get_type (void)
+{
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0)) {
+ GTypeInfo type_info = {
+ sizeof (ESignatureClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) e_signature_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+ sizeof (ESignature),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) e_signature_init,
+ NULL /* value_table */
+ };
+
+ type = g_type_register_static (
+ G_TYPE_OBJECT, "ESignature", &type_info, 0);
+ }
+
+ return type;
+}
+
/**
* e_signature_new:
*
@@ -106,7 +361,7 @@ e_signature_new (void)
ESignature *signature;
signature = g_object_new (E_TYPE_SIGNATURE, NULL);
- signature->uid = e_uid_new ();
+ signature->priv->uid = e_uid_new ();
return signature;
}
@@ -124,6 +379,7 @@ e_signature_new_from_xml (const gchar *xml)
ESignature *signature;
signature = g_object_new (E_TYPE_SIGNATURE, NULL);
+
if (!e_signature_set_from_xml (signature, xml)) {
g_object_unref (signature);
return NULL;
@@ -132,69 +388,6 @@ e_signature_new_from_xml (const gchar *xml)
return signature;
}
-static gboolean
-xml_set_bool (xmlNodePtr node, const gchar *name, gboolean *val)
-{
- gboolean bool;
- gchar *buf;
-
- if ((buf = (gchar *)xmlGetProp (node, (const guchar *)name))) {
- bool = (!strcmp (buf, "true") || !strcmp (buf, "yes"));
- xmlFree (buf);
-
- if (bool != *val) {
- *val = bool;
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static gboolean
-xml_set_prop (xmlNodePtr node, const gchar *name, gchar **val)
-{
- gchar *buf, *new_val;
-
- buf = (gchar *)xmlGetProp (node, (const guchar *)name);
- new_val = g_strdup (buf);
- xmlFree (buf);
-
- /* We can use strcmp here whether the value is UTF8 or
- * not, since we only care if the bytes changed.
- */
- if (!*val || strcmp (*val, new_val)) {
- g_free (*val);
- *val = new_val;
- return TRUE;
- } else {
- g_free (new_val);
- return FALSE;
- }
-}
-
-static gboolean
-xml_set_content (xmlNodePtr node, gchar **val)
-{
- gchar *buf, *new_val;
-
- buf = (gchar *)xmlNodeGetContent (node);
- new_val = g_strdup (buf);
- xmlFree (buf);
-
- /* We can use strcmp here whether the value is UTF8 or
- * not, since we only care if the bytes changed.
- */
- if (!*val || strcmp (*val, new_val)) {
- g_free (*val);
- *val = new_val;
- return TRUE;
- } else {
- g_free (new_val);
- return FALSE;
- }
-}
-
/**
* e_signature_uid_from_xml:
* @xml: an XML signature description
@@ -210,7 +403,7 @@ e_signature_uid_from_xml (const gchar *xml)
xmlDocPtr doc;
gchar *uid = NULL;
- if (!(doc = xmlParseDoc ((guchar *) xml)))
+ if (!(doc = xmlParseDoc ((xmlChar *) xml)))
return NULL;
node = doc->children;
@@ -243,7 +436,7 @@ e_signature_set_from_xml (ESignature *signature, const gchar *xml)
gboolean bool;
gchar *buf;
- if (!(doc = xmlParseDoc ((guchar *) xml)))
+ if (!(doc = xmlParseDoc ((xmlChar *) xml)))
return FALSE;
node = doc->children;
@@ -252,18 +445,13 @@ e_signature_set_from_xml (ESignature *signature, const gchar *xml)
return FALSE;
}
- if (!signature->uid)
- xml_set_prop (node, "uid", &signature->uid);
+ if (!signature->priv->uid)
+ xml_set_prop (node, "uid", &signature->priv->uid);
- changed |= xml_set_prop (node, "name", &signature->name);
- changed |= xml_set_bool (node, "auto", &signature->autogen);
+ changed |= xml_set_prop (node, "name", &signature->priv->name);
+ changed |= xml_set_bool (node, "auto", &signature->priv->autogenerated);
- if (signature->autogen) {
- /* we're done */
- g_free (signature->filename);
- signature->filename = NULL;
- signature->script = FALSE;
- signature->html = FALSE;
+ if (e_signature_get_autogenerated (signature)) {
xmlFreeDoc (doc);
return changed;
@@ -277,22 +465,22 @@ e_signature_set_from_xml (ESignature *signature, const gchar *xml)
bool = FALSE;
g_free (buf);
- if (signature->html != bool) {
- signature->html = bool;
+ if (e_signature_get_is_html (signature) != bool) {
+ e_signature_set_is_html (signature, bool);
changed = TRUE;
}
cur = node->children;
while (cur) {
if (!strcmp ((gchar *)cur->name, "filename")) {
- changed |= xml_set_content (cur, &signature->filename);
- changed |= xml_set_bool (cur, "script", &signature->script);
+ changed |= xml_set_content (cur, &signature->priv->filename);
+ changed |= xml_set_bool (cur, "script", &signature->priv->is_script);
break;
} else if (!strcmp ((gchar *)cur->name, "script")) {
/* this is for handling 1.4 signature script definitions */
- changed |= xml_set_content (cur, &signature->filename);
- if (!signature->script) {
- signature->script = TRUE;
+ changed |= xml_set_content (cur, &signature->priv->filename);
+ if (!e_signature_get_is_script (signature)) {
+ e_signature_set_is_script (signature, TRUE);
changed = TRUE;
}
break;
@@ -320,28 +508,42 @@ e_signature_to_xml (ESignature *signature)
gchar *tmp;
xmlNodePtr root, node;
xmlDocPtr doc;
+ const gchar *string;
gint n;
- doc = xmlNewDoc ((const guchar *)"1.0");
+ doc = xmlNewDoc ((xmlChar *) "1.0");
- root = xmlNewDocNode (doc, NULL, (const guchar *)"signature", NULL);
+ root = xmlNewDocNode (doc, NULL, (xmlChar *) "signature", NULL);
xmlDocSetRootElement (doc, root);
- xmlSetProp (root, (const guchar *)"name", (guchar *)signature->name);
- xmlSetProp (root, (const guchar *)"uid", (guchar *)signature->uid);
- xmlSetProp (root, (const guchar *)"auto", (const guchar *)(signature->autogen ? "true" : "false"));
+ string = e_signature_get_name (signature);
+ xmlSetProp (root, (xmlChar *) "name", (xmlChar *) string);
- if (!signature->autogen) {
- xmlSetProp (root, (const guchar *)"format", (const guchar *)(signature->html ? "text/html" : "text/plain"));
+ string = e_signature_get_uid (signature);
+ xmlSetProp (root, (xmlChar *) "uid", (xmlChar *) string);
- if (signature->filename) {
- node = xmlNewTextChild (root, NULL, (const guchar *)"filename", (guchar *)signature->filename);
- if (signature->script)
- xmlSetProp (node, (const guchar *)"script", (const guchar *)"true");
+ if (e_signature_get_autogenerated (signature))
+ string = "true";
+ else
+ string = "false";
+ xmlSetProp (root, (xmlChar *) "auto", (xmlChar *) string);
+
+ if (!e_signature_get_autogenerated (signature)) {
+ if (e_signature_get_is_html (signature))
+ string = "text/html";
+ else
+ string = "text/plain";
+ xmlSetProp (root, (xmlChar *) "format", (xmlChar *) string);
+
+ string = e_signature_get_filename (signature);
+ if (string != NULL) {
+ node = xmlNewTextChild (root, NULL, (xmlChar *) "filename", (xmlChar *) string);
+ if (e_signature_get_is_script (signature))
+ xmlSetProp (node, (xmlChar *) "script", (xmlChar *) "true");
}
} else {
/* this is to make Evolution-1.4 and older 1.5 versions happy */
- xmlSetProp (root, (const guchar *)"format", (const guchar *)"text/html");
+ xmlSetProp (root, (xmlChar *) "format", (xmlChar *) "text/html");
}
xmlDocDumpMemory (doc, &xmlbuf, &n);
@@ -356,3 +558,172 @@ e_signature_to_xml (ESignature *signature)
return tmp;
}
+gboolean
+e_signature_is_equal (ESignature *signature1,
+ ESignature *signature2)
+{
+ const gchar *uid1;
+ const gchar *uid2;
+
+ g_return_val_if_fail (E_IS_SIGNATURE (signature1), FALSE);
+ g_return_val_if_fail (E_IS_SIGNATURE (signature2), FALSE);
+
+ /* XXX Simply compares the UIDs. Not fool-proof. */
+ uid1 = e_signature_get_uid (signature1);
+ uid2 = e_signature_get_uid (signature2);
+
+ return (g_strcmp0 (uid1, uid2) == 0);
+}
+
+gboolean
+e_signature_get_autogenerated (ESignature *signature)
+{
+ g_return_val_if_fail (E_IS_SIGNATURE (signature), FALSE);
+
+ return signature->priv->autogenerated;
+}
+
+void
+e_signature_set_autogenerated (ESignature *signature,
+ gboolean autogenerated)
+{
+ g_return_if_fail (E_IS_SIGNATURE (signature));
+
+ if (signature->priv->autogenerated == autogenerated)
+ return;
+
+ signature->priv->autogenerated = autogenerated;
+
+ /* Autogenerated flags overrides several properties. */
+ g_object_freeze_notify (G_OBJECT (signature));
+ g_object_notify (G_OBJECT (signature), "autogenerated");
+ g_object_notify (G_OBJECT (signature), "filename");
+ g_object_notify (G_OBJECT (signature), "is-html");
+ g_object_notify (G_OBJECT (signature), "is-script");
+ g_object_notify (G_OBJECT (signature), "name");
+ g_object_thaw_notify (G_OBJECT (signature));
+}
+
+const gchar *
+e_signature_get_filename (ESignature *signature)
+{
+ g_return_val_if_fail (E_IS_SIGNATURE (signature), NULL);
+
+ /* Autogenerated flags overrides the filename property. */
+ if (e_signature_get_autogenerated (signature))
+ return NULL;
+
+ return signature->priv->filename;
+}
+
+void
+e_signature_set_filename (ESignature *signature,
+ const gchar *filename)
+{
+ g_return_if_fail (E_IS_SIGNATURE (signature));
+
+ g_free (signature->priv->filename);
+ signature->priv->filename = g_strdup (filename);
+
+ g_object_notify (G_OBJECT (signature), "filename");
+}
+
+gboolean
+e_signature_get_is_html (ESignature *signature)
+{
+ g_return_val_if_fail (E_IS_SIGNATURE (signature), FALSE);
+
+ /* Autogenerated flag overrides the is-html property. */
+ if (e_signature_get_autogenerated (signature))
+ return FALSE;
+
+ return signature->priv->is_html;
+}
+
+void
+e_signature_set_is_html (ESignature *signature,
+ gboolean is_html)
+{
+ g_return_if_fail (E_IS_SIGNATURE (signature));
+
+ if (signature->priv->is_html == is_html)
+ return;
+
+ signature->priv->is_html = is_html;
+
+ g_object_notify (G_OBJECT (signature), "is-html");
+}
+
+gboolean
+e_signature_get_is_script (ESignature *signature)
+{
+ g_return_val_if_fail (E_IS_SIGNATURE (signature), FALSE);
+
+ /* Autogenerated flags overrides the is-script property. */
+ if (e_signature_get_autogenerated (signature))
+ return FALSE;
+
+ return signature->priv->is_script;
+}
+
+void
+e_signature_set_is_script (ESignature *signature,
+ gboolean is_script)
+{
+ g_return_if_fail (E_IS_SIGNATURE (signature));
+
+ if (signature->priv->is_script == is_script)
+ return;
+
+ signature->priv->is_script = is_script;
+
+ g_object_notify (G_OBJECT (signature), "is-script");
+}
+
+const gchar *
+e_signature_get_name (ESignature *signature)
+{
+ g_return_val_if_fail (E_IS_SIGNATURE (signature), NULL);
+
+ /* Autogenerated flag overrides the name property. */
+ if (e_signature_get_autogenerated (signature))
+ return _("Autogenerated");
+
+ return signature->priv->name;
+}
+
+void
+e_signature_set_name (ESignature *signature,
+ const gchar *name)
+{
+ g_return_if_fail (E_IS_SIGNATURE (signature));
+
+ g_free (signature->priv->name);
+ signature->priv->name = g_strdup (name);
+
+ g_object_notify (G_OBJECT (signature), "name");
+}
+
+const gchar *
+e_signature_get_uid (ESignature *signature)
+{
+ g_return_val_if_fail (E_IS_SIGNATURE (signature), NULL);
+
+ return signature->priv->uid;
+}
+
+void
+e_signature_set_uid (ESignature *signature,
+ const gchar *uid)
+{
+ g_return_if_fail (E_IS_SIGNATURE (signature));
+
+ g_free (signature->priv->uid);
+
+ if (uid == NULL)
+ signature->priv->uid = e_uid_new ();
+ else
+ signature->priv->uid = g_strdup (uid);
+
+ g_object_notify (G_OBJECT (signature), "uid");
+}