remove legacy core api code (now dead)
[oweals/gnunet.git] / src / set / set_api.c
index 343b5f8812887dca59d95d8ab95dac0873e1fab1..7a33b86eaeb8d210ada05c1ec7f1ff0db9d5fa25 100644 (file)
@@ -26,7 +26,6 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_protocols.h"
-#include "gnunet_client_lib.h"
 #include "gnunet_set_service.h"
 #include "set.h"
 
@@ -49,11 +48,6 @@ struct SetCopyRequest
  */
 struct GNUNET_SET_Handle
 {
-  /**
-   * Client connected to the set service.
-   */
-  struct GNUNET_CLIENT_Connection *client;
-
   /**
    * Message queue for @e client.
    */
@@ -189,10 +183,6 @@ struct GNUNET_SET_OperationHandle
  */
 struct GNUNET_SET_ListenHandle
 {
-  /**
-   * Connection to the service.
-   */
-  struct GNUNET_CLIENT_Connection *client;
 
   /**
    * Message queue for the client.
@@ -298,7 +288,7 @@ check_iter_element (void *cls,
   /* minimum size was already checked, everything else is OK! */
   return GNUNET_OK;
 }
+
 
 /**
  * Handle element for iteration over the set.  Notifies the
@@ -313,7 +303,7 @@ check_iter_element (void *cls,
 {
   struct GNUNET_SET_Handle *set = cls;
   GNUNET_SET_ElementIterator iter = set->iterator;
-  struct GNUNET_SET_Element element;  
+  struct GNUNET_SET_Element element;
   struct GNUNET_SET_IterAckMessage *ack_msg;
   struct GNUNET_MQ_Envelope *ev;
   uint16_t msize;
@@ -392,6 +382,7 @@ handle_result (void *cls,
   struct GNUNET_SET_OperationHandle *oh;
   struct GNUNET_SET_Element e;
   enum GNUNET_SET_Status result_status;
+  int destroy_set;
 
   GNUNET_assert (NULL != set->mq);
   result_status = ntohs (msg->result_status);
@@ -432,6 +423,11 @@ do_final:
   GNUNET_CONTAINER_DLL_remove (set->ops_head,
                                set->ops_tail,
                                oh);
+  /* Need to do this calculation _before_ the result callback,
+     as IF the application still has a valid set handle, it
+     may trigger destruction of the set during the callback. */
+  destroy_set = (GNUNET_YES == set->destroy_requested) &&
+                (NULL == set->ops_head);
   if (NULL != oh->result_cb)
   {
     oh->result_cb (oh->result_cls,
@@ -443,8 +439,7 @@ do_final:
     LOG (GNUNET_ERROR_TYPE_DEBUG,
          "No callback for final status\n");
   }
-  if ( (GNUNET_YES == set->destroy_requested) &&
-       (NULL == set->ops_head) )
+  if (destroy_set)
     GNUNET_SET_destroy (set);
   GNUNET_free (oh);
   return;
@@ -534,7 +529,7 @@ handle_client_set_error (void *cls,
 {
   struct GNUNET_SET_Handle *set = cls;
   GNUNET_SET_ElementIterator iter = set->iterator;
-  
+
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "Handling client set error %d\n",
        error);
@@ -566,24 +561,24 @@ create_internal (const struct GNUNET_CONFIGURATION_Handle *cfg,
                  enum GNUNET_SET_OperationType op,
                  const uint32_t *cookie)
 {
-  GNUNET_MQ_hd_var_size (result,
-                        GNUNET_MESSAGE_TYPE_SET_RESULT,
-                        struct GNUNET_SET_ResultMessage);
-  GNUNET_MQ_hd_var_size (iter_element,
-                        GNUNET_MESSAGE_TYPE_SET_ITER_ELEMENT,
-                        struct GNUNET_SET_IterResponseMessage);
-  GNUNET_MQ_hd_fixed_size (iter_done,
-                          GNUNET_MESSAGE_TYPE_SET_ITER_DONE,
-                          struct GNUNET_MessageHeader);
-  GNUNET_MQ_hd_fixed_size (copy_lazy,
-                          GNUNET_MESSAGE_TYPE_SET_COPY_LAZY_RESPONSE,
-                          struct GNUNET_SET_CopyLazyResponseMessage);
   struct GNUNET_SET_Handle *set = GNUNET_new (struct GNUNET_SET_Handle);
   struct GNUNET_MQ_MessageHandler mq_handlers[] = {
-    make_result_handler (set),
-    make_iter_element_handler (set),
-    make_iter_done_handler (set),
-    make_copy_lazy_handler (set),
+    GNUNET_MQ_hd_var_size (result,
+                           GNUNET_MESSAGE_TYPE_SET_RESULT,
+                           struct GNUNET_SET_ResultMessage,
+                           set),
+    GNUNET_MQ_hd_var_size (iter_element,
+                           GNUNET_MESSAGE_TYPE_SET_ITER_ELEMENT,
+                           struct GNUNET_SET_IterResponseMessage,
+                           set),
+    GNUNET_MQ_hd_fixed_size (iter_done,
+                             GNUNET_MESSAGE_TYPE_SET_ITER_DONE,
+                             struct GNUNET_MessageHeader,
+                             set),
+    GNUNET_MQ_hd_fixed_size (copy_lazy,
+                             GNUNET_MESSAGE_TYPE_SET_COPY_LAZY_RESPONSE,
+                             struct GNUNET_SET_CopyLazyResponseMessage,
+                             set),
     GNUNET_MQ_handler_end ()
   };
   struct GNUNET_MQ_Envelope *mqm;
@@ -591,18 +586,16 @@ create_internal (const struct GNUNET_CONFIGURATION_Handle *cfg,
   struct GNUNET_SET_CopyLazyConnectMessage *copy_msg;
 
   set->cfg = cfg;
-  set->client = GNUNET_CLIENT_connect ("set", cfg);
-  if (NULL == set->client)
+  set->mq = GNUNET_CLIENT_connecT (cfg,
+                                   "set",
+                                   mq_handlers,
+                                   &handle_client_set_error,
+                                   set);
+  if (NULL == set->mq)
   {
     GNUNET_free (set);
     return NULL;
   }
-  set->mq = GNUNET_MQ_queue_for_connection_client (set->client,
-                                                   mq_handlers,
-                                                   &handle_client_set_error,
-                                                   set);
-  GNUNET_assert (NULL != set->mq);
-
   if (NULL == cookie)
   {
     LOG (GNUNET_ERROR_TYPE_DEBUG,
@@ -676,9 +669,9 @@ GNUNET_SET_add_element (struct GNUNET_SET_Handle *set,
   mqm = GNUNET_MQ_msg_extra (msg, element->size,
                              GNUNET_MESSAGE_TYPE_SET_ADD);
   msg->element_type = htons (element->element_type);
-  memcpy (&msg[1],
-          element->data,
-          element->size);
+  GNUNET_memcpy (&msg[1],
+                 element->data,
+                 element->size);
   GNUNET_MQ_notify_sent (mqm,
                          cont, cont_cls);
   GNUNET_MQ_send (set->mq, mqm);
@@ -718,9 +711,9 @@ GNUNET_SET_remove_element (struct GNUNET_SET_Handle *set,
                              element->size,
                              GNUNET_MESSAGE_TYPE_SET_REMOVE);
   msg->element_type = htons (element->element_type);
-  memcpy (&msg[1],
-          element->data,
-          element->size);
+  GNUNET_memcpy (&msg[1],
+                 element->data,
+                 element->size);
   GNUNET_MQ_notify_sent (mqm,
                          cont, cont_cls);
   GNUNET_MQ_send (set->mq, mqm);
@@ -750,11 +743,6 @@ GNUNET_SET_destroy (struct GNUNET_SET_Handle *set)
   }
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "Really destroying set\n");
-  if (NULL != set->client)
-  {
-    GNUNET_CLIENT_disconnect (set->client);
-    set->client = NULL;
-  }
   if (NULL != set->mq)
   {
     GNUNET_MQ_destroy (set->mq);
@@ -828,9 +816,12 @@ check_request (void *cls,
 {
   const struct GNUNET_MessageHeader *context_msg;
 
+  if (ntohs (msg->header.size) == sizeof (*msg))
+    return GNUNET_OK; /* no context message is OK */
   context_msg = GNUNET_MQ_extract_nested_mh (msg);
   if (NULL == context_msg)
   {
+    /* malformed context message is NOT ok */
     GNUNET_break_op (0);
     return GNUNET_SYSERR;
   }
@@ -893,8 +884,6 @@ handle_client_listener_error (void *cls,
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "Listener broke down (%d), re-connecting\n",
        (int) error);
-  GNUNET_CLIENT_disconnect (lh->client);
-  lh->client = NULL;
   GNUNET_MQ_destroy (lh->mq);
   lh->mq = NULL;
   lh->reconnect_task = GNUNET_SCHEDULER_add_delayed (lh->reconnect_backoff,
@@ -911,32 +900,32 @@ handle_client_listener_error (void *cls,
  */
 static void
 listen_connect (void *cls)
-{ 
-  GNUNET_MQ_hd_var_size (request,
-                        GNUNET_MESSAGE_TYPE_SET_REQUEST,
-                        struct GNUNET_SET_RequestMessage);
+{
   struct GNUNET_SET_ListenHandle *lh = cls;
   struct GNUNET_MQ_MessageHandler mq_handlers[] = {
-    make_request_handler (lh),
+    GNUNET_MQ_hd_var_size (request,
+                           GNUNET_MESSAGE_TYPE_SET_REQUEST,
+                           struct GNUNET_SET_RequestMessage,
+                           lh),
     GNUNET_MQ_handler_end ()
   };
   struct GNUNET_MQ_Envelope *mqm;
   struct GNUNET_SET_ListenMessage *msg;
 
   lh->reconnect_task = NULL;
-  GNUNET_assert (NULL == lh->client);
-  lh->client = GNUNET_CLIENT_connect ("set", lh->cfg);
-  if (NULL == lh->client)
-    return;
   GNUNET_assert (NULL == lh->mq);
-  lh->mq = GNUNET_MQ_queue_for_connection_client (lh->client,
-                                                  mq_handlers,
-                                                  &handle_client_listener_error,
-                                                 lh);
+  lh->mq = GNUNET_CLIENT_connecT (lh->cfg,
+                                  "set",
+                                  mq_handlers,
+                                  &handle_client_listener_error,
+                                  lh);
+  if (NULL == lh->mq)
+    return;
   mqm = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_SET_LISTEN);
   msg->operation = htonl (lh->operation);
   msg->app_id = lh->app_id;
-  GNUNET_MQ_send (lh->mq, mqm);
+  GNUNET_MQ_send (lh->mq,
+                  mqm);
 }
 
 
@@ -969,7 +958,7 @@ GNUNET_SET_listen (const struct GNUNET_CONFIGURATION_Handle *cfg,
   lh->app_id = *app_id;
   lh->reconnect_backoff = GNUNET_TIME_UNIT_MILLISECONDS;
   listen_connect (lh);
-  if (NULL == lh->client)
+  if (NULL == lh->mq)
   {
     GNUNET_free (lh);
     return NULL;
@@ -993,11 +982,6 @@ GNUNET_SET_listen_cancel (struct GNUNET_SET_ListenHandle *lh)
     GNUNET_MQ_destroy (lh->mq);
     lh->mq = NULL;
   }
-  if (NULL != lh->client)
-  {
-    GNUNET_CLIENT_disconnect (lh->client);
-    lh->client = NULL;
-  }
   if (NULL != lh->reconnect_task)
   {
     GNUNET_SCHEDULER_cancel (lh->reconnect_task);
@@ -1155,8 +1139,9 @@ GNUNET_SET_element_dup (const struct GNUNET_SET_Element *element)
   copy->size = element->size;
   copy->element_type = element->element_type;
   copy->data = &copy[1];
-  memcpy ((void *) copy->data, element->data, copy->size);
-
+  GNUNET_memcpy (&copy[1],
+                 element->data,
+                 copy->size);
   return copy;
 }