2 This file is part of PulseAudio.
4 Copyright 2008 Colin Guthrie
5 Copyright 2007 Lennart Poettering
7 PulseAudio is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as
9 published by the Free Software Foundation; either version 2.1 of the
10 License, or (at your option) any later version.
12 PulseAudio is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public
18 License along with PulseAudio; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
29 #include <pulse/xmalloc.h>
31 #include <pulsecore/hashmap.h>
32 #include <pulsecore/strbuf.h>
33 #include <pulsecore/core-util.h>
35 #include "headerlist.h"
43 #define MAKE_HASHMAP(p) ((pa_hashmap*) (p))
44 #define MAKE_HEADERLIST(p) ((pa_headerlist*) (p))
46 static void header_free(struct header *hdr) {
54 pa_headerlist* pa_headerlist_new(void) {
55 return MAKE_HEADERLIST(pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func));
58 void pa_headerlist_free(pa_headerlist* p) {
61 while ((hdr = pa_hashmap_steal_first(MAKE_HASHMAP(p))))
64 pa_hashmap_free(MAKE_HASHMAP(p), NULL, NULL);
67 int pa_headerlist_puts(pa_headerlist *p, const char *key, const char *value) {
69 pa_bool_t add = FALSE;
74 if (!(hdr = pa_hashmap_get(MAKE_HASHMAP(p), key))) {
75 hdr = pa_xnew(struct header, 1);
76 hdr->key = pa_xstrdup(key);
81 hdr->value = pa_xstrdup(value);
82 hdr->nbytes = strlen(value)+1;
85 pa_hashmap_put(MAKE_HASHMAP(p), hdr->key, hdr);
90 int pa_headerlist_putsappend(pa_headerlist *p, const char *key, const char *value) {
92 pa_bool_t add = FALSE;
97 if (!(hdr = pa_hashmap_get(MAKE_HASHMAP(p), key))) {
98 hdr = pa_xnew(struct header, 1);
99 hdr->key = pa_xstrdup(key);
100 hdr->value = pa_xstrdup(value);
103 void *newval = pa_sprintf_malloc("%s%s", (char*)hdr->value, value);
104 pa_xfree(hdr->value);
107 hdr->nbytes = strlen(hdr->value)+1;
110 pa_hashmap_put(MAKE_HASHMAP(p), hdr->key, hdr);
115 const char *pa_headerlist_gets(pa_headerlist *p, const char *key) {
121 if (!(hdr = pa_hashmap_get(MAKE_HASHMAP(p), key)))
124 if (hdr->nbytes <= 0)
127 if (((char*) hdr->value)[hdr->nbytes-1] != 0)
130 if (strlen((char*) hdr->value) != hdr->nbytes-1)
133 return (char*) hdr->value;
136 int pa_headerlist_remove(pa_headerlist *p, const char *key) {
142 if (!(hdr = pa_hashmap_remove(MAKE_HASHMAP(p), key)))
149 const char *pa_headerlist_iterate(pa_headerlist *p, void **state) {
152 if (!(hdr = pa_hashmap_iterate(MAKE_HASHMAP(p), state, NULL)))
158 char *pa_headerlist_to_string(pa_headerlist *p) {
165 buf = pa_strbuf_new();
167 while ((key = pa_headerlist_iterate(p, &state))) {
171 if ((v = pa_headerlist_gets(p, key)))
172 pa_strbuf_printf(buf, "%s: %s\r\n", key, v);
175 return pa_strbuf_tostring_free(buf);
178 int pa_headerlist_contains(pa_headerlist *p, const char *key) {
182 if (!(pa_hashmap_get(MAKE_HASHMAP(p), key)))