[gnome-disk-utility] Hook up GUI to udisks master's newly added Manager.MDRaidCreate() method



commit 520bbcba52cbcebe2be4ecba9a6e937b6079da3c
Author: David Zeuthen <zeuthen gmail com>
Date:   Fri Oct 12 10:00:02 2012 -0400

    Hook up GUI to udisks master's newly added Manager.MDRaidCreate() method
    
    Signed-off-by: David Zeuthen <zeuthen gmail com>

 data/ui/create-raid-array-dialog.ui  |    2 +
 src/disks/gducreateraidarraydialog.c |   82 +++++++++++++++++++++++++++++++++-
 src/disks/gduwindow.c                |   15 ++++++
 3 files changed, 98 insertions(+), 1 deletions(-)
---
diff --git a/data/ui/create-raid-array-dialog.ui b/data/ui/create-raid-array-dialog.ui
index 2b59fa6..f1e24a2 100644
--- a/data/ui/create-raid-array-dialog.ui
+++ b/data/ui/create-raid-array-dialog.ui
@@ -6,6 +6,8 @@
     <property name="can_focus">False</property>
     <property name="border_width">12</property>
     <property name="title" translatable="yes">Create RAID Array</property>
+    <property name="resizable">False</property>
+    <property name="modal">True</property>
     <property name="type_hint">dialog</property>
     <child internal-child="vbox">
       <object class="GtkBox" id="dialog-vbox1">
diff --git a/src/disks/gducreateraidarraydialog.c b/src/disks/gducreateraidarraydialog.c
index 08ff4f9..6b300c2 100644
--- a/src/disks/gducreateraidarraydialog.c
+++ b/src/disks/gducreateraidarraydialog.c
@@ -12,6 +12,7 @@
 #include <glib/gi18n.h>
 
 #include <math.h>
+#include <stdlib.h>
 
 #include "gduapplication.h"
 #include "gduwindow.h"
@@ -69,7 +70,7 @@ static void on_client_changed (UDisksClient  *client,
 
 /* ---------------------------------------------------------------------------------------------------- */
 
-G_GNUC_UNUSED static DialogData *
+static DialogData *
 dialog_data_ref (DialogData *data)
 {
   g_atomic_int_inc (&data->ref_count);
@@ -406,6 +407,35 @@ on_client_changed (UDisksClient   *client,
 
 /* ---------------------------------------------------------------------------------------------------- */
 
+static void
+mdraid_create_cb (GObject      *source_object,
+                  GAsyncResult *res,
+                  gpointer      user_data)
+{
+  DialogData *data = user_data;
+  GError *error;
+  gchar *array_objpath = NULL;
+
+  error = NULL;
+  if (!udisks_manager_call_mdraid_create_finish (UDISKS_MANAGER (source_object),
+                                                 &array_objpath,
+                                                 res,
+                                                 &error))
+    {
+      gdu_utils_show_error (GTK_WINDOW (data->window), _("Error creating RAID array"), error);
+      g_error_free (error);
+    }
+  else
+    {
+      UDisksObject *object;
+      udisks_client_settle (data->client);
+      object = udisks_client_get_object (data->client, array_objpath);
+      gdu_window_select_object (data->window, object);
+      g_object_unref (object);
+    }
+  dialog_data_unref (data);
+  g_free (array_objpath);
+}
 
 void
 gdu_create_raid_array_dialog_show (GduWindow *window,
@@ -454,6 +484,56 @@ gdu_create_raid_array_dialog_show (GduWindow *window,
           goto out;
           break;
 
+        case GTK_RESPONSE_OK:
+          {
+            GVariantBuilder options_builder;
+            const gchar *name;
+            const gchar *level;
+            guint64 chunk;
+            GPtrArray *p;
+            GList *l;
+
+            if (!gdu_utils_show_confirmation (GTK_WINDOW (data->window),
+                                              _("Are you sure you want to use the disks for a RAID array?"),
+                                              _("Existing content on the devices will be erased"),
+                                              _("C_reate"),
+                                              NULL, NULL))
+              {
+                continue;
+              }
+
+            name = gtk_entry_get_text (GTK_ENTRY (data->name_entry));
+            level = gtk_combo_box_get_active_id (GTK_COMBO_BOX (data->level_combobox));
+            chunk = atoi (gtk_combo_box_get_active_id (GTK_COMBO_BOX (data->chunk_combobox)) + strlen ("chunk_"));
+            chunk *= 1024;
+            if (g_strcmp0 (level, "raid1") == 0)
+              chunk = 0;
+
+            p = g_ptr_array_new ();
+            for (l = data->blocks; l != NULL; l = l->next)
+              {
+                UDisksBlock *block = UDISKS_BLOCK (l->data);
+                GDBusObject *object;
+                object = g_dbus_interface_get_object (G_DBUS_INTERFACE (block));
+                g_ptr_array_add (p, (gpointer) g_dbus_object_get_object_path (object));
+              }
+            g_ptr_array_add (p, NULL);
+
+            g_variant_builder_init (&options_builder, G_VARIANT_TYPE_VARDICT);
+            udisks_manager_call_mdraid_create (udisks_client_get_manager (data->client),
+                                               (const gchar* const *) p->pdata,
+                                               level,
+                                               name,
+                                               chunk,
+                                               g_variant_builder_end (&options_builder),
+                                               NULL,                       /* GCancellable */
+                                               (GAsyncReadyCallback) mdraid_create_cb,
+                                               dialog_data_ref (data));
+            g_ptr_array_free (p, TRUE);
+            goto out;
+          }
+          break;
+
         default:
           goto out;
         }
diff --git a/src/disks/gduwindow.c b/src/disks/gduwindow.c
index 632b1b8..127d8a3 100644
--- a/src/disks/gduwindow.c
+++ b/src/disks/gduwindow.c
@@ -947,8 +947,23 @@ gdu_window_select_object (GduWindow    *window,
   gboolean ret = FALSE;
   UDisksPartition *partition;
   UDisksPartitionTable *table = NULL;
+  UDisksMDRaid *mdraid = NULL;
   UDisksDrive *drive = NULL;
 
+  mdraid = udisks_object_peek_mdraid (object);
+  if (mdraid != NULL)
+    {
+      select_object (window, object);
+      goto out;
+    }
+
+  drive = udisks_object_peek_drive (object);
+  if (drive != NULL)
+    {
+      select_object (window, object);
+      goto out;
+    }
+
   partition = udisks_object_peek_partition (object);
 
   /* if it's a partition, first select the object with the partition table */



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