clean up for configs
[oweals/gnunet.git] / src / peerinfo / peerinfo_api_notify.c
index 0c7474f4a4c25bf2abff6e6d3f60a6dac6be3e07..f5a076a20460fac413056e642fc08593adf96029 100644 (file)
  * @author Christian Grothoff
  */
 #include "platform.h"
-#include "gnunet_client_lib.h"
+#include "gnunet_util_lib.h"
 #include "gnunet_peerinfo_service.h"
 #include "gnunet_protocols.h"
-#include "gnunet_time_lib.h"
 #include "peerinfo.h"
 
+#define LOG(kind,...) GNUNET_log_from (kind, "nse-api",__VA_ARGS__)
+
 /**
  * Context for the info handler.
  */
@@ -67,6 +68,11 @@ struct GNUNET_PEERINFO_NotifyContext
    */
   GNUNET_SCHEDULER_TaskIdentifier task;
 
+  /**
+   * Include friend only HELLOs in callbacks
+   */
+
+  int include_friend_only;
 };
 
 
@@ -76,7 +82,8 @@ struct GNUNET_PEERINFO_NotifyContext
  *
  * @param nc our context
  */
-static void request_notifications (struct GNUNET_PEERINFO_NotifyContext *nc);
+static void
+request_notifications (struct GNUNET_PEERINFO_NotifyContext *nc);
 
 
 /**
@@ -85,7 +92,8 @@ static void request_notifications (struct GNUNET_PEERINFO_NotifyContext *nc);
  *
  * @param nc our context
  */
-static void receive_notifications (struct GNUNET_PEERINFO_NotifyContext *nc);
+static void
+receive_notifications (struct GNUNET_PEERINFO_NotifyContext *nc);
 
 
 /**
@@ -104,8 +112,8 @@ reconnect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   if (NULL == nc->client)
   {
     /* ugh */
-    nc->task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
-                                             &reconnect, nc);
+    nc->task =
+        GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &reconnect, nc);
     return;
   }
   request_notifications (nc);
@@ -129,7 +137,7 @@ process_notification (void *cls, const struct GNUNET_MessageHeader *msg)
 
   if (msg == NULL)
   {
-    GNUNET_CLIENT_disconnect (nc->client, GNUNET_NO);
+    GNUNET_CLIENT_disconnect (nc->client);
     reconnect (nc, NULL);
     return;
   }
@@ -138,7 +146,7 @@ process_notification (void *cls, const struct GNUNET_MessageHeader *msg)
       (ntohs (msg->type) != GNUNET_MESSAGE_TYPE_PEERINFO_INFO))
   {
     GNUNET_break (0);
-    GNUNET_CLIENT_disconnect (nc->client, GNUNET_NO);
+    GNUNET_CLIENT_disconnect (nc->client);
     nc->client = GNUNET_CLIENT_connect ("peerinfo", nc->cfg);
     request_notifications (nc);
     return;
@@ -151,17 +159,16 @@ process_notification (void *cls, const struct GNUNET_MessageHeader *msg)
     if (ms != sizeof (struct InfoMessage) + GNUNET_HELLO_size (hello))
     {
       GNUNET_break (0);
-      GNUNET_CLIENT_disconnect (nc->client, GNUNET_NO);
+      GNUNET_CLIENT_disconnect (nc->client);
       nc->client = GNUNET_CLIENT_connect ("peerinfo", nc->cfg);
       request_notifications (nc);
       return;
     }
   }
-#if DEBUG_PEERINFO
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Received information about peer `%s' from peerinfo database\n",
-              GNUNET_i2s (&im->peer));
-#endif
+
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Received information about peer `%s' from peerinfo database\n",
+       GNUNET_i2s (&im->peer));
   nc->callback (nc->callback_cls, &im->peer, hello, NULL);
   receive_notifications (nc);
 }
@@ -176,9 +183,8 @@ process_notification (void *cls, const struct GNUNET_MessageHeader *msg)
 static void
 receive_notifications (struct GNUNET_PEERINFO_NotifyContext *nc)
 {
-  GNUNET_CLIENT_receive (nc->client,
-                         &process_notification,
-                         nc, GNUNET_TIME_UNIT_FOREVER_REL);
+  GNUNET_CLIENT_receive (nc->client, &process_notification, nc,
+                         GNUNET_TIME_UNIT_FOREVER_REL);
 }
 
 
@@ -194,22 +200,23 @@ static size_t
 transmit_notify_request (void *cls, size_t size, void *buf)
 {
   struct GNUNET_PEERINFO_NotifyContext *nc = cls;
-  struct GNUNET_MessageHeader hdr;
+  struct NotifyMessage nm;
 
   nc->init = NULL;
   if (buf == NULL)
   {
-    GNUNET_CLIENT_disconnect (nc->client, GNUNET_NO);
+    GNUNET_CLIENT_disconnect (nc->client);
     nc->client = GNUNET_CLIENT_connect ("peerinfo", nc->cfg);
     request_notifications (nc);
     return 0;
   }
-  GNUNET_assert (size >= sizeof (struct GNUNET_MessageHeader));
-  hdr.size = htons (sizeof (struct GNUNET_MessageHeader));
-  hdr.type = htons (GNUNET_MESSAGE_TYPE_PEERINFO_NOTIFY);
-  memcpy (buf, &hdr, sizeof (struct GNUNET_MessageHeader));
+  GNUNET_assert (size >= sizeof (struct NotifyMessage));
+  nm.header.type = htons (GNUNET_MESSAGE_TYPE_PEERINFO_NOTIFY);
+  nm.header.size = htons (sizeof (struct NotifyMessage));
+  nm.include_friend_only = htonl (nc->include_friend_only);
+  memcpy (buf, &nm, sizeof (struct NotifyMessage));
   receive_notifications (nc);
-  return sizeof (struct GNUNET_MessageHeader);
+  return sizeof (struct NotifyMessage);
 }
 
 
@@ -223,12 +230,12 @@ static void
 request_notifications (struct GNUNET_PEERINFO_NotifyContext *nc)
 {
   GNUNET_assert (NULL == nc->init);
-  nc->init = GNUNET_CLIENT_notify_transmit_ready (nc->client,
-                                                  sizeof (struct
-                                                          GNUNET_MessageHeader),
-                                                  GNUNET_TIME_UNIT_FOREVER_REL,
-                                                  GNUNET_YES,
-                                                  &transmit_notify_request, nc);
+  nc->init =
+      GNUNET_CLIENT_notify_transmit_ready (nc->client,
+                                           sizeof (struct NotifyMessage),
+                                           GNUNET_TIME_UNIT_FOREVER_REL,
+                                           GNUNET_YES, &transmit_notify_request,
+                                           nc);
 }
 
 
@@ -237,13 +244,19 @@ request_notifications (struct GNUNET_PEERINFO_NotifyContext *nc)
  * changes.  Initially calls the given function for all known
  * peers and then only signals changes.
  *
+ * If include_friend_only is set to GNUNET_YES peerinfo will include HELLO
+ * messages which are intended for friend to friend mode and which do not
+ * have to be gossiped. Otherwise these messages are skipped.
+ *
  * @param cfg configuration to use
+ * @param include_friend_only include HELLO messages for friends only
  * @param callback the method to call for each peer
  * @param callback_cls closure for callback
  * @return NULL on error
  */
 struct GNUNET_PEERINFO_NotifyContext *
 GNUNET_PEERINFO_notify (const struct GNUNET_CONFIGURATION_Handle *cfg,
+                                                                                               int include_friend_only,
                         GNUNET_PEERINFO_Processor callback, void *callback_cls)
 {
   struct GNUNET_PEERINFO_NotifyContext *nc;
@@ -252,8 +265,8 @@ GNUNET_PEERINFO_notify (const struct GNUNET_CONFIGURATION_Handle *cfg,
   client = GNUNET_CLIENT_connect ("peerinfo", cfg);
   if (client == NULL)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                _("Could not connect to `%s' service.\n"), "peerinfo");
+    LOG (GNUNET_ERROR_TYPE_WARNING, _("Could not connect to `%s' service.\n"),
+         "peerinfo");
     return NULL;
   }
   nc = GNUNET_malloc (sizeof (struct GNUNET_PEERINFO_NotifyContext));
@@ -261,6 +274,7 @@ GNUNET_PEERINFO_notify (const struct GNUNET_CONFIGURATION_Handle *cfg,
   nc->client = client;
   nc->callback = callback;
   nc->callback_cls = callback_cls;
+  nc->include_friend_only = include_friend_only;
   request_notifications (nc);
   return nc;
 }
@@ -280,7 +294,7 @@ GNUNET_PEERINFO_notify_cancel (struct GNUNET_PEERINFO_NotifyContext *nc)
     nc->init = NULL;
   }
   if (NULL != nc->client)
-    GNUNET_CLIENT_disconnect (nc->client, GNUNET_NO);
+    GNUNET_CLIENT_disconnect (nc->client);
   if (GNUNET_SCHEDULER_NO_TASK != nc->task)
     GNUNET_SCHEDULER_cancel (nc->task);
   GNUNET_free (nc);