[gnome-builder] transfer: fail transfer stages when on metered connections



commit db9568fd86907068e16996032a32fd61b888692a
Author: Christian Hergert <chergert redhat com>
Date:   Mon Apr 24 20:13:39 2017 -0700

    transfer: fail transfer stages when on metered connections
    
    If we are on a metered connection, then we don't want to be downloading
    things like SDKs and such. Default to setting disable-when-metered to
    TRUE. Note that if the ::query() phase of the build stage marks the
    transfer as completed, then the stage will not fail.
    
    A followup commit will contain the ability to configure if you want to
    download on metered connections.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=781450

 libide/Makefile.am                            |    1 +
 libide/buildsystem/ide-build-stage-transfer.c |   41 ++++++++++++++++++++++++-
 libide/ide-enums.c.in                         |    1 +
 libide/transfers/ide-transfer.c               |    6 ++++
 libide/transfers/ide-transfer.h               |   10 +++++-
 po/POTFILES.in                                |    1 +
 6 files changed, 58 insertions(+), 2 deletions(-)
---
diff --git a/libide/Makefile.am b/libide/Makefile.am
index 76e3bac..47e8d88 100644
--- a/libide/Makefile.am
+++ b/libide/Makefile.am
@@ -666,6 +666,7 @@ glib_enum_headers =                                                         \
        sourceview/ide-source-view.h                                        \
        symbols/ide-symbol.h                                                \
        threading/ide-thread-pool.h                                         \
+       transfers/ide-transfer.h                                            \
        vcs/ide-vcs-config.h                                                \
        workbench/ide-layout-stack-split.h                                  \
        $(NULL)
diff --git a/libide/buildsystem/ide-build-stage-transfer.c b/libide/buildsystem/ide-build-stage-transfer.c
index a71346e..5722aa0 100644
--- a/libide/buildsystem/ide-build-stage-transfer.c
+++ b/libide/buildsystem/ide-build-stage-transfer.c
@@ -18,7 +18,10 @@
 
 #define G_LOG_DOMAIN "ide-build-stage-transfer"
 
+#include <glib/gi18n.h>
+
 #include "ide-context.h"
+#include "ide-debug.h"
 
 #include "buildsystem/ide-build-stage-transfer.h"
 #include "buildsystem/ide-build-pipeline.h"
@@ -29,11 +32,13 @@ struct _IdeBuildStageTransfer
 {
   IdeBuildStage  parent_instnace;
   IdeTransfer   *transfer;
+  guint          disable_when_metered : 1;
 };
 
 enum {
   PROP_0,
   PROP_TRANSFER,
+  PROP_DISABLE_WHEN_METERED,
   N_PROPS
 };
 
@@ -72,6 +77,8 @@ ide_build_stage_transfer_execute_async (IdeBuildStage       *stage,
   IdeTransferManager *transfer_manager;
   IdeContext *context;
 
+  IDE_ENTRY;
+
   g_assert (IDE_IS_BUILD_STAGE_TRANSFER (self));
   g_assert (IDE_IS_BUILD_PIPELINE (pipeline));
   g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
@@ -82,7 +89,21 @@ ide_build_stage_transfer_execute_async (IdeBuildStage       *stage,
   if (ide_transfer_get_completed (self->transfer))
     {
       g_task_return_boolean (task, TRUE);
-      return;
+      IDE_EXIT;
+    }
+
+  if (self->disable_when_metered)
+    {
+      GNetworkMonitor *monitor = g_network_monitor_get_default ();
+
+      if (g_network_monitor_get_network_metered (monitor))
+        {
+          g_task_return_new_error (task,
+                                   IDE_TRANSFER_ERROR,
+                                   IDE_TRANSFER_ERROR_CONNECTION_IS_METERED,
+                                   _("Cannot execute transfer while on metered connection"));
+          IDE_EXIT;
+        }
     }
 
   context = ide_object_get_context (IDE_OBJECT (self));
@@ -93,6 +114,8 @@ ide_build_stage_transfer_execute_async (IdeBuildStage       *stage,
                                       cancellable,
                                       ide_build_stage_transfer_execute_cb,
                                       g_steal_pointer (&task));
+
+  IDE_EXIT;
 }
 
 static gboolean
@@ -126,6 +149,10 @@ ide_build_stage_transfer_get_property (GObject    *object,
 
   switch (prop_id)
     {
+    case PROP_DISABLE_WHEN_METERED:
+      g_value_set_boolean (value, self->disable_when_metered);
+      break;
+
     case PROP_TRANSFER:
       g_value_set_object (value, self->transfer);
       break;
@@ -145,6 +172,10 @@ ide_build_stage_transfer_set_property (GObject      *object,
 
   switch (prop_id)
     {
+    case PROP_DISABLE_WHEN_METERED:
+      self->disable_when_metered = g_value_get_boolean (value);
+      break;
+
     case PROP_TRANSFER:
       self->transfer = g_value_dup_object (value);
       break;
@@ -167,6 +198,13 @@ ide_build_stage_transfer_class_init (IdeBuildStageTransferClass *klass)
   build_stage_class->execute_async = ide_build_stage_transfer_execute_async;
   build_stage_class->execute_finish = ide_build_stage_transfer_execute_finish;
 
+  properties [PROP_DISABLE_WHEN_METERED] =
+    g_param_spec_boolean ("disable-when-metered",
+                          "Disable when Metered",
+                          "If the transfer should fail when on a metered connection",
+                          TRUE,
+                          (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   properties [PROP_TRANSFER] =
     g_param_spec_object ("transfer",
                          "Transfer",
@@ -180,4 +218,5 @@ ide_build_stage_transfer_class_init (IdeBuildStageTransferClass *klass)
 static void
 ide_build_stage_transfer_init (IdeBuildStageTransfer *self)
 {
+  self->disable_when_metered = TRUE;
 }
diff --git a/libide/ide-enums.c.in b/libide/ide-enums.c.in
index 5013750..069de62 100644
--- a/libide/ide-enums.c.in
+++ b/libide/ide-enums.c.in
@@ -16,6 +16,7 @@
 #include "sourceview/ide-source-view.h"
 #include "symbols/ide-symbol.h"
 #include "threading/ide-thread-pool.h"
+#include "transfers/ide-transfer.h"
 #include "vcs/ide-vcs-config.h"
 #include "workbench/ide-layout-stack-split.h"
 
diff --git a/libide/transfers/ide-transfer.c b/libide/transfers/ide-transfer.c
index 82d1a6b..af8350f 100644
--- a/libide/transfers/ide-transfer.c
+++ b/libide/transfers/ide-transfer.c
@@ -457,3 +457,9 @@ ide_transfer_get_active (IdeTransfer *self)
 
   return priv->active;
 }
+
+GQuark
+ide_transfer_error_quark (void)
+{
+  return g_quark_from_static_string ("ide-transfer-error-quark");
+}
diff --git a/libide/transfers/ide-transfer.h b/libide/transfers/ide-transfer.h
index ec989f6..7c26b3d 100644
--- a/libide/transfers/ide-transfer.h
+++ b/libide/transfers/ide-transfer.h
@@ -23,7 +23,8 @@
 
 G_BEGIN_DECLS
 
-#define IDE_TYPE_TRANSFER (ide_transfer_get_type())
+#define IDE_TYPE_TRANSFER  (ide_transfer_get_type())
+#define IDE_TRANSFER_ERROR (ide_transfer_error_quark())
 
 G_DECLARE_DERIVABLE_TYPE (IdeTransfer, ide_transfer, IDE, TRANSFER, GObject)
 
@@ -49,6 +50,13 @@ struct _IdeTransferClass
   gpointer _reserved8;
 };
 
+typedef enum
+{
+  IDE_TRANSFER_ERROR_UNKNOWN = 0,
+  IDE_TRANSFER_ERROR_CONNECTION_IS_METERED = 1,
+} IdeTransferError;
+
+GQuark       ide_transfer_error_quark    (void);
 void         ide_transfer_cancel         (IdeTransfer          *self);
 gboolean     ide_transfer_get_completed  (IdeTransfer          *self);
 gboolean     ide_transfer_get_active     (IdeTransfer          *self);
diff --git a/po/POTFILES.in b/po/POTFILES.in
index f1ede2c..3f9399b 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -95,6 +95,7 @@ libide/snippets/ide-source-snippet-completion-provider.c
 libide/snippets/ide-source-snippets-manager.c
 libide/sourceview/ide-source-view.c
 libide/transfers/ide-pkcon-transfer.c
+libide/transfers/ide-transfer.c
 libide/transfers/ide-transfers-button.ui
 libide/util/ide-file-manager.c
 libide/util/ide-uri.c


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