4 This file is part of avahi.
6 avahi is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as
8 published by the Free Software Foundation; either version 2.1 of the
9 License, or (at your option) any later version.
11 avahi is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
14 Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with avahi; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
25 typedef struct AvahiRecordListItem AvahiRecordListItem;
27 struct AvahiRecordListItem {
30 gboolean unicast_response;
33 AVAHI_LLIST_FIELDS(AvahiRecordListItem, items);
37 struct AvahiRecordList {
38 AVAHI_LLIST_HEAD(AvahiRecordListItem, read);
39 AVAHI_LLIST_HEAD(AvahiRecordListItem, unread);
42 AvahiRecordList *avahi_record_list_new(void) {
43 AvahiRecordList *l = g_new(AvahiRecordList, 1);
44 AVAHI_LLIST_HEAD_INIT(AvahiRecordListItem, l->read);
45 AVAHI_LLIST_HEAD_INIT(AvahiRecordListItem, l->unread);
49 void avahi_record_list_free(AvahiRecordList *l) {
52 avahi_record_list_flush(l);
56 static void item_free(AvahiRecordList *l, AvahiRecordListItem *i) {
61 AVAHI_LLIST_REMOVE(AvahiRecordListItem, items, l->read, i);
63 AVAHI_LLIST_REMOVE(AvahiRecordListItem, items, l->unread, i);
65 avahi_record_unref(i->record);
69 void avahi_record_list_flush(AvahiRecordList *l) {
73 item_free(l, l->read);
75 item_free(l, l->unread);
78 AvahiRecord* avahi_record_list_next(AvahiRecordList *l, gboolean *flush_cache, gboolean *unicast_response, gboolean *auxiliary) {
80 AvahiRecordListItem *i;
87 r = avahi_record_ref(i->record);
89 *unicast_response = i->unicast_response;
91 *flush_cache = i->flush_cache;
93 *auxiliary = i->auxiliary;
95 AVAHI_LLIST_REMOVE(AvahiRecordListItem, items, l->unread, i);
96 AVAHI_LLIST_PREPEND(AvahiRecordListItem, items, l->read, i);
103 static AvahiRecordListItem *get(AvahiRecordList *l, AvahiRecord *r) {
104 AvahiRecordListItem *i;
109 for (i = l->read; i; i = i->items_next)
110 if (avahi_record_equal_no_ttl(i->record, r))
113 for (i = l->unread; i; i = i->items_next)
114 if (avahi_record_equal_no_ttl(i->record, r))
120 void avahi_record_list_push(AvahiRecordList *l, AvahiRecord *r, gboolean flush_cache, gboolean unicast_response, gboolean auxiliary) {
121 AvahiRecordListItem *i;
129 i = g_new(AvahiRecordListItem, 1);
130 i->unicast_response = unicast_response;
131 i->flush_cache = flush_cache;
132 i->auxiliary = auxiliary;
133 i->record = avahi_record_ref(r);
136 AVAHI_LLIST_PREPEND(AvahiRecordListItem, items, l->unread, i);
139 void avahi_record_list_drop(AvahiRecordList *l, AvahiRecord *r) {
140 AvahiRecordListItem *i;
145 if (!(i = get(l, r)))
151 gboolean avahi_record_list_empty(AvahiRecordList *l) {
154 return !l->unread && !l->read;