3278
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
1 /*
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
2 * Audacious
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
3 * Copyright (c) 2006-2007 Audacious team
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
4 *
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
5 * This program is free software; you can redistribute it and/or modify
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
6 * it under the terms of the GNU General Public License as published by
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
7 * the Free Software Foundation; under version 3 of the License.
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
8 *
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
9 * This program is distributed in the hope that it will be useful,
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
12 * GNU General Public License for more details.
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
13 *
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
14 * You should have received a copy of the GNU General Public License
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
15 * along with this program. If not, see <http://www.gnu.org/licenses>.
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
16 *
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
17 * The Audacious team does not consider modular code linking to
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
18 * Audacious or using our public API to be a derived work.
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
19 */
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
20
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
21 #include <glib.h>
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
22 #include <mowgli.h>
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
23
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
24 #include "tuple.h"
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
25
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
26 struct _Tuple {
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
27 mowgli_object_t parent;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
28 mowgli_dictionary_t *dict;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
29 };
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
30
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
31 typedef struct {
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
32 TupleValueType type;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
33 union {
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
34 gchar *string;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
35 gint integer;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
36 } value;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
37 } TupleValue;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
38
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
39 static mowgli_heap_t *tuple_heap = NULL;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
40 static mowgli_heap_t *tuple_value_heap = NULL;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
41 static mowgli_object_class_t tuple_klass;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
42
|
3280
|
43 /* iterative destructor of tuple values. */
|
|
44 static void
|
|
45 tuple_value_destroy(mowgli_dictionary_elem_t *delem, void *privdata)
|
|
46 {
|
|
47 TupleValue *value = (TupleValue *) delem->data;
|
|
48
|
|
49 if (value->type == TUPLE_STRING)
|
|
50 g_free(value->value.string);
|
|
51
|
|
52 mowgli_heap_free(tuple_value_heap, value);
|
|
53 }
|
|
54
|
3278
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
55 static void
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
56 tuple_destroy(Tuple *tuple)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
57 {
|
3280
|
58 mowgli_dictionary_destroy(tuple->dict, tuple_value_destroy, NULL);
|
3278
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
59 mowgli_heap_free(tuple_heap, tuple);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
60 }
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
61
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
62 Tuple *
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
63 tuple_new(void)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
64 {
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
65 Tuple *tuple;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
66
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
67 if (tuple_heap == NULL)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
68 {
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
69 tuple_heap = mowgli_heap_create(sizeof(Tuple), 256);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
70 tuple_value_heap = mowgli_heap_create(sizeof(TupleValue), 512);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
71 mowgli_object_class_init(&tuple_klass, "audacious.tuple", tuple_destroy, FALSE);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
72 }
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
73
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
74 /* FIXME: use mowgli_object_bless_from_class() in mowgli 0.4
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
75 when it is released --nenolod */
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
76 tuple = mowgli_heap_alloc(tuple_heap);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
77 mowgli_object_init(mowgli_object(tuple), NULL, &tuple_klass, NULL);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
78
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
79 tuple->dict = mowgli_dictionary_create(g_ascii_strcasecmp);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
80
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
81 return tuple;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
82 }
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
83
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
84 gboolean
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
85 tuple_associate_string(Tuple *tuple, const gchar *field, const gchar *string)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
86 {
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
87 TupleValue *value;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
88
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
89 g_return_val_if_fail(tuple != NULL, FALSE);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
90 g_return_val_if_fail(field != NULL, FALSE);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
91 g_return_val_if_fail(string != NULL, FALSE);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
92
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
93 if (mowgli_dictionary_find(tuple->dict, field))
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
94 tuple_disassociate(tuple, field);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
95
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
96 value = mowgli_heap_alloc(tuple_value_heap);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
97 value->type = TUPLE_STRING;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
98 value->value.string = g_strdup(string);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
99
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
100 mowgli_dictionary_add(tuple->dict, field, value);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
101
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
102 return TRUE;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
103 }
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
104
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
105 gboolean
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
106 tuple_associate_int(Tuple *tuple, const gchar *field, gint integer)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
107 {
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
108 TupleValue *value;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
109
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
110 g_return_val_if_fail(tuple != NULL, FALSE);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
111 g_return_val_if_fail(field != NULL, FALSE);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
112
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
113 if (mowgli_dictionary_find(tuple->dict, field))
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
114 tuple_disassociate(tuple, field);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
115
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
116 value = mowgli_heap_alloc(tuple_value_heap);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
117 value->type = TUPLE_INT;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
118 value->value.integer = integer;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
119
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
120 mowgli_dictionary_add(tuple->dict, field, value);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
121
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
122 return TRUE;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
123 }
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
124
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
125 void
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
126 tuple_disassociate(Tuple *tuple, const gchar *field)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
127 {
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
128 TupleValue *value;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
129
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
130 g_return_if_fail(tuple != NULL);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
131 g_return_if_fail(field != NULL);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
132
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
133 /* why _delete()? because _delete() returns the dictnode's data on success */
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
134 if ((value = mowgli_dictionary_delete(tuple->dict, field)) == NULL)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
135 return;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
136
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
137 if (value->type == TUPLE_STRING)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
138 g_free(value->value.string);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
139
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
140 mowgli_heap_free(tuple_value_heap, value);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
141 }
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
142
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
143 TupleValueType
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
144 tuple_get_value_type(Tuple *tuple, const gchar *field)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
145 {
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
146 TupleValue *value;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
147
|
3280
|
148 g_return_val_if_fail(tuple != NULL, TUPLE_UNKNOWN);
|
|
149 g_return_val_if_fail(field != NULL, TUPLE_UNKNOWN);
|
3278
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
150
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
151 if ((value = mowgli_dictionary_retrieve(tuple->dict, field)) == NULL)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
152 return TUPLE_UNKNOWN;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
153
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
154 return value->type;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
155 }
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
156
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
157 const gchar *
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
158 tuple_get_string(Tuple *tuple, const gchar *field)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
159 {
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
160 TupleValue *value;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
161
|
3280
|
162 g_return_if_fail(tuple != NULL, NULL);
|
|
163 g_return_if_fail(field != NULL, NULL);
|
3278
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
164
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
165 if ((value = mowgli_dictionary_retrieve(tuple->dict, field)) == NULL)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
166 return NULL;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
167
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
168 if (value->type != TUPLE_STRING)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
169 mowgli_throw_exception_val(audacious.tuple.invalid_type_request, NULL);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
170
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
171 return value->value.string;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
172 }
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
173
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
174 int
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
175 tuple_get_int(Tuple *tuple, const gchar *field)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
176 {
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
177 TupleValue *value;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
178
|
3280
|
179 g_return_if_fail(tuple != NULL, 0);
|
|
180 g_return_if_fail(field != NULL, 0);
|
3278
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
181
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
182 if ((value = mowgli_dictionary_retrieve(tuple->dict, field)) == NULL)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
183 return NULL;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
184
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
185 if (value->type != TUPLE_INT)
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
186 mowgli_throw_exception_val(audacious.tuple.invalid_type_request, NULL);
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
187
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
188 return value->value.integer;
|
William Pitcock <nenolod@atheme-project.org>
parents:
diff
changeset
|
189 }
|