diff options
author | Stef Walter <stefw@collabora.co.uk> | 2011-11-16 08:38:44 +0100 |
---|---|---|
committer | Stef Walter <stefw@collabora.co.uk> | 2011-11-16 08:38:44 +0100 |
commit | 97cd79171dfbba24394f070f3946b20c2d518d2d (patch) | |
tree | 540aba58679965270f56d4b5a1ef5ee0e4a4903f /egg/egg-armor.c | |
parent | 44aac490b6866c01d81975de2094899ed843bbc1 (diff) | |
download | gcr-97cd79171dfbba24394f070f3946b20c2d518d2d.tar.gz |
gcr: Use GBytes immutable ref counted byte buffers
* Copy from glib patch to EggBytes
* This allows us to reliably build up ASN.1 structures from different
sources, and is needed for the certificate request work.
https://bugzilla.gnome.org/show_bug.cgi?id=663291
Diffstat (limited to 'egg/egg-armor.c')
-rw-r--r-- | egg/egg-armor.c | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/egg/egg-armor.c b/egg/egg-armor.c index 5a4b047..b82730b 100644 --- a/egg/egg-armor.c +++ b/egg/egg-armor.c @@ -269,48 +269,52 @@ egg_armor_headers_new (void) } guint -egg_armor_parse (gconstpointer data, - gsize n_data, +egg_armor_parse (EggBytes *data, EggArmorCallback callback, gpointer user_data) { - const gchar *beg, *end; + const gchar *beg, *end, *at; const gchar *outer_beg, *outer_end; guint nfound = 0; guchar *decoded = NULL; gsize n_decoded = 0; GHashTable *headers = NULL; + EggBytes *dec; + EggBytes *outer; GQuark type; + gsize n_at; - g_return_val_if_fail (data, 0); - g_return_val_if_fail (n_data, 0); + g_return_val_if_fail (data != NULL, 0); + at = egg_bytes_get_data (data); + n_at = egg_bytes_get_size (data); - while (n_data > 0) { + while (n_at > 0) { /* This returns the first character after the PEM BEGIN header */ - beg = armor_find_begin ((const gchar*)data, n_data, &type, &outer_beg); + beg = armor_find_begin (at, n_at, &type, &outer_beg); if (beg == NULL) break; g_assert (type); /* This returns the character position before the PEM END header */ - end = armor_find_end ((const gchar*)beg, - n_data - ((const gchar*)beg - (const gchar *)data), - type, &outer_end); + end = armor_find_end (beg, n_at - (beg - at), type, &outer_end); if (end == NULL) break; if (beg != end) { if (armor_parse_block (beg, end - beg, &decoded, &n_decoded, &headers)) { g_assert (outer_end > outer_beg); - if (callback != NULL) - (callback) (type, - decoded, n_decoded, - outer_beg, outer_end - outer_beg, - headers, user_data); + dec = egg_bytes_new_with_free_func (decoded, n_decoded, + egg_secure_free, decoded); + if (callback != NULL) { + outer = egg_bytes_new_with_free_func (outer_beg, outer_end - outer_beg, + egg_bytes_unref, egg_bytes_ref (data)); + (callback) (type, dec, outer, headers, user_data); + egg_bytes_unref (outer); + } + egg_bytes_unref (dec); ++nfound; - egg_secure_free (decoded); if (headers) g_hash_table_remove_all (headers); } @@ -318,8 +322,8 @@ egg_armor_parse (gconstpointer data, /* Try for another block */ end += ARMOR_SUFF_L; - n_data -= (const gchar*)end - (const gchar*)data; - data = end; + n_at -= (const gchar*)end - (const gchar*)at; + at = end; } if (headers) |