gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-anastasis-gtk] branch master updated: add long poll task support


From: gnunet
Subject: [taler-anastasis-gtk] branch master updated: add long poll task support for async external challenges
Date: Thu, 26 Aug 2021 17:53:23 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository anastasis-gtk.

The following commit(s) were added to refs/heads/master by this push:
     new 34c9a75  add long poll task support for async external challenges
34c9a75 is described below

commit 34c9a75a8f95cc5b3b63573fd998b83064ebafd4
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Thu Aug 26 17:53:21 2021 +0200

    add long poll task support for async external challenges
---
 src/anastasis/anastasis-gtk.c        |  28 ++++++++
 src/anastasis/anastasis-gtk.h        |  19 ++++++
 src/anastasis/anastasis-gtk_action.c | 120 +++++++++++++++++++++++++++++++++--
 src/anastasis/anastasis-gtk_helper.c |   1 +
 4 files changed, 164 insertions(+), 4 deletions(-)

diff --git a/src/anastasis/anastasis-gtk.c b/src/anastasis/anastasis-gtk.c
index 4023b16..3a1e5e5 100644
--- a/src/anastasis/anastasis-gtk.c
+++ b/src/anastasis/anastasis-gtk.c
@@ -60,6 +60,17 @@ static struct GNUNET_CURL_Context *ctx;
  */
 struct ANASTASIS_ReduxAction *AG_ra;
 
+/**
+ * Handle to an ongoing background action.
+ */
+struct ANASTASIS_ReduxAction *AG_long_action;
+
+/**
+ * Handle to task to reschedule #AG_long_action.
+ */
+struct GNUNET_SCHEDULER_Task *AG_long_task;
+
+
 /**
  * Actual state.
  */
@@ -143,6 +154,22 @@ anastasis_gtk_animation_activate_cb (GtkMenuItem *menuitem,
 }
 
 
+void
+AG_stop_long_action (void)
+{
+  if (NULL != AG_long_action)
+  {
+    ANASTASIS_redux_action_cancel (AG_long_action);
+    AG_long_action = NULL;
+  }
+  if (NULL != AG_long_task)
+  {
+    GNUNET_SCHEDULER_cancel (AG_long_task);
+    AG_long_task = NULL;
+  }
+}
+
+
 /**
  * Task run on shutdown.
  *
@@ -160,6 +187,7 @@ shutdown_task (void *cls)
     ANASTASIS_redux_action_cancel (AG_ra);
     AG_ra = NULL;
   }
+  AG_stop_long_action ();
   if (NULL != ctx)
   {
     GNUNET_CURL_fini (ctx);
diff --git a/src/anastasis/anastasis-gtk.h b/src/anastasis/anastasis-gtk.h
index a4672a8..27d23f3 100644
--- a/src/anastasis/anastasis-gtk.h
+++ b/src/anastasis/anastasis-gtk.h
@@ -56,6 +56,25 @@ extern json_t *AG_redux_state;
  */
 extern struct ANASTASIS_ReduxAction *AG_ra;
 
+/**
+ * Handle to an ongoing background action.
+ */
+extern struct ANASTASIS_ReduxAction *AG_long_action;
+
+/**
+ * Handle to task to reschedule #AG_long_action.
+ */
+extern struct GNUNET_SCHEDULER_Task *AG_long_task;
+
+
+/**
+ * Stop long polling action in the background.
+ * Should be called whenever we leave the
+ * challenge-selecting state.
+ */
+void
+AG_stop_long_action (void);
+
 
 /**
  * Load #AG_redux_state from @a filename.
diff --git a/src/anastasis/anastasis-gtk_action.c 
b/src/anastasis/anastasis-gtk_action.c
index 6d2bdb9..984fef5 100644
--- a/src/anastasis/anastasis-gtk_action.c
+++ b/src/anastasis/anastasis-gtk_action.c
@@ -36,6 +36,17 @@
 #include <gdk-pixbuf/gdk-pixbuf.h>
 
 
+/**
+ * After how long does our long-poller time out?
+ */
+#define LP_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5)
+
+/**
+ * Next time we schedule the #long_task.
+ */
+static struct GNUNET_TIME_Absolute long_next;
+
+
 /**
  * Are we currently processing an action?
  */
@@ -2197,7 +2208,92 @@ action_secret_selecting (void)
 
 
 /**
- * FIXME.
+ * Function called with the results of #ANASTASIS_redux_action on "poll".
+ *
+ * @param cls closure, NULL
+ * @param error_code Error code
+ * @param response new state as result or config information of a provider
+ */
+static void
+long_action_cb (void *cls,
+                enum TALER_ErrorCode error_code,
+                json_t *response);
+
+
+/**
+ * Schedules the 'poll' action.
+ *
+ * @param cls NULL
+ */
+static void
+long_task (void *cls)
+{
+  json_t *tspec;
+
+  (void) cls;
+  AG_long_task = NULL;
+  if (GNUNET_TIME_absolute_is_future (long_next))
+  {
+    AG_long_task = GNUNET_SCHEDULER_add_at (long_next,
+                                            &long_task,
+                                            NULL);
+    return;
+  }
+  long_next = GNUNET_TIME_relative_to_absolute (LP_TIMEOUT);
+  tspec = GNUNET_JSON_PACK (
+    GNUNET_JSON_pack_time_rel ("timeout",
+                               LP_TIMEOUT));
+  AG_long_action
+    = ANASTASIS_redux_action (AG_redux_state,
+                              "poll",
+                              tspec,
+                              &long_action_cb,
+                              NULL);
+  json_decref (tspec);
+}
+
+
+/**
+ * Function called with the results of #ANASTASIS_redux_action on "poll".
+ *
+ * @param cls closure, NULL
+ * @param error_code Error code
+ * @param response new state as result or config information of a provider
+ */
+static void
+long_action_cb (void *cls,
+                enum TALER_ErrorCode error_code,
+                json_t *response)
+{
+  AG_long_action = NULL;
+  switch (error_code)
+  {
+  case TALER_EC_NONE:
+    /* continued below */
+    break;
+  default:
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "'poll' action failed: %s\n",
+                TALER_ErrorCode_get_hint (error_code));
+    /* simply try again */
+    AG_long_task = GNUNET_SCHEDULER_add_now (&long_task,
+                                             NULL);
+    return;
+  }
+  if (NULL != AG_ra)
+  {
+    GNUNET_break (0);
+    ANASTASIS_redux_action_cancel (AG_ra);
+  }
+  AG_action_cb (NULL,
+                TALER_EC_NONE,
+                response);
+}
+
+
+/**
+ * The user must select the next challenge to solve
+ * during the recovery process.
  */
 static void
 action_challenge_selecting (void)
@@ -2225,6 +2321,7 @@ action_challenge_selecting (void)
       const char *type;
       const char *uuid;
       struct TALER_Amount cost;
+      bool async = false;
       struct GNUNET_JSON_Specification spec[] = {
         GNUNET_JSON_spec_string ("instructions",
                                  &instructions),
@@ -2234,6 +2331,9 @@ action_challenge_selecting (void)
                                  &provider),
         GNUNET_JSON_spec_string ("uuid",
                                  &uuid),
+        GNUNET_JSON_spec_mark_optional (
+          GNUNET_JSON_spec_bool ("async",
+                                 &async)),
         GNUNET_JSON_spec_end ()
       };
 
@@ -2266,7 +2366,14 @@ action_challenge_selecting (void)
                                  uuid,
                                  NULL))
         continue;
-
+      if (async &&
+          (NULL == AG_long_task) )
+      {
+        long_next = GNUNET_TIME_UNIT_ZERO_ABS;
+        AG_long_task
+          = GNUNET_SCHEDULER_add_now (&long_task,
+                                      NULL);
+      }
       gtk_list_store_insert_with_values (
         ls,
         NULL,
@@ -2436,6 +2543,10 @@ action_challenge_selecting (void)
 }
 
 
+/**
+ * An Anastasis provider requires payment for a challenge.
+ * Give opportunity to the user to pay.
+ */
 static void
 action_challenge_paying (void)
 {
@@ -3015,7 +3126,8 @@ action_challenge_solving (void)
 
 
 /**
- * FIXME.
+ * The recovery process was finished. Show the recovered secret to the
+ * user.
  */
 static void
 action_recovery_finished (void)
@@ -3187,11 +3299,11 @@ AG_action_cb (void *cls,
       GNUNET_break (0);
       return;
     }
-
   }
   else
   {
     json_decref (AG_redux_state);
+    AG_stop_long_action ();
     AG_redux_state = json_incref (response);
   }
   if ( (TALER_EC_ANASTASIS_TRUTH_UNKNOWN == error_code) ||
diff --git a/src/anastasis/anastasis-gtk_helper.c 
b/src/anastasis/anastasis-gtk_helper.c
index 5760f00..558eb20 100644
--- a/src/anastasis/anastasis-gtk_helper.c
+++ b/src/anastasis/anastasis-gtk_helper.c
@@ -49,6 +49,7 @@ void
 AG_freeze ()
 {
   AG_insensitive ("anastasis_gtk_main_window");
+  AG_stop_long_action ();
   GNUNET_assert (NULL == AG_ra);
 }
 

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]