[gnome-commander/chmod_via_GIO: 2/2] Instead of GnomeVFSFilePermissions use guint32 and GIO's G_FILE_ATTRIBUTE_UNIX_MODE for doing a chmo




commit 957bc81be6972ba2488d17a315f92ec0eba2711a
Author: Uwe Scholz <u scholz83 gmx de>
Date:   Thu May 27 23:11:28 2021 +0200

    Instead of GnomeVFSFilePermissions use guint32 and GIO's G_FILE_ATTRIBUTE_UNIX_MODE for doing a chmod

 src/dialogs/gnome-cmd-chmod-dialog.cc      | 32 +++++++++++-------------
 src/dialogs/gnome-cmd-file-props-dialog.cc | 10 ++++----
 src/dirlist.cc                             |  8 +++---
 src/gnome-cmd-chmod-component.cc           | 19 +++++++-------
 src/gnome-cmd-chmod-component.h            |  4 +--
 src/gnome-cmd-dir.cc                       | 28 +++++++++++++--------
 src/gnome-cmd-file-list.cc                 |  8 +++---
 src/gnome-cmd-file.cc                      | 40 ++++++++++++++++++++++++------
 src/gnome-cmd-file.h                       |  2 +-
 9 files changed, 89 insertions(+), 62 deletions(-)
---
diff --git a/src/dialogs/gnome-cmd-chmod-dialog.cc b/src/dialogs/gnome-cmd-chmod-dialog.cc
index c08d5567..a16308c1 100644
--- a/src/dialogs/gnome-cmd-chmod-dialog.cc
+++ b/src/dialogs/gnome-cmd-chmod-dialog.cc
@@ -1,4 +1,4 @@
-/** 
+/**
  * @file gnome-cmd-chmod-dialog.cc
  * @copyright (C) 2001-2006 Marcus Bjurman\n
  * @copyright (C) 2007-2012 Piotr Eljasiak\n
@@ -50,7 +50,7 @@ struct GnomeCmdChmodDialogPrivate
 {
     GList *files;
     GnomeCmdFile *f;
-    GnomeVFSFilePermissions perms;
+    guint32 permissions;
 
     GtkWidget *chmod_component;
     GtkWidget *recurse_check;
@@ -61,22 +61,18 @@ struct GnomeCmdChmodDialogPrivate
 G_DEFINE_TYPE (GnomeCmdChmodDialog, gnome_cmd_chmod_dialog, GNOME_CMD_TYPE_DIALOG)
 
 
-static void do_chmod (GnomeCmdFile *in, GnomeVFSFilePermissions perm, gboolean recursive, ChmodRecursiveMode 
mode)
+static void do_chmod (GnomeCmdFile *in, guint32 permissions, gboolean recursive, ChmodRecursiveMode mode)
 {
     g_return_if_fail (in != NULL);
-    g_return_if_fail (in->info != NULL);
 
     if (!(recursive
           && mode == CHMOD_DIRS_ONLY
           && in->GetGfileAttributeUInt32(G_FILE_ATTRIBUTE_STANDARD_TYPE) != G_FILE_TYPE_DIRECTORY))
     {
-        GnomeVFSResult ret = in->chmod(perm);
+        in->chmod(permissions);
 
-        if (ret != GNOME_VFS_OK)
-            gnome_cmd_show_message (NULL, in->get_name(), gnome_vfs_result_to_string (ret));
-        else
-            if (!recursive)
-                return;
+        if (!recursive)
+            return;
     }
 
     if (in->GetGfileAttributeUInt32(G_FILE_ATTRIBUTE_STANDARD_TYPE) == G_FILE_TYPE_DIRECTORY)
@@ -88,11 +84,13 @@ static void do_chmod (GnomeCmdFile *in, GnomeVFSFilePermissions perm, gboolean r
         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_chmod (f, perm, TRUE, mode);
+                do_chmod (f, permissions, TRUE, mode);
             }
+            g_free(filename);
         }
         gnome_cmd_dir_unref (dir);
     }
@@ -109,7 +107,7 @@ inline void do_chmod_files (GnomeCmdChmodDialog *dialog)
         ChmodRecursiveMode mode = strcmp (mode_text, recurse_opts[CHMOD_ALL_FILES]) == 0 ? CHMOD_ALL_FILES :
                                                                                            CHMOD_DIRS_ONLY;
 
-        do_chmod (f, dialog->priv->perms, recursive, mode);
+        do_chmod (f, dialog->priv->permissions, recursive, mode);
         view_refresh (NULL, NULL);
     }
 }
@@ -117,7 +115,7 @@ inline void do_chmod_files (GnomeCmdChmodDialog *dialog)
 
 inline void show_perms (GnomeCmdChmodDialog *dialog)
 {
-    gnome_cmd_chmod_component_set_perms (GNOME_CMD_CHMOD_COMPONENT (dialog->priv->chmod_component), 
dialog->priv->perms);
+    gnome_cmd_chmod_component_set_perms (GNOME_CMD_CHMOD_COMPONENT (dialog->priv->chmod_component), 
dialog->priv->permissions);
 }
 
 
@@ -144,7 +142,7 @@ static void on_toggle_recurse (GtkToggleButton *togglebutton, GnomeCmdChmodDialo
 
 static void on_perms_changed (GnomeCmdChmodComponent *component, GnomeCmdChmodDialog *dialog)
 {
-    dialog->priv->perms =
+    dialog->priv->permissions =
         gnome_cmd_chmod_component_get_perms (GNOME_CMD_CHMOD_COMPONENT (dialog->priv->chmod_component));
 }
 
@@ -225,7 +223,7 @@ GtkWidget *gnome_cmd_chmod_dialog_new (GList *files)
     dialog->priv->f = (GnomeCmdFile *) dialog->priv->files->data;
     g_return_val_if_fail (dialog->priv->f != NULL, NULL);
 
-    dialog->priv->perms = dialog->priv->f->info->permissions;
+    dialog->priv->permissions = GetGfileAttributeUInt32(dialog->priv->f->gFile, G_FILE_ATTRIBUTE_UNIX_MODE) 
& 0xFFF;
 
     show_perms (dialog);
 
diff --git a/src/dialogs/gnome-cmd-file-props-dialog.cc b/src/dialogs/gnome-cmd-file-props-dialog.cc
index e376c554..2f655bdd 100644
--- a/src/dialogs/gnome-cmd-file-props-dialog.cc
+++ b/src/dialogs/gnome-cmd-file-props-dialog.cc
@@ -1,4 +1,4 @@
-/** 
+/**
  * @file gnome-cmd-file-props-dialog.cc
  * @copyright (C) 2001-2006 Marcus Bjurman\n
  * @copyright (C) 2007-2012 Piotr Eljasiak\n
@@ -201,15 +201,15 @@ static void on_dialog_ok (GtkButton *btn, GnomeCmdFilePropsDialogPrivate *data)
 
     if (result == GNOME_VFS_OK)
     {
-        GnomeVFSFilePermissions perms = gnome_cmd_chmod_component_get_perms (GNOME_CMD_CHMOD_COMPONENT 
(data->chmod_component));
+        auto perms = gnome_cmd_chmod_component_get_perms (GNOME_CMD_CHMOD_COMPONENT (data->chmod_component));
 
-        if (perms != data->f->info->permissions)
-            result = data->f->chmod(perms);
+        if (perms != GetGfileAttributeUInt32(data->f->gFile, G_FILE_ATTRIBUTE_UNIX_MODE) & 0xFFF )
+            data->f->chmod(perms);
     }
 
     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));
 
diff --git a/src/dirlist.cc b/src/dirlist.cc
index b4279196..62c6bb3d 100644
--- a/src/dirlist.cc
+++ b/src/dirlist.cc
@@ -118,12 +118,15 @@ static void enumerate_children_callback(GObject *direnum, GAsyncResult *result,
 
 void sync_list (GnomeCmdDir *dir)
 {
+    g_return_if_fail(dir != nullptr);
+
     GError *error = nullptr;
 
     gchar *uri_str = GNOME_CMD_FILE (dir)->get_uri_str();
     DEBUG('l', "sync_list: %s\n", uri_str);
+    g_free (uri_str);
 
-    dir->infolist = NULL;
+    dir->gFileInfoList = nullptr;
 
     auto gFile = GNOME_CMD_FILE (dir)->gFile;
 
@@ -146,9 +149,6 @@ void sync_list (GnomeCmdDir *dir)
                     enumerate_children_callback,
                     dir);
 
-    g_object_unref(gFileEnumerator);
-    g_free (uri_str);
-
     dir->state = GnomeCmdDir::STATE_LISTING;
 }
 
diff --git a/src/gnome-cmd-chmod-component.cc b/src/gnome-cmd-chmod-component.cc
index 51a22663..f72ea25c 100644
--- a/src/gnome-cmd-chmod-component.cc
+++ b/src/gnome-cmd-chmod-component.cc
@@ -1,4 +1,4 @@
-/** 
+/**
  * @file gnome-cmd-chmod-component.cc
  * @copyright (C) 2001-2006 Marcus Bjurman\n
  * @copyright (C) 2007-2012 Piotr Eljasiak\n
@@ -54,10 +54,10 @@ static void on_perms_changed (GnomeCmdChmodComponent *comp)
     static gchar text_view[10];
     static gchar number_view[4];
 
-    GnomeVFSFilePermissions perms = gnome_cmd_chmod_component_get_perms (comp);
+    guint32 permissions = gnome_cmd_chmod_component_get_perms (comp);
 
-    perm2textstring (perms, text_view, sizeof(text_view));
-    perm2numstring (perms, number_view, sizeof(number_view));
+    perm2textstring (permissions, text_view, sizeof(text_view));
+    perm2numstring (permissions, number_view, sizeof(number_view));
     gtk_label_set_text (GTK_LABEL (comp->priv->textview_label), text_view);
     gtk_label_set_text (GTK_LABEL (comp->priv->numberview_label), number_view);
 }
@@ -202,23 +202,22 @@ GtkType gnome_cmd_chmod_component_get_type ()
     return type;
 }
 
-//TODO: Change this function to return guint32
-GnomeVFSFilePermissions gnome_cmd_chmod_component_get_perms (GnomeCmdChmodComponent *comp)
+guint32 gnome_cmd_chmod_component_get_perms (GnomeCmdChmodComponent *comp)
 {
-    guint perms = 0;
+    guint32 perms = 0;
 
     for (gint y=0; y<3; y++)
         for (gint x=0; x<3; x++)
             if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (comp->priv->check_boxes[y][x])))
                 perms |= check_perm[y][x];
 
-    return (GnomeVFSFilePermissions) perms;
+    return perms;
 }
 
 
-void gnome_cmd_chmod_component_set_perms (GnomeCmdChmodComponent *component, GnomeVFSFilePermissions perms)
+void gnome_cmd_chmod_component_set_perms (GnomeCmdChmodComponent *component, guint32 permissions)
 {
     for (gint y=0; y<3; y++)
         for (gint x=0; x<3; x++)
-            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (component->priv->check_boxes[y][x]), perms & 
check_perm[y][x]);
+            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (component->priv->check_boxes[y][x]), 
permissions & check_perm[y][x]);
 }
diff --git a/src/gnome-cmd-chmod-component.h b/src/gnome-cmd-chmod-component.h
index d020c2e8..5cd18aaf 100644
--- a/src/gnome-cmd-chmod-component.h
+++ b/src/gnome-cmd-chmod-component.h
@@ -53,5 +53,5 @@ GtkWidget *gnome_cmd_chmod_component_new (GnomeVFSFilePermissions perms);
 
 GtkType gnome_cmd_chmod_component_get_type ();
 
-GnomeVFSFilePermissions gnome_cmd_chmod_component_get_perms (GnomeCmdChmodComponent *component);
-void gnome_cmd_chmod_component_set_perms (GnomeCmdChmodComponent *component, GnomeVFSFilePermissions perms);
+guint32 gnome_cmd_chmod_component_get_perms (GnomeCmdChmodComponent *component);
+void gnome_cmd_chmod_component_set_perms (GnomeCmdChmodComponent *component, guint32 permissions);
diff --git a/src/gnome-cmd-dir.cc b/src/gnome-cmd-dir.cc
index f34f1fdb..53fbaa42 100644
--- a/src/gnome-cmd-dir.cc
+++ b/src/gnome-cmd-dir.cc
@@ -499,7 +499,12 @@ static GList *create_gnome_cmd_file_list_from_gfileinfo_list (GnomeCmdDir *dir,
 
     for (GList *i = info_list; i; i = i->next)
     {
-        GFileInfo *gFileInfo = (GFileInfo *) i->data;
+        auto gFileInfo = (GFileInfo *) i->data;
+
+        if (gFileInfo == nullptr || !G_IS_FILE_INFO (gFileInfo))
+        {
+            continue;
+        }
 
         auto basename = g_file_info_get_attribute_string (gFileInfo, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME);
         if (strcmp (basename, ".") == 0 || strcmp (basename, "..") == 0)
@@ -533,6 +538,7 @@ static void on_list_done (GnomeCmdDir *dir, GList *infolist, GError *error)
         dir->priv->files = create_gnome_cmd_file_list_from_gfileinfo_list (dir, infolist);
         dir->priv->file_collection->add(dir->priv->files);
         g_list_free (infolist);
+        infolist = nullptr;
 
         if (dir->dialog)
         {
@@ -839,7 +845,7 @@ void gnome_cmd_dir_file_deleted (GnomeCmdDir *dir, const gchar *uri_str)
 }
 
 
-// A file has been changed. Find the corresponding GnomeCmdFile, update its GnomeVFSFileInfo
+// A file has been changed. Find the corresponding GnomeCmdFile, update its GFileInfo
 void gnome_cmd_dir_file_changed (GnomeCmdDir *dir, const gchar *uri_str)
 {
     g_return_if_fail (GNOME_CMD_IS_DIR (dir));
@@ -849,18 +855,18 @@ void gnome_cmd_dir_file_changed (GnomeCmdDir *dir, const gchar *uri_str)
 
     g_return_if_fail (GNOME_CMD_IS_FILE (f));
 
-    GnomeVFSURI *uri = f->get_uri();
-    GnomeVFSFileInfo *info = gnome_vfs_file_info_new ();
-    GnomeVFSResult res = gnome_vfs_get_file_info_uri (uri, info, GNOME_VFS_FILE_INFO_GET_MIME_TYPE);
-    if (res != GNOME_VFS_OK)
+    dir->priv->needs_mtime_update = TRUE;
+
+    auto gFileInfo = g_file_query_info(f->gFile, "*", G_FILE_QUERY_INFO_NONE, nullptr, nullptr);
+    if (gFileInfo == nullptr)
     {
-        DEBUG ('t', "Could not retrieve file information for changed file %s\n", uri_str);
+        auto basename = g_file_get_basename(f->gFile);
+        DEBUG ('t', "Could not retrieve file information for changed file %s\n", 
g_file_get_basename(f->gFile));
+        g_free(basename);
+        return;
     }
-    gnome_vfs_uri_unref (uri);
-
-    dir->priv->needs_mtime_update = TRUE;
 
-    f->update_info(info);
+    f->update_gFileInfo(gFileInfo);
     f->invalidate_metadata();
     g_signal_emit (dir, signals[FILE_CHANGED], 0, f);
 }
diff --git a/src/gnome-cmd-file-list.cc b/src/gnome-cmd-file-list.cc
index 71c25059..fb097a5c 100644
--- a/src/gnome-cmd-file-list.cc
+++ b/src/gnome-cmd-file-list.cc
@@ -1275,12 +1275,12 @@ static void mime_exec_single (GnomeCmdFile *f)
                                           -1, _("Cancel"), _("OK"), nullptr);
             g_free (msg);
 
-            if (ret != 1)  return;  else
+            if (ret != 1)
             {
-                GnomeVFSResult result = f->chmod((GnomeVFSFilePermissions) 
(f->info->permissions|GNOME_CMD_PERM_USER_EXEC));
-                if (result != GNOME_VFS_OK)
-                    return;
+                return;
             }
+
+            f->chmod(GetGfileAttributeUInt32(f->gFile, G_FILE_ATTRIBUTE_UNIX_MODE) | 
GNOME_CMD_PERM_USER_EXEC);
         }
     }
 
diff --git a/src/gnome-cmd-file.cc b/src/gnome-cmd-file.cc
index d9ef371f..b5ad43a7 100644
--- a/src/gnome-cmd-file.cc
+++ b/src/gnome-cmd-file.cc
@@ -344,14 +344,39 @@ void GnomeCmdFile::unref()
 }
 
 
-GnomeVFSResult GnomeCmdFile::chmod(GnomeVFSFilePermissions perm)
+void GnomeCmdFile::chmod(guint32 permissions)
 {
-    g_return_val_if_fail (info != nullptr, GNOME_VFS_ERROR_CORRUPTED_DATA);
+    GError *error;
+    error = nullptr;
 
-    info->permissions = perm;
-    GnomeVFSURI *uri = get_uri();
-    GnomeVFSResult ret = gnome_vfs_set_file_info_uri (uri, info, GNOME_VFS_SET_FILE_INFO_PERMISSIONS);
-    gnome_vfs_uri_unref (uri);
+    auto gFileInfoPerms = g_file_query_info(gFile,
+                                            G_FILE_ATTRIBUTE_UNIX_MODE,
+                                            G_FILE_QUERY_INFO_NONE,
+                                            nullptr,
+                                            &error);
+    if (error)
+    {
+        g_message ("chmod: retrieving file info failed: %s", error->message);
+        g_error_free (error);
+        return;
+    }
+
+    g_file_info_set_attribute_uint32(gFileInfoPerms,
+                                     G_FILE_ATTRIBUTE_UNIX_MODE,
+                                     permissions);
+
+    g_file_set_attributes_from_info(gFile,
+                                    gFileInfoPerms,
+                                    G_FILE_QUERY_INFO_NONE,
+                                    nullptr,
+                                    &error);
+    if (error)
+    {
+        g_message ("chmod: setting file mode failed: %s", error->message);
+        g_object_unref(gFileInfoPerms);
+        g_error_free (error);
+        return;
+    }
 
     if (has_parent_dir (this))
     {
@@ -360,8 +385,7 @@ GnomeVFSResult GnomeCmdFile::chmod(GnomeVFSFilePermissions perm)
         gnome_cmd_dir_file_changed (dir, uri_str);
         g_free (uri_str);
     }
-
-    return ret;
+    g_object_unref(gFileInfoPerms);
 }
 
 
diff --git a/src/gnome-cmd-file.h b/src/gnome-cmd-file.h
index 42769612..3978ce61 100644
--- a/src/gnome-cmd-file.h
+++ b/src/gnome-cmd-file.h
@@ -90,7 +90,7 @@ struct GnomeCmdFile
     const gchar *get_type_string();
     gboolean get_type_pixmap_and_mask(GdkPixmap **pixmap, GdkBitmap **mask);
 
-    GnomeVFSResult chmod(GnomeVFSFilePermissions perm);
+    void chmod(guint32 permissions);
     GnomeVFSResult chown(uid_t uid, gid_t gid);
     GnomeVFSResult rename(const gchar *new_name);
 


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