From 8c1c565c86ddeb0c2b3b89d53aed0052eca1ebbf Mon Sep 17 00:00:00 2001 From: Colin Guthrie Date: Thu, 1 May 2008 23:35:24 +0000 Subject: Add a small lib to interpret and produce headers as used in http style requests. git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/coling@2332 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/modules/rtp/headerlist.c | 190 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 src/modules/rtp/headerlist.c (limited to 'src/modules/rtp/headerlist.c') diff --git a/src/modules/rtp/headerlist.c b/src/modules/rtp/headerlist.c new file mode 100644 index 00000000..9ea17ae3 --- /dev/null +++ b/src/modules/rtp/headerlist.c @@ -0,0 +1,190 @@ +/* $Id$ */ + +/*** + This file is part of PulseAudio. + + Copyright 2008 Colin Guthrie + Copyright 2007 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include + +#include +#include +#include + +#include "headerlist.h" + +struct header { + char *key; + void *value; + size_t nbytes; +}; + +#define MAKE_HASHMAP(p) ((pa_hashmap*) (p)) +#define MAKE_HEADERLIST(p) ((pa_headerlist*) (p)) + +static void header_free(struct header *hdr) { + pa_assert(hdr); + + pa_xfree(hdr->key); + pa_xfree(hdr->value); + pa_xfree(hdr); +} + +pa_headerlist* pa_headerlist_new(void) { + return MAKE_HEADERLIST(pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func)); +} + +void pa_headerlist_free(pa_headerlist* p) { + struct header *hdr; + + while ((hdr = pa_hashmap_steal_first(MAKE_HASHMAP(p)))) + header_free(hdr); + + pa_hashmap_free(MAKE_HASHMAP(p), NULL, NULL); +} + +int pa_headerlist_puts(pa_headerlist *p, const char *key, const char *value) { + struct header *hdr; + pa_bool_t add = FALSE; + + pa_assert(p); + pa_assert(key); + + if (!(hdr = pa_hashmap_get(MAKE_HASHMAP(p), key))) { + hdr = pa_xnew(struct header, 1); + hdr->key = pa_xstrdup(key); + add = TRUE; + } else + pa_xfree(hdr->value); + + hdr->value = pa_xstrdup(value); + hdr->nbytes = strlen(value)+1; + + if (add) + pa_hashmap_put(MAKE_HASHMAP(p), hdr->key, hdr); + + return 0; +} + +int pa_headerlist_putsappend(pa_headerlist *p, const char *key, const char *value) { + struct header *hdr; + pa_bool_t add = FALSE; + pa_strbuf *buf; + + pa_assert(p); + pa_assert(key); + + buf = pa_strbuf_new(); + if (!(hdr = pa_hashmap_get(MAKE_HASHMAP(p), key))) { + hdr = pa_xnew(struct header, 1); + hdr->key = pa_xstrdup(key); + add = TRUE; + } else { + pa_strbuf_puts(buf, hdr->value); + pa_xfree(hdr->value); + } + pa_strbuf_puts(buf, value); + hdr->value = pa_strbuf_tostring_free(buf); + hdr->nbytes = strlen(hdr->value)+1; + + if (add) + pa_hashmap_put(MAKE_HASHMAP(p), hdr->key, hdr); + + return 0; +} + +const char *pa_headerlist_gets(pa_headerlist *p, const char *key) { + struct header *hdr; + + pa_assert(p); + pa_assert(key); + + if (!(hdr = pa_hashmap_get(MAKE_HASHMAP(p), key))) + return NULL; + + if (hdr->nbytes <= 0) + return NULL; + + if (((char*) hdr->value)[hdr->nbytes-1] != 0) + return NULL; + + if (strlen((char*) hdr->value) != hdr->nbytes-1) + return NULL; + + return (char*) hdr->value; +} + +int pa_headerlist_remove(pa_headerlist *p, const char *key) { + struct header *hdr; + + pa_assert(p); + pa_assert(key); + + if (!(hdr = pa_hashmap_remove(MAKE_HASHMAP(p), key))) + return -1; + + header_free(hdr); + return 0; +} + +const char *pa_headerlist_iterate(pa_headerlist *p, void **state) { + struct header *hdr; + + if (!(hdr = pa_hashmap_iterate(MAKE_HASHMAP(p), state, NULL))) + return NULL; + + return hdr->key; +} + +char *pa_headerlist_to_string(pa_headerlist *p) { + const char *key; + void *state = NULL; + pa_strbuf *buf; + + pa_assert(p); + + buf = pa_strbuf_new(); + + while ((key = pa_headerlist_iterate(p, &state))) { + + const char *v; + + if ((v = pa_headerlist_gets(p, key))) + pa_strbuf_printf(buf, "%s: %s\r\n", key, v); + } + + return pa_strbuf_tostring_free(buf); +} + +int pa_headerlist_contains(pa_headerlist *p, const char *key) { + pa_assert(p); + pa_assert(key); + + if (!(pa_hashmap_get(MAKE_HASHMAP(p), key))) + return 0; + + return 1; +} -- cgit From 91edf9eaca3a0da83484c9c3787beff2cc7a5945 Mon Sep 17 00:00:00 2001 From: Colin Guthrie Date: Fri, 2 May 2008 09:47:09 +0000 Subject: Use pa_sprintf_malloc to do simple concatenation rather than using the higher overhead of pa_strbuf git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/coling@2348 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/modules/rtp/headerlist.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'src/modules/rtp/headerlist.c') diff --git a/src/modules/rtp/headerlist.c b/src/modules/rtp/headerlist.c index 9ea17ae3..8bdc7251 100644 --- a/src/modules/rtp/headerlist.c +++ b/src/modules/rtp/headerlist.c @@ -92,22 +92,20 @@ int pa_headerlist_puts(pa_headerlist *p, const char *key, const char *value) { int pa_headerlist_putsappend(pa_headerlist *p, const char *key, const char *value) { struct header *hdr; pa_bool_t add = FALSE; - pa_strbuf *buf; pa_assert(p); pa_assert(key); - buf = pa_strbuf_new(); if (!(hdr = pa_hashmap_get(MAKE_HASHMAP(p), key))) { hdr = pa_xnew(struct header, 1); hdr->key = pa_xstrdup(key); + hdr->value = pa_xstrdup(value); add = TRUE; } else { - pa_strbuf_puts(buf, hdr->value); + void *newval = (void*)pa_sprintf_malloc("%s%s", (char*)hdr->value, value); pa_xfree(hdr->value); + hdr->value = newval; } - pa_strbuf_puts(buf, value); - hdr->value = pa_strbuf_tostring_free(buf); hdr->nbytes = strlen(hdr->value)+1; if (add) -- cgit From cb8c5a925fc22819626cbe4525b1d334db75d071 Mon Sep 17 00:00:00 2001 From: Colin Guthrie Date: Sun, 11 May 2008 15:34:37 +0000 Subject: Some misc fixes. consts, base64 optimisation (not that it will be with us long anyway), and c comments git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/coling@2407 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/modules/rtp/headerlist.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/modules/rtp/headerlist.c') diff --git a/src/modules/rtp/headerlist.c b/src/modules/rtp/headerlist.c index 8bdc7251..de8710b7 100644 --- a/src/modules/rtp/headerlist.c +++ b/src/modules/rtp/headerlist.c @@ -102,7 +102,7 @@ int pa_headerlist_putsappend(pa_headerlist *p, const char *key, const char *valu hdr->value = pa_xstrdup(value); add = TRUE; } else { - void *newval = (void*)pa_sprintf_malloc("%s%s", (char*)hdr->value, value); + void *newval = pa_sprintf_malloc("%s%s", (char*)hdr->value, value); pa_xfree(hdr->value); hdr->value = newval; } -- cgit From c3d8bb5b34c45f4dda594cc1d8107cac468fa232 Mon Sep 17 00:00:00 2001 From: Colin Guthrie Date: Sun, 3 Aug 2008 20:56:21 +0100 Subject: Remove $Id$ lines left over from SVN --- src/modules/rtp/headerlist.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/modules/rtp/headerlist.c') diff --git a/src/modules/rtp/headerlist.c b/src/modules/rtp/headerlist.c index de8710b7..0fef835b 100644 --- a/src/modules/rtp/headerlist.c +++ b/src/modules/rtp/headerlist.c @@ -1,5 +1,3 @@ -/* $Id$ */ - /*** This file is part of PulseAudio. -- cgit