4 This file is part of PulseAudio.
6 Copyright 2008 Colin Guthrie
7 Copyright 2007 Lennart Poettering
9 PulseAudio is free software; you can redistribute it and/or modify
10 it under the terms of the GNU Lesser General Public License as
11 published by the Free Software Foundation; either version 2.1 of the
12 License, or (at your option) any later version.
14 PulseAudio is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
19 You should have received a copy of the GNU Lesser General Public
20 License along with PulseAudio; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
31 #include <pulse/xmalloc.h>
33 #include <pulsecore/hashmap.h>
34 #include <pulsecore/strbuf.h>
35 #include <pulsecore/core-util.h>
37 #include "headerlist.h"
45 #define MAKE_HASHMAP(p) ((pa_hashmap*) (p))
46 #define MAKE_HEADERLIST(p) ((pa_headerlist*) (p))
48 static void header_free(struct header *hdr) {
56 pa_headerlist* pa_headerlist_new(void) {
57 return MAKE_HEADERLIST(pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func));
60 void pa_headerlist_free(pa_headerlist* p) {
63 while ((hdr = pa_hashmap_steal_first(MAKE_HASHMAP(p))))
66 pa_hashmap_free(MAKE_HASHMAP(p), NULL, NULL);
69 int pa_headerlist_puts(pa_headerlist *p, const char *key, const char *value) {
71 pa_bool_t add = FALSE;
76 if (!(hdr = pa_hashmap_get(MAKE_HASHMAP(p), key))) {
77 hdr = pa_xnew(struct header, 1);
78 hdr->key = pa_xstrdup(key);
83 hdr->value = pa_xstrdup(value);
84 hdr->nbytes = strlen(value)+1;
87 pa_hashmap_put(MAKE_HASHMAP(p), hdr->key, hdr);
92 int pa_headerlist_putsappend(pa_headerlist *p, const char *key, const char *value) {
94 pa_bool_t add = FALSE;
100 buf = pa_strbuf_new();
101 if (!(hdr = pa_hashmap_get(MAKE_HASHMAP(p), key))) {
102 hdr = pa_xnew(struct header, 1);
103 hdr->key = pa_xstrdup(key);
106 pa_strbuf_puts(buf, hdr->value);
107 pa_xfree(hdr->value);
109 pa_strbuf_puts(buf, value);
110 hdr->value = pa_strbuf_tostring_free(buf);
111 hdr->nbytes = strlen(hdr->value)+1;
114 pa_hashmap_put(MAKE_HASHMAP(p), hdr->key, hdr);
119 const char *pa_headerlist_gets(pa_headerlist *p, const char *key) {
125 if (!(hdr = pa_hashmap_get(MAKE_HASHMAP(p), key)))
128 if (hdr->nbytes <= 0)
131 if (((char*) hdr->value)[hdr->nbytes-1] != 0)
134 if (strlen((char*) hdr->value) != hdr->nbytes-1)
137 return (char*) hdr->value;
140 int pa_headerlist_remove(pa_headerlist *p, const char *key) {
146 if (!(hdr = pa_hashmap_remove(MAKE_HASHMAP(p), key)))
153 const char *pa_headerlist_iterate(pa_headerlist *p, void **state) {
156 if (!(hdr = pa_hashmap_iterate(MAKE_HASHMAP(p), state, NULL)))
162 char *pa_headerlist_to_string(pa_headerlist *p) {
169 buf = pa_strbuf_new();
171 while ((key = pa_headerlist_iterate(p, &state))) {
175 if ((v = pa_headerlist_gets(p, key)))
176 pa_strbuf_printf(buf, "%s: %s\r\n", key, v);
179 return pa_strbuf_tostring_free(buf);
182 int pa_headerlist_contains(pa_headerlist *p, const char *key) {
186 if (!(pa_hashmap_get(MAKE_HASHMAP(p), key)))