clean up for configs
[oweals/gnunet.git] / src / peerinfo / peerinfo_api_notify.c
index 2557cdfde783a9a2f40fdd21e243cd61a2c4511d..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__)
@@ -69,6 +68,11 @@ struct GNUNET_PEERINFO_NotifyContext
    */
   GNUNET_SCHEDULER_TaskIdentifier task;
 
+  /**
+   * Include friend only HELLOs in callbacks
+   */
+
+  int include_friend_only;
 };
 
 
@@ -133,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;
   }
@@ -142,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;
@@ -155,12 +159,13 @@ 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;
     }
   }
+
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "Received information about peer `%s' from peerinfo database\n",
        GNUNET_i2s (&im->peer));
@@ -195,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);
 }
 
 
@@ -226,7 +232,7 @@ 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),
+                                           sizeof (struct NotifyMessage),
                                            GNUNET_TIME_UNIT_FOREVER_REL,
                                            GNUNET_YES, &transmit_notify_request,
                                            nc);
@@ -238,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;
@@ -262,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;
 }
@@ -281,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);