aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/backend/ebook/e-destination.c
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/backend/ebook/e-destination.c')
-rw-r--r--addressbook/backend/ebook/e-destination.c284
1 files changed, 284 insertions, 0 deletions
diff --git a/addressbook/backend/ebook/e-destination.c b/addressbook/backend/ebook/e-destination.c
new file mode 100644
index 0000000000..92aed64715
--- /dev/null
+++ b/addressbook/backend/ebook/e-destination.c
@@ -0,0 +1,284 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * e-destination.c
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Developed by Jon Trowbridge <trow@ximian.com>
+ */
+
+/*
+ * 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 of the
+ * License, 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
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA.
+ */
+
+#include <config.h>
+#include <gtk/gtk.h>
+#include <libgnome/gnome-defs.h>
+#include <libgnome/gnome-i18n.h>
+#include "e-destination.h"
+
+struct _EDestinationPrivate {
+ ECard *card;
+ gint card_email_num;
+
+ gchar *string;
+ gchar *string_email;
+ gchar *string_email_verbose;
+};
+
+static void e_destination_clear_card (EDestination *);
+static void e_destination_clear_strings (EDestination *);
+
+static GtkObjectClass *parent_class;
+
+static void
+e_destination_destroy (GtkObject *obj)
+{
+ EDestination *dest = E_DESTINATION (obj);
+
+ e_destination_clear_card (dest);
+ e_destination_clear_strings (dest);
+
+ g_free (dest->priv);
+
+ if (parent_class->destroy)
+ parent_class->destroy (obj);
+}
+
+static void
+e_destination_class_init (EDestinationClass *klass)
+{
+ GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
+
+ parent_class = GTK_OBJECT_CLASS (gtk_type_class (GTK_TYPE_OBJECT));
+
+ object_class->destroy = e_destination_destroy;
+}
+
+static void
+e_destination_init (EDestination *dest)
+{
+ dest->priv = g_new0 (struct _EDestinationPrivate, 1);
+}
+
+GtkType
+e_destination_get_type (void)
+{
+ static GtkType dest_type = 0;
+
+ if (!dest_type) {
+ GtkTypeInfo dest_info = {
+ "EDestination",
+ sizeof (EDestination),
+ sizeof (EDestinationClass),
+ (GtkClassInitFunc) e_destination_class_init,
+ (GtkObjectInitFunc) e_destination_init,
+ NULL, NULL, /* reserved */
+ (GtkClassInitFunc) NULL
+ };
+
+ dest_type = gtk_type_unique (gtk_object_get_type (), &dest_info);
+ }
+
+ return dest_type;
+}
+
+EDestination *
+e_destination_new (void)
+{
+ return E_DESTINATION (gtk_type_new (E_TYPE_DESTINATION));
+}
+
+EDestination *
+e_destination_copy (EDestination *dest)
+{
+ EDestination *new_dest;
+
+ g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL);
+
+ new_dest = e_destination_new ();
+
+ new_dest->priv->card = dest->priv->card;
+ if (new_dest->priv->card)
+ gtk_object_ref (GTK_OBJECT (new_dest->priv->card));
+
+ new_dest->priv->card_email_num = dest->priv->card_email_num;
+
+ new_dest->priv->string = g_strdup (dest->priv->string);
+ new_dest->priv->string_email = g_strdup (dest->priv->string_email);
+ new_dest->priv->string_email_verbose = g_strdup (dest->priv->string_email_verbose);
+
+ return new_dest;
+}
+
+static void
+e_destination_clear_card (EDestination *dest)
+{
+ if (dest->priv->card)
+ gtk_object_unref (GTK_OBJECT (dest->priv->card));
+ dest->priv->card = NULL;
+
+ dest->priv->card_email_num = -1;
+}
+
+static void
+e_destination_clear_strings (EDestination *dest)
+{
+ g_free (dest->priv->string);
+ g_free (dest->priv->string_email);
+ g_free (dest->priv->string_email_verbose);
+
+ dest->priv->string = NULL;
+ dest->priv->string_email = NULL;
+ dest->priv->string_email_verbose = NULL;
+}
+
+void
+e_destination_set_card (EDestination *dest, ECard *card, gint email_num)
+{
+ g_return_if_fail (dest && E_IS_DESTINATION (dest));
+ g_return_if_fail (card && E_IS_CARD (card));
+
+ if (dest->priv->card != card) {
+ if (dest->priv->card)
+ gtk_object_unref (GTK_OBJECT (dest->priv->card));
+ dest->priv->card = card;
+ gtk_object_ref (GTK_OBJECT (card));
+ }
+
+ dest->priv->card_email_num = email_num;
+
+ e_destination_clear_strings (dest);
+}
+
+void
+e_destination_set_string (EDestination *dest, const gchar *string)
+{
+ g_return_if_fail (dest && E_IS_DESTINATION (dest));
+ g_return_if_fail (string != NULL);
+
+ g_free (dest->priv->string);
+ dest->priv->string = g_strdup (string);
+}
+
+ECard *
+e_destination_get_card (const EDestination *dest)
+{
+ g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL);
+
+ return dest->priv->card;
+}
+
+const gchar *
+e_destination_get_string (const EDestination *dest)
+{
+ struct _EDestinationPrivate *priv;
+
+ g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL);
+
+ priv = (struct _EDestinationPrivate *)dest->priv; /* cast out const */
+
+ if (priv->string == NULL) {
+
+ if (priv->card) {
+
+ priv->string = e_card_name_to_string (priv->card->name);
+
+ }
+ }
+
+ return priv->string;
+}
+
+gint
+e_destination_get_strlen (const EDestination *dest)
+{
+ const gchar *str;
+
+ g_return_val_if_fail (dest && E_IS_DESTINATION (dest), 0);
+
+ str = e_destination_get_string (dest);
+ return str ? strlen (str) : 0;
+}
+
+const gchar *
+e_destination_get_email (const EDestination *dest)
+{
+ struct _EDestinationPrivate *priv;
+
+ g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL);
+
+ priv = (struct _EDestinationPrivate *)dest->priv; /* cast out const */
+
+ if (priv->string_email == NULL) {
+
+ if (priv->card) { /* Pull the address out of the card. */
+
+ EIterator *iter = e_list_get_iterator (priv->card->email);
+ gint n = priv->card_email_num;
+
+ if (n >= 0) {
+ while (n > 0) {
+ e_iterator_next (iter);
+ --n;
+ }
+
+ if (e_iterator_is_valid (iter)) {
+ gconstpointer ptr = e_iterator_get (iter);
+ priv->string_email = g_strdup ((gchar *) ptr);
+ }
+ }
+
+ } else if (priv->string) { /* Use the string as an e-mail address */
+ return priv->string;
+ }
+
+ /* else we just return NULL */
+ }
+
+ return priv->string_email;
+}
+
+const gchar *
+e_destination_get_email_verbose (const EDestination *dest)
+{
+ struct _EDestinationPrivate *priv;
+
+ g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL);
+
+ priv = (struct _EDestinationPrivate *)dest->priv; /* cast out const */
+
+ if (priv->string_email_verbose == NULL) {
+
+ const gchar *email = e_destination_get_email (dest);
+
+ if (priv->card) {
+
+ priv->string_email_verbose = g_strdup_printf ("%s <%s>",
+ e_card_name_to_string (priv->card->name),
+ email);
+ } else {
+
+ return email;
+ }
+
+ }
+
+ return priv->string_email_verbose;
+}
+
+