[gnome-commander] Add function for setup a GnomeCmdFile instance with a GFile object.



commit 0715b127b3f8239d6be5937b32e89507ca7855a3
Author: Uwe Scholz <u scholz83 gmx de>
Date:   Wed Jan 5 15:24:15 2022 +0100

    Add function for setup a GnomeCmdFile instance with a GFile object.
    
    This function is then used for setting up a GnomeCmdDir object.

 src/gnome-cmd-dir.cc  | 38 +++++++++++++++++---------------------
 src/gnome-cmd-file.cc | 34 ++++++++++++++++++++++++++++++++++
 src/gnome-cmd-file.h  |  2 +-
 3 files changed, 52 insertions(+), 22 deletions(-)
---
diff --git a/src/gnome-cmd-dir.cc b/src/gnome-cmd-dir.cc
index efa303c4..d5fc314d 100644
--- a/src/gnome-cmd-dir.cc
+++ b/src/gnome-cmd-dir.cc
@@ -337,43 +337,39 @@ GnomeCmdDir *gnome_cmd_dir_new (GnomeCmdCon *con, GnomeCmdPath *path, gboolean i
     GError *error = nullptr;
 
     auto gFile = gnome_cmd_con_create_gfile (con, path);
-    if (!gFile) return nullptr;
+    if (!gFile)
+    {
+        return nullptr;
+    }
 
     auto uriString = g_file_get_uri (gFile);
-    g_object_unref (gFile);
 
-    GnomeCmdDir *dir = gnome_cmd_con_cache_lookup (con, uriString);
-    if (dir)
+    auto gnomeCmdDir = gnome_cmd_con_cache_lookup (con, uriString);
+    if (gnomeCmdDir) // GnomeCmdDir instance is set up already
     {
         g_free (uriString);
-        return dir;
+        g_object_unref (gFile);
+        return gnomeCmdDir;
     }
 
-    auto gFileTmp = g_file_new_for_path(path->get_path());
-    auto gFileInfo = g_file_query_info(gFileTmp, "*", G_FILE_QUERY_INFO_NONE, nullptr, &error);
-    g_object_unref(gFileTmp);
-
-    if (error)
+    gnomeCmdDir = static_cast<GnomeCmdDir*> (g_object_new (GNOME_CMD_TYPE_DIR, nullptr));
+    if (!gnome_cmd_file_setup (G_OBJECT (gnomeCmdDir), gFile, error))
     {
-        if (!isStartup)
+        if (error && !isStartup)
         {
             gnome_cmd_show_message (*main_win, path->get_display_path(), error->message);
             g_error_free(error);
         }
+        g_object_unref(gFile);
         g_free (uriString);
         return nullptr;
     }
+    gnome_cmd_dir_set_path (gnomeCmdDir, path);
+    gnomeCmdDir->priv->con = con;
+    gnomeCmdDir->priv->needs_mtime_update = FALSE;
+    gnome_cmd_con_add_to_cache (con, gnomeCmdDir, uriString);
 
-    dir = static_cast<GnomeCmdDir*> (g_object_new (GNOME_CMD_TYPE_DIR, nullptr));
-    gnome_cmd_dir_set_path (dir, path);
-    gnome_cmd_file_setup (G_OBJECT (dir), gFileInfo, nullptr);
-
-    dir->priv->con = con;
-    dir->priv->needs_mtime_update = FALSE;
-
-    gnome_cmd_con_add_to_cache (con, dir, uriString);
-
-    return dir;
+    return gnomeCmdDir;
 }
 
 
diff --git a/src/gnome-cmd-file.cc b/src/gnome-cmd-file.cc
index 19f9625f..d5f64f9e 100644
--- a/src/gnome-cmd-file.cc
+++ b/src/gnome-cmd-file.cc
@@ -210,6 +210,40 @@ void GnomeCmdFile::invalidate_metadata()
 }
 
 
+gboolean gnome_cmd_file_setup (GObject *gObject, GFile *gFile, GError *error)
+{
+    g_return_val_if_fail (gObject != nullptr, FALSE);
+    g_return_val_if_fail (GNOME_CMD_IS_FILE(gObject), FALSE);
+    g_return_val_if_fail (gFile != nullptr, FALSE);
+
+    GError *errorTmp = nullptr;
+    auto gnomeCmdFile = (GnomeCmdFile*) gObject;
+
+    gnomeCmdFile->gFileInfo = g_file_query_info(gFile, "*", G_FILE_QUERY_INFO_NONE, nullptr, &errorTmp);
+    if (errorTmp)
+    {
+        g_propagate_error(&error, errorTmp);
+        return FALSE;
+    }
+
+    auto filename = g_file_info_get_attribute_string (gnomeCmdFile->gFileInfo, 
G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME);
+
+    // check if file is '..'
+    gnomeCmdFile->is_dotdot = g_file_info_get_attribute_uint32 (gnomeCmdFile->gFileInfo, 
G_FILE_ATTRIBUTE_STANDARD_TYPE) == G_FILE_TYPE_DIRECTORY
+                              && g_strcmp0(filename, "..") == 0;
+
+    auto utf8Name = gnome_cmd_data.options.case_sens_sort
+        ? g_strdup(filename)
+        : g_utf8_casefold (filename, -1);
+    gnomeCmdFile->collate_key = g_utf8_collate_key_for_filename (utf8Name, -1);
+    g_free (utf8Name);
+
+    GNOME_CMD_FILE_BASE (gnomeCmdFile)->gFile = gFile;
+    gnomeCmdFile->gFile = GNOME_CMD_FILE_BASE (gnomeCmdFile)->gFile;
+    return TRUE;
+}
+
+
 void gnome_cmd_file_setup (GObject *gObject, GFileInfo *gFileInfo, GnomeCmdDir *parentDir)
 {
     g_return_if_fail (gObject != nullptr);
diff --git a/src/gnome-cmd-file.h b/src/gnome-cmd-file.h
index 627031a4..a349890d 100644
--- a/src/gnome-cmd-file.h
+++ b/src/gnome-cmd-file.h
@@ -131,7 +131,7 @@ GnomeCmdFile *gnome_cmd_file_new_from_gfile (GFile *gFile);
 GnomeCmdFile *gnome_cmd_file_new (const gchar *local_full_path);
 GnomeCmdFile *gnome_cmd_file_new (GFileInfo *gFileInfo, GnomeCmdDir *dir);
 void gnome_cmd_file_setup (GObject *gObject, GFileInfo *gFileInfo, GnomeCmdDir *dir);
-
+gboolean gnome_cmd_file_setup (GObject *gObject, GFile *gFile, GError *error);
 
 inline GnomeCmdFile *gnome_cmd_file_ref (GnomeCmdFile *f)
 {


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