gmime r1329 - in trunk: . docs/reference gmime tests
- From: fejj svn gnome org
- To: svn-commits-list gnome org
- Subject: gmime r1329 - in trunk: . docs/reference gmime tests
- Date: Mon, 2 Jun 2008 03:04:25 +0000 (UTC)
Author: fejj
Date: Mon Jun 2 03:04:25 2008
New Revision: 1329
URL: http://svn.gnome.org/viewvc/gmime?rev=1329&view=rev
Log:
2008-06-01 Jeffrey Stedfast <fejj novell com>
* gmime/gmime-header.c (g_mime_header_iter_new): New function to
allocate an iter on the heap.
(g_mime_header_iter_copy_to): New copy function so that you can
copy to a pre-allocated destination iter.
(g_mime_header_list_get_iter): Changed the API a bit. Instead of
returning a newly allocated iter, instead return bool and take an
iter arg to initialize.
Modified:
trunk/ChangeLog
trunk/docs/reference/gmime-sections.txt
trunk/docs/reference/gmime.hierarchy
trunk/gmime/gmime-header.c
trunk/gmime/gmime-header.h
trunk/gmime/gmime-message-partial.c
trunk/tests/test-headers.c
Modified: trunk/docs/reference/gmime-sections.txt
==============================================================================
--- trunk/docs/reference/gmime-sections.txt (original)
+++ trunk/docs/reference/gmime-sections.txt Mon Jun 2 03:04:25 2008
@@ -575,8 +575,10 @@
GMimeHeaderIter
GMimeHeaderList
GMimeHeaderWriter
-g_mime_header_iter_copy
+g_mime_header_iter_new
g_mime_header_iter_free
+g_mime_header_iter_copy
+g_mime_header_iter_copy_to
g_mime_header_iter_equal
g_mime_header_iter_first
g_mime_header_iter_last
Modified: trunk/docs/reference/gmime.hierarchy
==============================================================================
--- trunk/docs/reference/gmime.hierarchy (original)
+++ trunk/docs/reference/gmime.hierarchy Mon Jun 2 03:04:25 2008
@@ -36,4 +36,3 @@
GMimeStreamMmap
GMimeStreamNull
GInterface
- GTypePlugin
Modified: trunk/gmime/gmime-header.c
==============================================================================
--- trunk/gmime/gmime-header.c (original)
+++ trunk/gmime/gmime-header.c Mon Jun 2 03:04:25 2008
@@ -45,36 +45,43 @@
**/
-typedef struct _GMimeHeader GMimeHeader;
-
-struct _GMimeHeaderList {
- GHashTable *writers;
- GHashTable *hash;
- List iters;
- List list;
- char *raw;
-};
-
/**
* GMimeHeader:
+ * @next: pointer to the next header
+ * @prev: pointer to the previous header
+ * @offset: file/stream offset
+ * @name: header name
+ * @value: header value
*
* A message/rfc822 header.
**/
+
+typedef struct _GMimeHeader GMimeHeader;
+
struct _GMimeHeader {
- struct _GMimeHeader *next;
- struct _GMimeHeader *prev;
+ GMimeHeader *next;
+ GMimeHeader *prev;
gint64 offset;
char *name;
char *value;
};
struct _GMimeHeaderIter {
- struct _GMimeHeaderIter *next;
- struct _GMimeHeaderIter *prev;
- GMimeHeaderList *headers;
+ GMimeHeaderIter *next;
+ GMimeHeaderIter *prev;
+ GMimeHeaderList *hdrlist;
GMimeHeader *cursor;
};
+struct _GMimeHeaderList {
+ GHashTable *writers;
+ GHashTable *hash;
+ List iters;
+ List list;
+ char *raw;
+};
+
+
static void g_mime_header_list_invalidate_iters (GMimeHeaderList *headers, GMimeHeader *header);
static GMimeHeader *g_mime_header_new (const char *name, const char *value, gint64 offset);
static void g_mime_header_free (GMimeHeader *header);
@@ -122,6 +129,28 @@
/**
+ * g_mime_header_iter_new:
+ *
+ * Instantiate a new #GMimeHeaderIter.
+ *
+ * Returns: a new #GMimeHeaderIter.
+ **/
+GMimeHeaderIter *
+g_mime_header_iter_new (void)
+{
+ GMimeHeaderIter *iter;
+
+ iter = g_new (GMimeHeaderIter, 1);
+ iter->hdrlist = NULL;
+ iter->cursor = NULL;
+ iter->next = NULL;
+ iter->prev = NULL;
+
+ return iter;
+}
+
+
+/**
* g_mime_header_iter_copy:
* @iter: a #GMimeHeaderIter
*
@@ -136,18 +165,51 @@
g_return_val_if_fail (iter != NULL, NULL);
- copy = g_new (GMimeHeaderIter, 1);
- copy->headers = iter->headers;
+ copy = g_mime_header_iter_new ();
+ if (!g_mime_header_iter_is_valid (iter))
+ return copy;
+
+ copy->hdrlist = iter->hdrlist;
copy->cursor = iter->cursor;
- if (iter->headers)
- list_append (&iter->headers->iters, (ListNode *) copy);
+ if (iter->hdrlist)
+ list_append (&iter->hdrlist->iters, (ListNode *) copy);
return copy;
}
/**
+ * g_mime_header_iter_copy_to:
+ * @src: a #GMimeHeaderIter
+ * @dest: a #GMimeHeaderIter
+ *
+ * Copies @src to @dest.
+ *
+ * Returns: %TRUE if the copy was successful or %FALSE otherwise.
+ **/
+gboolean
+g_mime_header_iter_copy_to (GMimeHeaderIter *src, GMimeHeaderIter *dest)
+{
+ g_return_if_fail (dest != NULL);
+ g_return_if_fail (src != NULL);
+
+ if (!g_mime_header_iter_is_valid (src))
+ return FALSE;
+
+ /* might already reference another hdrlist... */
+ if (dest->hdrlist && dest->next)
+ list_unlink ((ListNode *) dest);
+
+ list_append (&src->hdrlist->iters, (ListNode *) dest);
+ dest->hdrlist = src->hdrlist;
+ dest->cursor = src->cursor;
+
+ return TRUE;
+}
+
+
+/**
* g_mime_header_iter_free:
* @iter: a #GMimeHeaderIter
*
@@ -158,7 +220,7 @@
{
g_return_if_fail (iter != NULL);
- if (iter->headers)
+ if (iter->hdrlist && iter->next)
list_unlink ((ListNode *) iter);
g_free (iter);
@@ -220,10 +282,10 @@
g_return_val_if_fail (iter != NULL, FALSE);
/* make sure we can actually do as requested */
- if (!iter->headers)
+ if (!iter->hdrlist)
return FALSE;
- first = (GMimeHeader *) iter->headers->list.head;
+ first = (GMimeHeader *) iter->hdrlist->list.head;
if (!first->next)
return FALSE;
@@ -249,10 +311,10 @@
g_return_val_if_fail (iter != NULL, FALSE);
/* make sure we can actually do as requested */
- if (!iter->headers)
+ if (!iter->hdrlist)
return FALSE;
- last = (GMimeHeader *) iter->headers->list.tailpred;
+ last = (GMimeHeader *) iter->hdrlist->list.tailpred;
if (!last->next)
return FALSE;
@@ -278,7 +340,7 @@
g_return_val_if_fail (iter != NULL, FALSE);
/* make sure current cursor is valid */
- if (!iter->cursor || !iter->cursor->next)
+ if (!g_mime_header_iter_is_valid (iter))
return FALSE;
/* make sure next item is valid */
@@ -308,12 +370,12 @@
g_return_val_if_fail (iter != NULL, FALSE);
/* make sure current cursor is valid */
- if (!iter->cursor || !iter->cursor->prev)
+ if (!g_mime_header_iter_is_valid (iter))
return FALSE;
/* make sure prev item is valid */
prev = iter->cursor->prev;
- if (!prev->prev)
+ if (!prev || !prev->prev)
return FALSE;
iter->cursor = prev;
@@ -335,7 +397,7 @@
{
g_return_val_if_fail (iter != NULL, -1);
- if (!iter->cursor || !iter->cursor->next)
+ if (!g_mime_header_iter_is_valid (iter))
return -1;
return iter->cursor->offset;
@@ -355,7 +417,7 @@
{
g_return_val_if_fail (iter != NULL, NULL);
- if (!iter->cursor || !iter->cursor->next)
+ if (!g_mime_header_iter_is_valid (iter))
return NULL;
return iter->cursor->name;
@@ -377,13 +439,13 @@
{
g_return_val_if_fail (iter != NULL, FALSE);
- if (!iter->cursor || !iter->cursor->next)
+ if (!g_mime_header_iter_is_valid (iter))
return FALSE;
g_free (iter->cursor->value);
iter->cursor->value = g_strdup (value);
- g_mime_header_list_set_raw (iter->headers, NULL);
+ g_mime_header_list_set_raw (iter->hdrlist, NULL);
return TRUE;
}
@@ -402,7 +464,7 @@
{
g_return_val_if_fail (iter != NULL, NULL);
- if (!iter->cursor || !iter->cursor->next)
+ if (!g_mime_header_iter_is_valid (iter))
return NULL;
return iter->cursor->value;
@@ -421,31 +483,31 @@
g_mime_header_iter_remove (GMimeHeaderIter *iter)
{
GMimeHeader *cursor, *header, *next;
- GMimeHeaderList *headers;
+ GMimeHeaderList *hdrlist;
g_return_val_if_fail (iter != NULL, FALSE);
- if (!iter->cursor || !iter->cursor->next)
+ if (!g_mime_header_iter_is_valid (iter))
return FALSE;
/* save iter state */
- headers = iter->headers;
+ hdrlist = iter->hdrlist;
cursor = iter->cursor;
next = cursor->next;
- if (!(header = g_hash_table_lookup (headers->hash, cursor->name)))
+ if (!(header = g_hash_table_lookup (hdrlist->hash, cursor->name)))
return FALSE;
if (cursor == header) {
/* update the header lookup table */
GMimeHeader *node = next;
- g_hash_table_remove (headers->hash, cursor->name);
+ g_hash_table_remove (hdrlist->hash, cursor->name);
while (node->next) {
if (!g_ascii_strcasecmp (node->name, cursor->name)) {
/* enter this node into the lookup table */
- g_hash_table_insert (headers->hash, node->name, node);
+ g_hash_table_insert (hdrlist->hash, node->name, node);
break;
}
@@ -454,12 +516,12 @@
}
/* remove/free the header */
- g_mime_header_list_invalidate_iters (iter->headers, cursor);
+ g_mime_header_list_invalidate_iters (iter->hdrlist, cursor);
list_unlink ((ListNode *) cursor);
g_mime_header_free (cursor);
/* restore iter state */
- iter->headers = headers;
+ iter->hdrlist = hdrlist;
iter->cursor = next;
return TRUE;
@@ -486,14 +548,11 @@
if (!header || iter->cursor == header) {
/* invalidate this iter */
+ list_unlink ((ListNode *) iter);
+ iter->hdrlist = NULL;
iter->cursor = NULL;
-
- if (header == NULL) {
- /* invalidating because HeaderList is
- * being destroyed */
- list_unlink ((ListNode *) iter);
- iter->headers = NULL;
- }
+ iter->next = NULL;
+ iter->prev = NULL;
}
iter = next;
@@ -721,26 +780,33 @@
/**
* g_mime_header_list_get_iter:
* @headers: a #GMimeHeaderList
+ * @iter: a #GMimeHeaderIter
*
- * Gets a new iterator for traversing @headers.
+ * Initializes an iterator for traversing @headers.
*
- * Returns: a new #GMimeHeaderIter which must be freed using
- * g_mime_header_iter_free() when finished with it.
+ * Returns: a %TRUE if successful or %FALSE if there are no headers to
+ * traverse.
**/
-GMimeHeaderIter *
-g_mime_header_list_get_iter (GMimeHeaderList *headers)
+gboolean
+g_mime_header_list_get_iter (GMimeHeaderList *headers, GMimeHeaderIter *iter)
{
- GMimeHeaderIter *iter;
+ GMimeHeader *cursor;
- g_return_val_if_fail (headers != NULL, NULL);
+ g_return_val_if_fail (headers != NULL, FALSE);
- iter = g_new (GMimeHeaderIter, 1);
- iter->cursor = (GMimeHeader *) headers->list.head;
- iter->headers = headers;
+ cursor = (GMimeHeader *) headers->list.head;
+ if (!cursor->next)
+ return FALSE;
+
+ /* might already reference another header list */
+ if (iter->hdrlist && iter->next)
+ list_unlink ((ListNode *) iter);
list_append (&headers->iters, (ListNode *) iter);
+ iter->hdrlist = headers;
+ iter->cursor = cursor;
- return iter;
+ return TRUE;
}
Modified: trunk/gmime/gmime-header.h
==============================================================================
--- trunk/gmime/gmime-header.h (original)
+++ trunk/gmime/gmime-header.h Mon Jun 2 03:04:25 2008
@@ -28,15 +28,26 @@
G_BEGIN_DECLS
/**
+ * GMimeHeaderList:
+ *
+ * A message or mime-part header.
+ **/
+typedef struct _GMimeHeaderList GMimeHeaderList;
+
+
+/**
* GMimeHeaderIter:
*
* A message or mime-part header iterator.
**/
typedef struct _GMimeHeaderIter GMimeHeaderIter;
-GMimeHeaderIter *g_mime_header_iter_copy (GMimeHeaderIter *iter);
+GMimeHeaderIter *g_mime_header_iter_new (void);
void g_mime_header_iter_free (GMimeHeaderIter *iter);
+GMimeHeaderIter *g_mime_header_iter_copy (GMimeHeaderIter *iter);
+gboolean g_mime_header_iter_copy_to (GMimeHeaderIter *src, GMimeHeaderIter *dest);
+
gboolean g_mime_header_iter_equal (GMimeHeaderIter *iter1, GMimeHeaderIter *iter2);
gboolean g_mime_header_iter_is_valid (GMimeHeaderIter *iter);
@@ -55,14 +66,6 @@
/**
- * GMimeHeaderList:
- *
- * A message or mime-part header.
- **/
-typedef struct _GMimeHeaderList GMimeHeaderList;
-
-
-/**
* GMimeHeaderWriter:
* @stream: The output stream.
* @name: The field name.
@@ -86,7 +89,7 @@
const char *g_mime_header_list_get (const GMimeHeaderList *headers, const char *name);
gboolean g_mime_header_list_remove (GMimeHeaderList *headers, const char *name);
-GMimeHeaderIter *g_mime_header_list_get_iter (GMimeHeaderList *headers);
+gboolean g_mime_header_list_get_iter (GMimeHeaderList *headers, GMimeHeaderIter *iter);
void g_mime_header_list_register_writer (GMimeHeaderList *headers, const char *name, GMimeHeaderWriter writer);
ssize_t g_mime_header_list_write_to_stream (const GMimeHeaderList *headers, GMimeStream *stream);
Modified: trunk/gmime/gmime-message-partial.c
==============================================================================
--- trunk/gmime/gmime-message-partial.c (original)
+++ trunk/gmime/gmime-message-partial.c Mon Jun 2 03:04:25 2008
@@ -395,8 +395,9 @@
message = g_mime_message_new (FALSE);
list = ((GMimeObject *) base)->headers;
- iter = g_mime_header_list_get_iter (list);
- if (g_mime_header_iter_is_valid (iter)) {
+ iter = g_mime_header_iter_new ();
+
+ if (g_mime_header_list_get_iter (list, iter)) {
do {
name = g_mime_header_iter_get_name (iter);
value = g_mime_header_iter_get_value (iter);
Modified: trunk/tests/test-headers.c
==============================================================================
--- trunk/tests/test-headers.c (original)
+++ trunk/tests/test-headers.c Mon Jun 2 03:04:25 2008
@@ -78,11 +78,15 @@
guint i;
list = header_list_new ();
- iter = g_mime_header_list_get_iter (list);
+
+ iter = g_mime_header_iter_new ();
/* make sure initial iter is valid */
testsuite_check ("initial iter");
try {
+ if (!g_mime_header_list_get_iter (list, iter))
+ throw (exception_new ("get_iter() failed"));
+
if (!g_mime_header_iter_is_valid (iter))
throw (exception_new ("invalid iter"));
@@ -175,7 +179,8 @@
guint i = 0;
list = header_list_new ();
- iter = g_mime_header_list_get_iter (list);
+ iter = g_mime_header_iter_new ();
+ g_mime_header_list_get_iter (list, iter);
testsuite_check ("removing all headers");
try {
@@ -193,9 +198,7 @@
testsuite_check_failed ("removing all headers: %s", ex->message);
} finally;
- g_mime_header_iter_free (iter);
-
- iter = g_mime_header_list_get_iter (list);
+ g_mime_header_list_get_iter (list, iter);
testsuite_check ("empty list iter");
try {
@@ -221,7 +224,8 @@
guint i;
list = header_list_new ();
- iter1 = g_mime_header_list_get_iter (list);
+ iter1 = g_mime_header_iter_new ();
+ g_mime_header_list_get_iter (list, iter1);
testsuite_check ("iter copying");
try {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]