fix pointer indentation
[oweals/gnunet.git] / src / testbed / testbed_api_services.c
index 3e8484022ee487cc271fddbd11cc8db3b4e74325..2c9a90fd454133e378e23889e9ffae5b5b82e6bf 100644 (file)
@@ -1,21 +1,21 @@
 /*
       This file is part of GNUnet
-      (C) 2008--2012 Christian Grothoff (and other contributing authors)
+      Copyright (C) 2008--2013 GNUnet e.V.
 
-      GNUnet is free software; you can redistribute it and/or modify
-      it under the terms of the GNU General Public License as published
-      by the Free Software Foundation; either version 3, or (at your
-      option) any later version.
+      GNUnet is free software: you can redistribute it and/or modify it
+      under the terms of the GNU Affero General Public License as published
+      by the Free Software Foundation, either version 3 of the License,
+      or (at your option) any later version.
 
       GNUnet is distributed in the hope that it will be useful, but
       WITHOUT ANY WARRANTY; without even the implied warranty of
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-      General Public License for more details.
+      Affero General Public License for more details.
 
-      You should have received a copy of the GNU General Public License
-      along with GNUnet; see the file COPYING.  If not, write to the
-      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-      Boston, MA 02111-1307, USA.
+      You should have received a copy of the GNU Affero General Public License
+      along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
  */
 
 /**
  */
 enum State
 {
-    /**
-     * Initial state
-     */
+  /**
+   * Initial state
+   */
   INIT,
 
-    /**
-     * The configuration request has been sent
-     */
+  /**
+   * The configuration request has been sent
+   */
   CFG_REQUEST_QUEUED,
 
-    /**
-     * connected to service
-     */
-  SERVICE_CONNECTED,
-
+  /**
+   * connected to service
+   */
+  SERVICE_CONNECTED
 };
 
 
@@ -110,7 +109,7 @@ struct ServiceConnectData
   /**
    * The operation completion callback
    */
-  GNUNET_TESTBED_OperationCompletionCallback cb;
+  GNUNET_TESTBED_ServiceConnectCompletionCallback cb;
 
   /**
    * The closure for operation completion callback
@@ -121,7 +120,6 @@ struct ServiceConnectData
    * State information
    */
   enum State state;
-
 };
 
 
@@ -136,32 +134,42 @@ static void
 configuration_receiver (void *cls, const struct GNUNET_MessageHeader *msg)
 {
   struct ServiceConnectData *data = cls;
-  const struct GNUNET_TESTBED_PeerConfigurationInformationMessage *imsg;
   struct GNUNET_TESTBED_Controller *c;
+  const char *emsg;
   struct GNUNET_TESTBED_EventInformation info;
   uint16_t mtype;
 
+  c = data->peer->controller;
   mtype = ntohs (msg->type);
-  if (GNUNET_MESSAGE_TYPE_TESTBED_OPERATIONEVENT == mtype)
+  emsg = NULL;
+  info.type = GNUNET_TESTBED_ET_OPERATION_FINISHED;
+  info.op = data->operation;
+  info.op_cls = data->op_cls;
+  if (GNUNET_MESSAGE_TYPE_TESTBED_OPERATION_FAIL_EVENT == mtype)
   {
-    GNUNET_assert (0);                 /* FIXME: Add notification for failure */
+    emsg =
+      GNUNET_TESTBED_parse_error_string_ ((const struct
+                                           GNUNET_TESTBED_OperationFailureEventMessage
+                                           *) msg);
+    if (NULL == emsg)
+      emsg = "Unknown error";
+    info.details.operation_finished.emsg = emsg;
+    info.details.operation_finished.generic = NULL;
+    goto call_cb;
   }
-  imsg =
-      (const struct GNUNET_TESTBED_PeerConfigurationInformationMessage *) msg;
-  data->cfg = GNUNET_TESTBED_get_config_from_peerinfo_msg_ (imsg);
+  data->cfg = GNUNET_TESTBED_extract_config_ (msg);
+  GNUNET_assert (NULL == data->op_result);
   data->op_result = data->ca (data->cada_cls, data->cfg);
-  info.type = GNUNET_TESTBED_ET_OPERATION_FINISHED;
-  info.details.operation_finished.operation = data->operation;
-  info.details.operation_finished.op_cls = data->op_cls;
   info.details.operation_finished.emsg = NULL;
   info.details.operation_finished.generic = data->op_result;
-  c = data->peer->controller;
   data->state = SERVICE_CONNECTED;
+
+call_cb:
   if ((0 != (GNUNET_TESTBED_ET_OPERATION_FINISHED & c->event_mask)) &&
       (NULL != c->cc))
     c->cc (c->cc_cls, &info);
   if (NULL != data->cb)
-    data->cb (data->cb_cls, data->operation, NULL);
+    data->cb (data->cb_cls, data->operation, data->op_result, emsg);
 }
 
 
@@ -181,12 +189,12 @@ opstart_service_connect (void *cls)
   GNUNET_assert (NULL != data);
   GNUNET_assert (NULL != data->peer);
   c = data->peer->controller;
-  op_id = c->operation_counter++;
+  op_id = GNUNET_TESTBED_get_next_op_id (c);
   msg =
-      GNUNET_TESTBED_generate_peergetconfig_msg_ (data->peer->unique_id, op_id);
+    GNUNET_TESTBED_generate_peergetconfig_msg_ (data->peer->unique_id, op_id);
   data->opc =
-      GNUNET_TESTBED_forward_operation_msg_ (c, op_id, &msg->header,
-                                             &configuration_receiver, data);
+    GNUNET_TESTBED_forward_operation_msg_ (c, op_id, &msg->header,
+                                           &configuration_receiver, data);
   GNUNET_free (msg);
   data->state = CFG_REQUEST_QUEUED;
 }
@@ -207,10 +215,12 @@ oprelease_service_connect (void *cls)
   {
   case INIT:
     break;
+
   case CFG_REQUEST_QUEUED:
     GNUNET_assert (NULL != data->opc);
     GNUNET_TESTBED_forward_operation_msg_cancel_ (data->opc);
     break;
+
   case SERVICE_CONNECTED:
     GNUNET_assert (NULL != data->cfg);
     GNUNET_CONFIGURATION_destroy (data->cfg);
@@ -228,9 +238,9 @@ oprelease_service_connect (void *cls)
  * maintain connections with other systems.  The actual service
  * handle is then returned via the 'op_result' member in the event
  * callback.  The 'ca' callback is used to create the connection
- * when the time is right; the 'da' callback will be used to 
+ * when the time is right; the 'da' callback will be used to
  * destroy the connection (upon 'GNUNET_TESTBED_operation_done').
- * 'GNUNET_TESTBED_operation_cancel' can be used to abort this
+ * 'GNUNET_TESTBED_operation_done' can be used to abort this
  * operation until the event callback has been called.
  *
  * @param op_cls closure to pass in operation event
@@ -244,18 +254,17 @@ oprelease_service_connect (void *cls)
  * @return handle for the operation
  */
 struct GNUNET_TESTBED_Operation *
-GNUNET_TESTBED_service_connect (void *op_cls,
-                               struct GNUNET_TESTBED_Peer *peer,
-                               const char *service_name,
-                                GNUNET_TESTBED_OperationCompletionCallback cb,
-                                void *cb_cls,
-                               GNUNET_TESTBED_ConnectAdapter ca,
-                               GNUNET_TESTBED_DisconnectAdapter da,
-                               void *cada_cls)
+GNUNET_TESTBED_service_connect (void *op_cls, struct GNUNET_TESTBED_Peer *peer,
+                                const char *service_name,
+                                GNUNET_TESTBED_ServiceConnectCompletionCallback
+                                cb, void *cb_cls,
+                                GNUNET_TESTBED_ConnectAdapter ca,
+                                GNUNET_TESTBED_DisconnectAdapter da,
+                                void *cada_cls)
 {
   struct ServiceConnectData *data;
 
-  data = GNUNET_malloc (sizeof (struct ServiceConnectData));
+  data = GNUNET_new (struct ServiceConnectData);
   data->ca = ca;
   data->da = da;
   data->cada_cls = cada_cls;
@@ -265,15 +274,18 @@ GNUNET_TESTBED_service_connect (void *op_cls,
   data->cb = cb;
   data->cb_cls = cb_cls;
   data->operation =
-      GNUNET_TESTBED_operation_create_ (data, &opstart_service_connect,
-                                        &oprelease_service_connect);
+    GNUNET_TESTBED_operation_create_ (data, &opstart_service_connect,
+                                      &oprelease_service_connect);
   GNUNET_TESTBED_operation_queue_insert_ (peer->
-                                          controller->opq_parallel_service_connections,
+                                          controller->
+                                          opq_parallel_service_connections,
                                           data->operation);
   GNUNET_TESTBED_operation_queue_insert_ (peer->
                                           controller->opq_parallel_operations,
                                           data->operation);
+  GNUNET_TESTBED_operation_begin_wait_ (data->operation);
   return data->operation;
 }
 
+
 /* end of testbed_api_services.c */