[evolution-data-server/wip/camel-more-gobject] Seal CamelAddress properties
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/wip/camel-more-gobject] Seal CamelAddress properties
- Date: Wed, 2 Nov 2016 16:08:23 +0000 (UTC)
commit a96d4914c42a4644173351383f5f7fcc01a1f374
Author: Milan Crha <mcrha redhat com>
Date: Wed Nov 2 17:08:28 2016 +0100
Seal CamelAddress properties
src/camel/camel-address.c | 42 +++++++-------
src/camel/camel-address.h | 3 +-
src/camel/camel-internet-address.c | 113 +++++++++++++++++++++++++-----------
src/camel/camel-nntp-address.c | 92 +++++++++++++++++++++--------
src/camel/camel-nntp-address.h | 4 +-
5 files changed, 169 insertions(+), 85 deletions(-)
---
diff --git a/src/camel/camel-address.c b/src/camel/camel-address.c
index 9b6e6d3..8897cd1 100644
--- a/src/camel/camel-address.c
+++ b/src/camel/camel-address.c
@@ -18,33 +18,22 @@
#include "camel-address.h"
-G_DEFINE_TYPE (CamelAddress, camel_address, G_TYPE_OBJECT)
-
-static void
-address_finalize (GObject *object)
-{
- CamelAddress *address = CAMEL_ADDRESS (object);
+struct _CamelAddressPrivate {
+ guint dummy;
+};
- camel_address_remove (address, -1);
- g_ptr_array_free (address->addresses, TRUE);
-
- /* Chain up to parent's finalize() method. */
- G_OBJECT_CLASS (camel_address_parent_class)->finalize (object);
-}
+G_DEFINE_TYPE (CamelAddress, camel_address, G_TYPE_OBJECT)
static void
camel_address_class_init (CamelAddressClass *class)
{
- GObjectClass *object_class;
-
- object_class = G_OBJECT_CLASS (class);
- object_class->finalize = address_finalize;
+ g_type_class_add_private (class, sizeof (CamelAddressPrivate));
}
static void
camel_address_init (CamelAddress *address)
{
- address->addresses = g_ptr_array_new ();
+ address->priv = G_TYPE_INSTANCE_GET_PRIVATE (address, CAMEL_TYPE_ADDRESS, CamelAddressPrivate);
}
/**
@@ -90,7 +79,14 @@ camel_address_new_clone (CamelAddress *addr)
gint
camel_address_length (CamelAddress *addr)
{
- return addr->addresses->len;
+ CamelAddressClass *class;
+
+ g_return_val_if_fail (CAMEL_IS_ADDRESS (addr), -1);
+
+ class = CAMEL_ADDRESS_GET_CLASS (addr);
+ g_return_val_if_fail (class->length != NULL, -1);
+
+ return class->length (addr);
}
/**
@@ -236,7 +232,7 @@ camel_address_copy (CamelAddress *dest,
**/
void
camel_address_remove (CamelAddress *addr,
- gint index)
+ gint index)
{
CamelAddressClass *class;
@@ -246,8 +242,12 @@ camel_address_remove (CamelAddress *addr,
g_return_if_fail (class->remove != NULL);
if (index == -1) {
- for (index = addr->addresses->len; index>-1; index--)
+ gint len = camel_address_length (addr);
+
+ for (index = len - 1; index >= 0; index--) {
class->remove (addr, index);
- } else
+ }
+ } else {
class->remove (addr, index);
+ }
}
diff --git a/src/camel/camel-address.h b/src/camel/camel-address.h
index 31c52a5..6965eb2 100644
--- a/src/camel/camel-address.h
+++ b/src/camel/camel-address.h
@@ -54,14 +54,13 @@ typedef struct _CamelAddressPrivate CamelAddressPrivate;
struct _CamelAddress {
GObject parent;
- GPtrArray *addresses;
-
CamelAddressPrivate *priv;
};
struct _CamelAddressClass {
GObjectClass parent_class;
+ gint (*length) (CamelAddress *addr);
gint (*decode) (CamelAddress *addr,
const gchar *raw);
gchar * (*encode) (CamelAddress *addr);
diff --git a/src/camel/camel-internet-address.c b/src/camel/camel-internet-address.c
index 42f87ca..ef7ee51 100644
--- a/src/camel/camel-internet-address.c
+++ b/src/camel/camel-internet-address.c
@@ -25,6 +25,10 @@
#define d(x)
+struct _CamelInternetAddressPrivate {
+ GPtrArray *addresses;
+};
+
struct _address {
gchar *name;
gchar *address;
@@ -33,11 +37,21 @@ struct _address {
G_DEFINE_TYPE (CamelInternetAddress, camel_internet_address, CAMEL_TYPE_ADDRESS)
static gint
-internet_address_decode (CamelAddress *a,
+internet_address_length (CamelAddress *paddr)
+{
+ CamelInternetAddress *inet_addr = CAMEL_INTERNET_ADDRESS (paddr);
+
+ g_return_val_if_fail (inet_addr != NULL, -1);
+
+ return inet_addr->priv->addresses->len;
+}
+
+static gint
+internet_address_decode (CamelAddress *addr,
const gchar *raw)
{
CamelHeaderAddress *ha, *n;
- gint count = a->addresses->len;
+ gint count = camel_address_length (addr);
/* Should probably use its own decoder or something */
ha = camel_header_address_decode (raw, NULL);
@@ -45,12 +59,12 @@ internet_address_decode (CamelAddress *a,
n = ha;
while (n) {
if (n->type == CAMEL_HEADER_ADDRESS_NAME) {
- camel_internet_address_add ((CamelInternetAddress *) a, n->name, n->v.addr);
+ camel_internet_address_add ((CamelInternetAddress *) addr, n->name,
n->v.addr);
} else if (n->type == CAMEL_HEADER_ADDRESS_GROUP) {
CamelHeaderAddress *g = n->v.members;
while (g) {
if (g->type == CAMEL_HEADER_ADDRESS_NAME)
- camel_internet_address_add ((CamelInternetAddress *) a,
g->name, g->v.addr);
+ camel_internet_address_add ((CamelInternetAddress *) addr,
g->name, g->v.addr);
/* otherwise, it's an error, infact */
g = g->next;
}
@@ -60,24 +74,25 @@ internet_address_decode (CamelAddress *a,
camel_header_address_list_clear (&ha);
}
- return a->addresses->len - count;
+ return camel_address_length (addr) - count;
}
static gchar *
-internet_address_encode (CamelAddress *a)
+internet_address_encode (CamelAddress *paddr)
{
+ CamelInternetAddress *inet_addr = CAMEL_INTERNET_ADDRESS (paddr);
gint i;
GString *out;
gchar *ret;
gint len = 6; /* "From: ", assume longer of the address headers */
- if (a->addresses->len == 0)
+ if (inet_addr->priv->addresses->len == 0)
return NULL;
out = g_string_new ("");
- for (i = 0; i < a->addresses->len; i++) {
- struct _address *addr = g_ptr_array_index (a->addresses, i);
+ for (i = 0; i < inet_addr->priv->addresses->len; i++) {
+ struct _address *addr = g_ptr_array_index (inet_addr->priv->addresses, i);
gchar *enc;
if (i != 0)
@@ -95,12 +110,13 @@ internet_address_encode (CamelAddress *a)
}
static gint
-internet_address_unformat (CamelAddress *a,
+internet_address_unformat (CamelAddress *paddr,
const gchar *raw)
{
+ CamelInternetAddress *inet_addr = CAMEL_INTERNET_ADDRESS (paddr);
gchar *buffer, *p, *name, *addr;
gint c;
- gint count = a->addresses->len;
+ gint count = inet_addr->priv->addresses->len;
if (raw == NULL)
return 0;
@@ -148,7 +164,7 @@ internet_address_unformat (CamelAddress *a,
addr = g_strstrip (addr);
if (addr[0]) {
d (printf ("found address: '%s' <%s>\n", name, addr));
- camel_internet_address_add ((CamelInternetAddress *) a, name, addr);
+ camel_internet_address_add (inet_addr, name, addr);
}
name = NULL;
addr = p;
@@ -158,23 +174,24 @@ internet_address_unformat (CamelAddress *a,
g_free (buffer);
- return a->addresses->len - count;
+ return inet_addr->priv->addresses->len - count;
}
static gchar *
-internet_address_format (CamelAddress *a)
+internet_address_format (CamelAddress *paddr)
{
+ CamelInternetAddress *inet_addr = CAMEL_INTERNET_ADDRESS (paddr);
gint i;
GString *out;
gchar *ret;
- if (a->addresses->len == 0)
+ if (inet_addr->priv->addresses->len == 0)
return NULL;
out = g_string_new ("");
- for (i = 0; i < a->addresses->len; i++) {
- struct _address *addr = g_ptr_array_index (a->addresses, i);
+ for (i = 0; i < inet_addr->priv->addresses->len; i++) {
+ struct _address *addr = g_ptr_array_index (inet_addr->priv->addresses, i);
gchar *enc;
if (i != 0)
@@ -192,43 +209,69 @@ internet_address_format (CamelAddress *a)
}
static void
-internet_address_remove (CamelAddress *a,
+internet_address_remove (CamelAddress *paddr,
gint index)
{
+ CamelInternetAddress *inet_addr = CAMEL_INTERNET_ADDRESS (paddr);
struct _address *addr;
- if (index < 0 || index >= a->addresses->len)
+ if (index < 0 || index >= inet_addr->priv->addresses->len)
return;
- addr = g_ptr_array_index (a->addresses, index);
+ addr = g_ptr_array_index (inet_addr->priv->addresses, index);
g_free (addr->name);
g_free (addr->address);
g_free (addr);
- g_ptr_array_remove_index (a->addresses, index);
+ g_ptr_array_remove_index (inet_addr->priv->addresses, index);
}
static gint
internet_address_cat (CamelAddress *dest,
CamelAddress *source)
{
+ CamelInternetAddress *dest_inet_addr;
+ CamelInternetAddress *source_inet_addr;
gint i;
+ g_return_val_if_fail (CAMEL_IS_INTERNET_ADDRESS (dest), -1);
g_return_val_if_fail (CAMEL_IS_INTERNET_ADDRESS (source), -1);
- for (i = 0; i < source->addresses->len; i++) {
- struct _address *addr = g_ptr_array_index (source->addresses, i);
- camel_internet_address_add ((CamelInternetAddress *) dest, addr->name, addr->address);
+ dest_inet_addr = CAMEL_INTERNET_ADDRESS (dest);
+ source_inet_addr = CAMEL_INTERNET_ADDRESS (source);
+
+ for (i = 0; i < source_inet_addr->priv->addresses->len; i++) {
+ struct _address *addr = g_ptr_array_index (source_inet_addr->priv->addresses, i);
+ camel_internet_address_add (dest_inet_addr, addr->name, addr->address);
}
return i;
}
static void
+internet_address_finalize (GObject *object)
+{
+ CamelInternetAddress *inet_addr = CAMEL_INTERNET_ADDRESS (object);
+
+ camel_address_remove (CAMEL_ADDRESS (inet_addr), -1);
+ g_ptr_array_free (inet_addr->priv->addresses, TRUE);
+
+ /* Chain up to parent's finalize() method. */
+ G_OBJECT_CLASS (camel_internet_address_parent_class)->finalize (object);
+}
+
+static void
camel_internet_address_class_init (CamelInternetAddressClass *class)
{
CamelAddressClass *address_class;
+ GObjectClass *object_class;
+
+ g_type_class_add_private (class, sizeof (CamelInternetAddressPrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->finalize = internet_address_finalize;
address_class = CAMEL_ADDRESS_CLASS (class);
+ address_class->length = internet_address_length;
address_class->decode = internet_address_decode;
address_class->encode = internet_address_encode;
address_class->unformat = internet_address_unformat;
@@ -240,6 +283,8 @@ camel_internet_address_class_init (CamelInternetAddressClass *class)
static void
camel_internet_address_init (CamelInternetAddress *internet_address)
{
+ internet_address->priv = G_TYPE_INSTANCE_GET_PRIVATE (internet_address, CAMEL_TYPE_INTERNET_ADDRESS,
CamelInternetAddressPrivate);
+ internet_address->priv->addresses = g_ptr_array_new ();
}
/**
@@ -278,8 +323,8 @@ camel_internet_address_add (CamelInternetAddress *addr,
new = g_malloc (sizeof (*new));
new->name = g_strdup (name);
new->address = g_strdup (address);
- index = ((CamelAddress *) addr)->addresses->len;
- g_ptr_array_add (((CamelAddress *) addr)->addresses, new);
+ index = addr->priv->addresses->len;
+ g_ptr_array_add (addr->priv->addresses, new);
return index;
}
@@ -305,10 +350,10 @@ camel_internet_address_get (CamelInternetAddress *addr,
g_return_val_if_fail (CAMEL_IS_INTERNET_ADDRESS (addr), FALSE);
- if (index < 0 || index >= ((CamelAddress *) addr)->addresses->len)
+ if (index < 0 || index >= addr->priv->addresses->len)
return FALSE;
- a = g_ptr_array_index (((CamelAddress *) addr)->addresses, index);
+ a = g_ptr_array_index (addr->priv->addresses, index);
if (namep)
*namep = a->name;
if (addressp)
@@ -337,9 +382,9 @@ camel_internet_address_find_name (CamelInternetAddress *addr,
g_return_val_if_fail (CAMEL_IS_INTERNET_ADDRESS (addr), -1);
- len = ((CamelAddress *) addr)->addresses->len;
+ len = addr->priv->addresses->len;
for (i = 0; i < len; i++) {
- a = g_ptr_array_index (((CamelAddress *) addr)->addresses, i);
+ a = g_ptr_array_index (addr->priv->addresses, i);
if (a->name && !strcmp (a->name, name)) {
if (addressp)
*addressp = a->address;
@@ -391,10 +436,10 @@ camel_internet_address_ensure_ascii_domains (CamelInternetAddress *addr)
g_return_if_fail (CAMEL_IS_INTERNET_ADDRESS (addr));
- len = ((CamelAddress *) addr)->addresses->len;
+ len = addr->priv->addresses->len;
for (i = 0; i < len; i++) {
gint at_pos = -1;
- a = g_ptr_array_index (((CamelAddress *) addr)->addresses, i);
+ a = g_ptr_array_index (addr->priv->addresses, i);
if (a->address && !domain_contains_only_ascii (a->address, &at_pos)) {
gchar *address, *domain;
@@ -434,9 +479,9 @@ camel_internet_address_find_address (CamelInternetAddress *addr,
g_return_val_if_fail (CAMEL_IS_INTERNET_ADDRESS (addr), -1);
- len = ((CamelAddress *) addr)->addresses->len;
+ len = addr->priv->addresses->len;
for (i = 0; i < len; i++) {
- a = g_ptr_array_index (((CamelAddress *) addr)->addresses, i);
+ a = g_ptr_array_index (addr->priv->addresses, i);
if (!strcmp (a->address, address)) {
if (namep)
*namep = a->name;
diff --git a/src/camel/camel-nntp-address.c b/src/camel/camel-nntp-address.c
index 3e16a29..60729dc 100644
--- a/src/camel/camel-nntp-address.c
+++ b/src/camel/camel-nntp-address.c
@@ -24,20 +24,30 @@
#define d(x)
-struct _address {
- gchar *name;
- gchar *address;
+struct _CamelNNTPAddressPrivate {
+ GPtrArray *addresses;
};
G_DEFINE_TYPE (CamelNNTPAddress, camel_nntp_address, CAMEL_TYPE_ADDRESS)
+static gint
+nntp_address_length (CamelAddress *paddr)
+{
+ CamelNNTPAddress *nntp_addr = CAMEL_NNTP_ADDRESS (paddr);
+
+ g_return_val_if_fail (nntp_addr != NULL, -1);
+
+ return nntp_addr->priv->addresses->len;
+}
+
/* since newsgropus are 7bit ascii, decode/unformat are the same */
static gint
nntp_address_decode (CamelAddress *address,
const gchar *raw)
{
+ CamelNNTPAddress *nntp_addr = CAMEL_NNTP_ADDRESS (address);
GSList *ha, *n;
- gint count = address->addresses->len;
+ gint count = nntp_addr->priv->addresses->len;
ha = camel_header_newsgroups_decode (raw);
for (n = ha; n != NULL; n = n->next) {
@@ -45,27 +55,28 @@ nntp_address_decode (CamelAddress *address,
}
g_slist_free_full (ha, g_free);
- return address->addresses->len - count;
+ return nntp_addr->priv->addresses->len - count;
}
/* since newsgropus are 7bit ascii, encode/format are the same */
static gchar *
nntp_address_encode (CamelAddress *address)
{
+ CamelNNTPAddress *nntp_addr = CAMEL_NNTP_ADDRESS (address);
gint i;
GString *out;
gchar *ret;
- if (address->addresses->len == 0)
+ if (nntp_addr->priv->addresses->len == 0)
return NULL;
out = g_string_new ("");
- for (i = 0; i < address->addresses->len; i++) {
+ for (i = 0; i < nntp_addr->priv->addresses->len; i++) {
if (i != 0)
g_string_append (out, ", ");
- g_string_append (out, g_ptr_array_index (address->addresses, i));
+ g_string_append (out, g_ptr_array_index (nntp_addr->priv->addresses, i));
}
ret = out->str;
@@ -78,14 +89,19 @@ static gint
nntp_address_cat (CamelAddress *dest,
CamelAddress *source)
{
+ CamelNNTPAddress *dest_nntp_addr;
+ CamelNNTPAddress *source_nntp_addr;
gint ii;
+ g_return_val_if_fail (CAMEL_IS_NNTP_ADDRESS (dest), -1);
g_return_val_if_fail (CAMEL_IS_NNTP_ADDRESS (source), -1);
- for (ii = 0; ii < source->addresses->len; ii++)
- camel_nntp_address_add (
- CAMEL_NNTP_ADDRESS (dest),
- g_ptr_array_index (source->addresses, ii));
+ dest_nntp_addr = CAMEL_NNTP_ADDRESS (dest);
+ source_nntp_addr = CAMEL_NNTP_ADDRESS (source);
+
+ for (ii = 0; ii < source_nntp_addr->priv->addresses->len; ii++) {
+ camel_nntp_address_add (dest_nntp_addr, g_ptr_array_index (source_nntp_addr->priv->addresses,
ii));
+ }
return ii;
}
@@ -94,19 +110,41 @@ static void
nntp_address_remove (CamelAddress *address,
gint index)
{
- if (index < 0 || index >= address->addresses->len)
+ CamelNNTPAddress *nntp_addr = CAMEL_NNTP_ADDRESS (address);
+
+ if (index < 0 || index >= nntp_addr->priv->addresses->len)
return;
- g_free (g_ptr_array_index (address->addresses, index));
- g_ptr_array_remove_index (address->addresses, index);
+ g_free (g_ptr_array_index (nntp_addr->priv->addresses, index));
+ g_ptr_array_remove_index (nntp_addr->priv->addresses, index);
+}
+
+
+static void
+nntp_address_finalize (GObject *object)
+{
+ CamelNNTPAddress *nntp_addr = CAMEL_NNTP_ADDRESS (object);
+
+ camel_address_remove (CAMEL_ADDRESS (nntp_addr), -1);
+ g_ptr_array_free (nntp_addr->priv->addresses, TRUE);
+
+ /* Chain up to parent's finalize() method. */
+ G_OBJECT_CLASS (camel_nntp_address_parent_class)->finalize (object);
}
static void
camel_nntp_address_class_init (CamelNNTPAddressClass *class)
{
CamelAddressClass *address_class;
+ GObjectClass *object_class;
+
+ g_type_class_add_private (class, sizeof (CamelNNTPAddressPrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->finalize = nntp_address_finalize;
address_class = CAMEL_ADDRESS_CLASS (class);
+ address_class->length = nntp_address_length;
address_class->decode = nntp_address_decode;
address_class->encode = nntp_address_encode;
address_class->unformat = nntp_address_decode;
@@ -118,6 +156,8 @@ camel_nntp_address_class_init (CamelNNTPAddressClass *class)
static void
camel_nntp_address_init (CamelNNTPAddress *nntp_address)
{
+ nntp_address->priv = G_TYPE_INSTANCE_GET_PRIVATE (nntp_address, CAMEL_TYPE_NNTP_ADDRESS,
CamelNNTPAddressPrivate);
+ nntp_address->priv->addresses = g_ptr_array_new ();
}
/**
@@ -135,7 +175,7 @@ camel_nntp_address_new (void)
/**
* camel_nntp_address_add:
- * @a: nntp address object
+ * @addr: nntp address object
* @name:
*
* Add a new nntp address to the address object. Duplicates are not added twice.
@@ -143,26 +183,26 @@ camel_nntp_address_new (void)
* Returns: Index of added entry, or existing matching entry.
**/
gint
-camel_nntp_address_add (CamelNNTPAddress *a,
+camel_nntp_address_add (CamelNNTPAddress *addr,
const gchar *name)
{
gint index, i;
- g_return_val_if_fail (CAMEL_IS_NNTP_ADDRESS (a), -1);
+ g_return_val_if_fail (CAMEL_IS_NNTP_ADDRESS (addr), -1);
- index = ((CamelAddress *) a)->addresses->len;
+ index = addr->priv->addresses->len;
for (i = 0; i < index; i++)
- if (!strcmp (g_ptr_array_index (((CamelAddress *) a)->addresses, i), name))
+ if (!strcmp (g_ptr_array_index (addr->priv->addresses, i), name))
return i;
- g_ptr_array_add (((CamelAddress *) a)->addresses, g_strdup (name));
+ g_ptr_array_add (addr->priv->addresses, g_strdup (name));
return index;
}
/**
* camel_nntp_address_get:
- * @a: nntp address object
+ * @addr: nntp address object
* @index: address's array index
* @namep: Holder for the returned address, or NULL, if not required.
*
@@ -171,17 +211,17 @@ camel_nntp_address_add (CamelNNTPAddress *a,
* Returns: TRUE if such an address exists, or FALSE otherwise.
**/
gboolean
-camel_nntp_address_get (CamelNNTPAddress *a,
+camel_nntp_address_get (CamelNNTPAddress *addr,
gint index,
const gchar **namep)
{
- g_return_val_if_fail (CAMEL_IS_NNTP_ADDRESS (a), FALSE);
+ g_return_val_if_fail (CAMEL_IS_NNTP_ADDRESS (addr), FALSE);
- if (index < 0 || index >= ((CamelAddress *) a)->addresses->len)
+ if (index < 0 || index >= addr->priv->addresses->len)
return FALSE;
if (namep)
- *namep = g_ptr_array_index( ((CamelAddress *)a)->addresses, index);
+ *namep = g_ptr_array_index (addr->priv->addresses, index);
return TRUE;
}
diff --git a/src/camel/camel-nntp-address.h b/src/camel/camel-nntp-address.h
index da60b0b..4831aa7 100644
--- a/src/camel/camel-nntp-address.h
+++ b/src/camel/camel-nntp-address.h
@@ -66,9 +66,9 @@ struct _CamelNNTPAddressClass {
GType camel_nntp_address_get_type (void);
CamelNNTPAddress *
camel_nntp_address_new (void);
-gint camel_nntp_address_add (CamelNNTPAddress *a,
+gint camel_nntp_address_add (CamelNNTPAddress *addr,
const gchar *name);
-gboolean camel_nntp_address_get (CamelNNTPAddress *a,
+gboolean camel_nntp_address_get (CamelNNTPAddress *addr,
gint index,
const gchar **namep);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]