]> git.meshlink.io Git - catta/blobdiff - avahi-core/announce.c
* replace guchar and gint by AvahiProtocol, AvahiIfIndex at many places where it...
[catta] / avahi-core / announce.c
index 5ee0f48f2e7240d58e857b061617588a8b33b7dc..fe461de60804a4ca9fc7e9e32cb3ab23f6031d0d 100644 (file)
@@ -107,7 +107,7 @@ void avahi_entry_group_check_probed(AvahiEntryGroup *g, gboolean immediately) {
 static void next_state(AvahiAnnouncement *a) {
     g_assert(a);
 
-/*     g_message("%i -- %u", a->state, a->n_iteration);   */
+/*     avahi_log_debug("%i -- %u", a->state, a->n_iteration);   */
     
     if (a->state == AVAHI_WAITING) {
 
@@ -120,10 +120,10 @@ static void next_state(AvahiAnnouncement *a) {
         if (a->n_iteration >= 4) {
             /* Probing done */
             
-            gchar *t;
+/*             gchar *t; */
 
-            g_message("Enough probes for record [%s]", t = avahi_record_to_string(a->entry->record));
-            g_free(t);
+/*             avahi_log_debug("Enough probes for record [%s]", t = avahi_record_to_string(a->entry->record)); */
+/*             g_free(t); */
 
             if (a->entry->group) {
                 g_assert(a->entry->group->n_probing);
@@ -152,14 +152,20 @@ static void next_state(AvahiAnnouncement *a) {
 
     } else if (a->state == AVAHI_ANNOUNCING) {
 
-        avahi_interface_post_response(a->interface, a->entry->record, a->entry->flags & AVAHI_ENTRY_UNIQUE, FALSE);
+        if (a->entry->flags & AVAHI_ENTRY_UNIQUE)
+            /* Send the whole rrset at once */
+            avahi_server_prepare_matching_responses(a->server, a->interface, a->entry->record->key, FALSE);
+        else
+            avahi_server_prepare_response(a->server, a->interface, a->entry, FALSE, FALSE);
+
+        avahi_server_generate_response(a->server, a->interface, NULL, NULL, 0, FALSE, FALSE);
 
         if (++a->n_iteration >= 4) {
-            gchar *t;
+/*             gchar *t; */
             /* Announcing done */
 
-            g_message("Enough announcements for record [%s]", t = avahi_record_to_string(a->entry->record));
-            g_free(t);
+/*             avahi_log_debug("Enough announcements for record [%s]", t = avahi_record_to_string(a->entry->record)); */
+/*             g_free(t); */
 
             a->state = AVAHI_ESTABLISHED;
 
@@ -196,17 +202,51 @@ AvahiAnnouncement *avahi_get_announcement(AvahiServer *s, AvahiEntry *e, AvahiIn
     return NULL;
 }
 
+static void go_to_initial_state(AvahiAnnouncement *a, gboolean immediately) {
+    AvahiEntry *e;
+    GTimeVal tv;
+        
+    g_assert(a);
+    e = a->entry;
+
+    if ((e->flags & AVAHI_ENTRY_UNIQUE) && !(e->flags & AVAHI_ENTRY_NOPROBE))
+        a->state = AVAHI_PROBING;
+    else if (!(e->flags & AVAHI_ENTRY_NOANNOUNCE)) {
+
+        if (!e->group || e->group->state == AVAHI_ENTRY_GROUP_ESTABLISHED)
+            a->state = AVAHI_ANNOUNCING;
+        else
+            a->state = AVAHI_WAITING;
+        
+    } else
+        a->state = AVAHI_ESTABLISHED;
+
+    a->n_iteration = 1;
+    a->sec_delay = 1;
+
+    if (a->state == AVAHI_PROBING && e->group)
+        e->group->n_probing++;
+
+    if (a->state == AVAHI_PROBING) {
+        avahi_elapse_time(&tv, 0, immediately ? 0 : AVAHI_PROBE_JITTER_MSEC);
+        set_timeout(a, &tv);
+    } else if (a->state == AVAHI_ANNOUNCING) {
+        avahi_elapse_time(&tv, 0, immediately ? 0 : AVAHI_ANNOUNCEMENT_JITTER_MSEC);
+        set_timeout(a, &tv);
+    } else
+        set_timeout(a, NULL);
+}
+
 static void new_announcement(AvahiServer *s, AvahiInterface *i, AvahiEntry *e) {
     AvahiAnnouncement *a;
-    GTimeVal tv;
-    gchar *t; 
+/*     gchar *t;  */
 
     g_assert(s);
     g_assert(i);
     g_assert(e);
     g_assert(!e->dead);
 
-/*     g_message("NEW ANNOUNCEMENT: %s.%i [%s]", i->hardware->name, i->protocol, t = avahi_record_to_string(e->record)); */
+/*     avahi_log_debug("NEW ANNOUNCEMENT: %s.%i [%s]", i->hardware->name, i->protocol, t = avahi_record_to_string(e->record)); */
 /*     g_free(t); */
     
     if (!avahi_interface_match(i, e->interface, e->protocol) || !i->announcing || !avahi_entry_commited(e))
@@ -214,47 +254,21 @@ static void new_announcement(AvahiServer *s, AvahiInterface *i, AvahiEntry *e) {
 
     /* We don't want duplicate announcements */
     if (avahi_get_announcement(s, e, i))
-        return;
+        return;    
 
     a = g_new(AvahiAnnouncement, 1);
     a->server = s;
     a->interface = i;
     a->entry = e;
-
-    if ((e->flags & AVAHI_ENTRY_UNIQUE) && !(e->flags & AVAHI_ENTRY_NOPROBE))
-        a->state = AVAHI_PROBING;
-    else if (!(e->flags & AVAHI_ENTRY_NOANNOUNCE)) {
-
-        if (!e->group || e->group->state == AVAHI_ENTRY_GROUP_ESTABLISHED)
-            a->state = AVAHI_ANNOUNCING;
-        else
-            a->state = AVAHI_WAITING;
-        
-    } else
-        a->state = AVAHI_ESTABLISHED;
-
-
-    g_message("New announcement on interface %s.%i for entry [%s] state=%i", i->hardware->name, i->protocol, t = avahi_record_to_string(e->record), a->state);
-    g_free(t);
-
-    a->n_iteration = 1;
-    a->sec_delay = 1;
     a->time_event = NULL;
 
-    if (a->state == AVAHI_PROBING)
-        if (e->group)
-            e->group->n_probing++;
-    
     AVAHI_LLIST_PREPEND(AvahiAnnouncement, by_interface, i->announcements, a);
     AVAHI_LLIST_PREPEND(AvahiAnnouncement, by_entry, e->announcements, a);
 
-    if (a->state == AVAHI_PROBING) {
-        avahi_elapse_time(&tv, 0, AVAHI_PROBE_JITTER_MSEC);
-        set_timeout(a, &tv);
-    } else if (a->state == AVAHI_ANNOUNCING) {
-        avahi_elapse_time(&tv, 0, AVAHI_ANNOUNCEMENT_JITTER_MSEC);
-        set_timeout(a, &tv);
-    }
+    go_to_initial_state(a, FALSE);
+    
+/*     avahi_log_debug("New announcement on interface %s.%i for entry [%s] state=%i", i->hardware->name, i->protocol, t = avahi_record_to_string(e->record), a->state); */
+/*     g_free(t); */
 }
 
 void avahi_announce_interface(AvahiServer *s, AvahiInterface *i) {
@@ -312,10 +326,13 @@ gboolean avahi_entry_registered(AvahiServer *s, AvahiEntry *e, AvahiInterface *i
     if (!(a = avahi_get_announcement(s, e, i)))
         return FALSE;
     
-    return a->state == AVAHI_ANNOUNCING || a->state == AVAHI_ESTABLISHED;
+    return
+        a->state == AVAHI_ANNOUNCING ||
+        a->state == AVAHI_ESTABLISHED ||
+        (a->state == AVAHI_WAITING && !(e->flags & AVAHI_ENTRY_UNIQUE));
 }
 
-gboolean avahi_entry_registering(AvahiServer *s, AvahiEntry *e, AvahiInterface *i) {
+gboolean avahi_entry_probing(AvahiServer *s, AvahiEntry *e, AvahiInterface *i) {
     AvahiAnnouncement *a;
 
     g_assert(s);
@@ -325,8 +342,28 @@ gboolean avahi_entry_registering(AvahiServer *s, AvahiEntry *e, AvahiInterface *
 
     if (!(a = avahi_get_announcement(s, e, i)))
         return FALSE;
+
+/*     avahi_log_debug("state: %i", a->state); */
+    
+    return
+        a->state == AVAHI_PROBING ||
+        (a->state == AVAHI_WAITING && (e->flags & AVAHI_ENTRY_UNIQUE));
+}
+
+void avahi_entry_return_to_initial_state(AvahiServer *s, AvahiEntry *e, AvahiInterface *i) {
+    AvahiAnnouncement *a;
     
-    return a->state == AVAHI_PROBING || a->state == AVAHI_WAITING;
+    g_assert(s);
+    g_assert(e);
+    g_assert(i);
+
+    if (!(a = avahi_get_announcement(s, e, i)))
+        return;
+
+    if (a->state == AVAHI_PROBING && a->entry->group)
+        a->entry->group->n_probing--;
+
+    go_to_initial_state(a, TRUE);
 }
 
 static AvahiRecord *make_goodbye_record(AvahiRecord *r) {
@@ -335,7 +372,7 @@ static AvahiRecord *make_goodbye_record(AvahiRecord *r) {
     
     g_assert(r);
 
-/*     g_message("Preparing goodbye for record [%s]", t = avahi_record_to_string(r)); */
+/*     avahi_log_debug("Preparing goodbye for record [%s]", t = avahi_record_to_string(r)); */
 /*     g_free(t); */
 
     g = avahi_record_copy(r);
@@ -364,7 +401,7 @@ static void send_goodbye_callback(AvahiInterfaceMonitor *m, AvahiInterface *i, g
         return;
     
     g = make_goodbye_record(e->record);
-    avahi_interface_post_response(i, g, e->flags & AVAHI_ENTRY_UNIQUE, TRUE);
+    avahi_interface_post_response(i, g, e->flags & AVAHI_ENTRY_UNIQUE, NULL, TRUE);
     avahi_record_unref(g);
 }
     
@@ -372,7 +409,7 @@ void avahi_goodbye_interface(AvahiServer *s, AvahiInterface *i, gboolean goodbye
     g_assert(s);
     g_assert(i);
 
-/*     g_message("goodbye interface: %s.%u", i->hardware->name, i->protocol); */
+/*     avahi_log_debug("goodbye interface: %s.%u", i->hardware->name, i->protocol); */
 
     if (goodbye && avahi_interface_relevant(i)) {
         AvahiEntry *e;
@@ -385,7 +422,7 @@ void avahi_goodbye_interface(AvahiServer *s, AvahiInterface *i, gboolean goodbye
     while (i->announcements)
         remove_announcement(s, i->announcements);
 
-/*     g_message("goodbye interface done: %s.%u", i->hardware->name, i->protocol); */
+/*     avahi_log_debug("goodbye interface done: %s.%u", i->hardware->name, i->protocol); */
 
 }
 
@@ -393,7 +430,7 @@ void avahi_goodbye_entry(AvahiServer *s, AvahiEntry *e, gboolean goodbye) {
     g_assert(s);
     g_assert(e);
     
-/*     g_message("goodbye entry: %p", e); */
+/*     avahi_log_debug("goodbye entry: %p", e); */
     
     if (goodbye && !e->dead)
         avahi_interface_monitor_walk(s->monitor, 0, AF_UNSPEC, send_goodbye_callback, e);
@@ -401,7 +438,7 @@ void avahi_goodbye_entry(AvahiServer *s, AvahiEntry *e, gboolean goodbye) {
     while (e->announcements)
         remove_announcement(s, e->announcements);
 
-/*     g_message("goodbye entry done: %p", e); */
+/*     avahi_log_debug("goodbye entry done: %p", e); */
 
 }
 
@@ -410,13 +447,13 @@ void avahi_goodbye_all(AvahiServer *s, gboolean goodbye) {
     
     g_assert(s);
 
-/*     g_message("goodbye all"); */
+/*     avahi_log_debug("goodbye all"); */
 
     for (e = s->entries; e; e = e->entries_next)
         if (!e->dead)
             avahi_goodbye_entry(s, e, goodbye);
 
-/*     g_message("goodbye all done"); */
+/*     avahi_log_debug("goodbye all done"); */
 
 }