[gnome-commander] Change owner of a file with GIO



commit cd385ba5b2332df819294b49c90938ae0b0430c4
Author: Uwe Scholz <u scholz83 gmx de>
Date:   Sun May 30 18:38:33 2021 +0200

    Change owner of a file with GIO

 src/dialogs/gnome-cmd-chown-dialog.cc      | 37 ++++++++---------
 src/dialogs/gnome-cmd-file-props-dialog.cc | 11 +++--
 src/gnome-cmd-file.cc                      | 67 +++++++++++++++++++++++++-----
 src/gnome-cmd-file.h                       |  2 +-
 4 files changed, 82 insertions(+), 35 deletions(-)
---
diff --git a/src/dialogs/gnome-cmd-chown-dialog.cc b/src/dialogs/gnome-cmd-chown-dialog.cc
index 92d398277..5e82d245e 100644
--- a/src/dialogs/gnome-cmd-chown-dialog.cc
+++ b/src/dialogs/gnome-cmd-chown-dialog.cc
@@ -1,4 +1,4 @@
-/** 
+/**
  * @file gnome-cmd-chown-dialog.cc
  * @copyright (C) 2001-2006 Marcus Bjurman\n
  * @copyright (C) 2007-2012 Piotr Eljasiak\n
@@ -46,22 +46,16 @@ G_DEFINE_TYPE (GnomeCmdChownDialog, gnome_cmd_chown_dialog, GNOME_CMD_TYPE_DIALO
 
 static void do_chown (GnomeCmdFile *in, uid_t uid, gid_t gid, gboolean recurse)
 {
-    g_return_if_fail (in != NULL);
-    g_return_if_fail (in->info != NULL);
+    g_return_if_fail (in != nullptr);
+    g_return_if_fail (in->gFileInfo != nullptr);
 
-    GnomeVFSResult ret = in->chown(uid, gid);
-
-    if (ret != GNOME_VFS_OK)
+    if(!in->chown(uid, gid))
     {
-        gchar *fpath = in->get_real_path();
-        gchar *msg = g_strdup_printf (_("Could not chown %s"), fpath);
-        gnome_cmd_show_message (*main_win, msg, gnome_vfs_result_to_string (ret));
-        g_free (msg);
-        g_free (fpath);
+        return;
     }
-    else
-        if (!recurse)
-            return;
+
+    if (!recurse)
+        return;
 
     if (in->GetGfileAttributeUInt32(G_FILE_ATTRIBUTE_STANDARD_TYPE) == G_FILE_TYPE_DIRECTORY)
     {
@@ -72,11 +66,14 @@ static void do_chown (GnomeCmdFile *in, uid_t uid, gid_t gid, gboolean recurse)
         for (GList *i = gnome_cmd_dir_get_files (dir); i; i = i->next)
         {
             GnomeCmdFile *f = (GnomeCmdFile *) i->data;
-            if (!f->is_dotdot && strcmp (f->info->name, ".") != 0
-                && !GNOME_VFS_FILE_INFO_SYMLINK(f->info))
+
+            auto filename = GetGfileAttributeString(f->gFile, G_FILE_ATTRIBUTE_STANDARD_NAME);
+            if (!f->is_dotdot && strcmp (filename, ".") != 0
+                && !g_file_info_get_is_symlink(f->gFileInfo))
             {
                 do_chown (f, uid, gid, TRUE);
             }
+            g_free(filename);
         }
         gnome_cmd_dir_unref (dir);
     }
@@ -109,8 +106,8 @@ static void on_ok (GtkButton *button, GnomeCmdChownDialog *dialog)
 
         g_return_if_fail (f != NULL);
 
-        if (GNOME_VFS_FILE_INFO_LOCAL (f->info))
-            do_chown (f, uid, gid, recurse);
+        //ToDo: Check if this works also on non-local filesystems
+        do_chown (f, uid, gid, recurse);
     }
 
     view_refresh (NULL, NULL);
@@ -185,7 +182,9 @@ GtkWidget *gnome_cmd_chown_dialog_new (GList *files)
     dialog->priv->files = gnome_cmd_file_list_copy (files);
     GnomeCmdFile *f = GNOME_CMD_FILE (dialog->priv->files->data);
 
-    gnome_cmd_chown_component_set (GNOME_CMD_CHOWN_COMPONENT (dialog->priv->chown_component), f->info->uid, 
f->info->gid);
+    gnome_cmd_chown_component_set (GNOME_CMD_CHOWN_COMPONENT (dialog->priv->chown_component),
+        GetGfileAttributeUInt32(f->gFile, G_FILE_ATTRIBUTE_UNIX_UID),
+        GetGfileAttributeUInt32(f->gFile, G_FILE_ATTRIBUTE_UNIX_GID));
 
     return GTK_WIDGET (dialog);
 }
diff --git a/src/dialogs/gnome-cmd-file-props-dialog.cc b/src/dialogs/gnome-cmd-file-props-dialog.cc
index 2f655bdd8..ddb7e5e83 100644
--- a/src/dialogs/gnome-cmd-file-props-dialog.cc
+++ b/src/dialogs/gnome-cmd-file-props-dialog.cc
@@ -188,6 +188,7 @@ static void do_calc_tree_size (GnomeCmdFilePropsDialogPrivate *data)
 static void on_dialog_ok (GtkButton *btn, GnomeCmdFilePropsDialogPrivate *data)
 {
     GnomeVFSResult result = GNOME_VFS_OK;
+    gboolean retValue = true;
 
     const gchar *filename = gtk_entry_get_text (GTK_ENTRY (data->filename_entry));
 
@@ -209,15 +210,17 @@ static void on_dialog_ok (GtkButton *btn, GnomeCmdFilePropsDialogPrivate *data)
 
     if (result == GNOME_VFS_OK)
     {
-
         uid_t uid = gnome_cmd_chown_component_get_owner (GNOME_CMD_CHOWN_COMPONENT (data->chown_component));
         gid_t gid = gnome_cmd_chown_component_get_group (GNOME_CMD_CHOWN_COMPONENT (data->chown_component));
 
-        if (uid != data->f->info->uid || gid != data->f->info->gid)
-            result = data->f->chown(uid,gid);
+        if (   uid != GetGfileAttributeUInt32(data->f->gFile, G_FILE_ATTRIBUTE_UNIX_UID)
+            || gid != GetGfileAttributeUInt32(data->f->gFile, G_FILE_ATTRIBUTE_UNIX_GID))
+        {
+            retValue = data->f->chown(uid,gid);
+        }
     }
 
-    if (result != GNOME_VFS_OK)
+    if (result != GNOME_VFS_OK || !retValue)
     {
         gnome_cmd_show_message (NULL, filename, gnome_vfs_result_to_string (result));
         return;
diff --git a/src/gnome-cmd-file.cc b/src/gnome-cmd-file.cc
index b5ad43a7f..f4661a2c8 100644
--- a/src/gnome-cmd-file.cc
+++ b/src/gnome-cmd-file.cc
@@ -378,6 +378,8 @@ void GnomeCmdFile::chmod(guint32 permissions)
         return;
     }
 
+    g_object_unref(gFileInfoPerms);
+
     if (has_parent_dir (this))
     {
         GnomeCmdDir *dir = ::get_parent_dir (this);
@@ -385,21 +387,65 @@ void GnomeCmdFile::chmod(guint32 permissions)
         gnome_cmd_dir_file_changed (dir, uri_str);
         g_free (uri_str);
     }
-    g_object_unref(gFileInfoPerms);
 }
 
 
-GnomeVFSResult GnomeCmdFile::chown(uid_t uid, gid_t gid)
+gboolean GnomeCmdFile::chown(uid_t uid, gid_t gid)
 {
-    g_return_val_if_fail (info != nullptr, GNOME_VFS_ERROR_CORRUPTED_DATA);
+    GError *error;
+    error = nullptr;
 
-    if (uid != (uid_t)-1)
-        info->uid = uid;
-    info->gid = gid;
+    auto gFileInfoMods = g_file_query_info(gFile,
+                                           G_FILE_ATTRIBUTE_UNIX_UID "," G_FILE_ATTRIBUTE_UNIX_GID,
+                                           G_FILE_QUERY_INFO_NONE,
+                                           nullptr,
+                                           &error);
+    if (error)
+    {
+        g_message ("chown: retrieving file info failed: %s", error->message);
 
-    GnomeVFSURI *uri = get_uri();
-    GnomeVFSResult ret = gnome_vfs_set_file_info_uri (uri, info, GNOME_VFS_SET_FILE_INFO_OWNER);
-    gnome_vfs_uri_unref (uri);
+        gchar *fname = GetGfileAttributeString(G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME);
+        gchar *msg = g_strdup_printf (_("Could not chown %s"), fname);
+        gnome_cmd_show_message (*main_win, msg, error->message);
+        g_free (msg);
+        g_free (fname);
+
+        g_error_free (error);
+        return false;
+    }
+
+    if (uid != (uid_t) -1)
+    {
+        g_file_info_set_attribute_uint32(gFileInfoMods,
+                                         G_FILE_ATTRIBUTE_UNIX_UID,
+                                         uid);
+    }
+
+    g_file_info_set_attribute_uint32(gFileInfoMods,
+                                     G_FILE_ATTRIBUTE_UNIX_GID,
+                                     gid);
+
+    g_file_set_attributes_from_info(gFile,
+                                    gFileInfoMods,
+                                    G_FILE_QUERY_INFO_NONE,
+                                    nullptr,
+                                    &error);
+    if (error)
+    {
+        g_message ("chmod: setting file mode failed: %s", error->message);
+
+        gchar *fname = GetGfileAttributeString(G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME);
+        gchar *msg = g_strdup_printf (_("Could not chown %s"), fname);
+        gnome_cmd_show_message (*main_win, msg, error->message);
+        g_free (msg);
+        g_free (fname);
+
+        g_object_unref(gFileInfoMods);
+        g_error_free (error);
+        return false;
+    }
+
+    g_object_unref(gFileInfoMods);
 
     if (has_parent_dir (this))
     {
@@ -408,8 +454,7 @@ GnomeVFSResult GnomeCmdFile::chown(uid_t uid, gid_t gid)
         gnome_cmd_dir_file_changed (dir, uri_str);
         g_free (uri_str);
     }
-
-    return ret;
+    return true;
 }
 
 
diff --git a/src/gnome-cmd-file.h b/src/gnome-cmd-file.h
index 3978ce61d..7a823e05f 100644
--- a/src/gnome-cmd-file.h
+++ b/src/gnome-cmd-file.h
@@ -91,7 +91,7 @@ struct GnomeCmdFile
     gboolean get_type_pixmap_and_mask(GdkPixmap **pixmap, GdkBitmap **mask);
 
     void chmod(guint32 permissions);
-    GnomeVFSResult chown(uid_t uid, gid_t gid);
+    gboolean chown(uid_t uid, gid_t gid);
     GnomeVFSResult rename(const gchar *new_name);
 
     void update_info(GnomeVFSFileInfo *info);


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