[nautilus/wip/ernestask/attributes: 18/29] Add NautilusDirectory skeleton
- From: Ernestas Kulik <ernestask src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/wip/ernestask/attributes: 18/29] Add NautilusDirectory skeleton
- Date: Mon, 28 Aug 2017 09:01:53 +0000 (UTC)
commit fff0c7c51cbce452c4c19853c1dd80a2ee403606
Author: Ernestas Kulik <ernestask gnome org>
Date: Tue Jul 11 11:19:30 2017 +0300
Add NautilusDirectory skeleton
src-ng/main.c | 12 ++++--
src-ng/meson.build | 2 +
src-ng/nautilus-directory.c | 47 ++++++++++++++++++++++++
src-ng/nautilus-directory.h | 37 +++++++++++++++++++
src-ng/nautilus-file.c | 84 ++++++++++++++++++++++++++++++++----------
5 files changed, 158 insertions(+), 24 deletions(-)
---
diff --git a/src-ng/main.c b/src-ng/main.c
index 0a3ad0a..f5474bb 100644
--- a/src-ng/main.c
+++ b/src-ng/main.c
@@ -2,6 +2,7 @@
#include <glib.h>
+#include "nautilus-directory.h"
#include "nautilus-file.h"
#include "nautilus-task-manager.h"
@@ -11,8 +12,9 @@ got_info (NautilusFile *file,
GError *error,
gpointer user_data)
{
- g_message ("Got info for %p\n\tDisplay name: %s",
- (gpointer) file,
+ g_message ("Got info for %p",
+ (gpointer) file);
+ g_message ("\tDisplay name: %s\n",
g_file_info_get_display_name (info));
g_object_unref (info);
@@ -41,11 +43,13 @@ main (int argc,
g_message ("Creating NautilusFile");
file = nautilus_file_new (location);
- g_message ("Got %p\n", (gpointer) file);
+ g_message ("\tGot %p", (gpointer) file);
+ g_message ("\tFile is directory: %s\n",
+ NAUTILUS_IS_DIRECTORY (file)? "yes" : "no");
g_message ("Creating another NautilusFile for the same location");
duplicate_file = nautilus_file_new (location);
- g_message ("Got %p, which is %s\n",
+ g_message ("\tGot %p, which is %s\n",
(gpointer) duplicate_file,
file == duplicate_file? "the same" : "not the same");
diff --git a/src-ng/meson.build b/src-ng/meson.build
index dbda07e..8f1fec6 100644
--- a/src-ng/meson.build
+++ b/src-ng/meson.build
@@ -6,6 +6,8 @@ nautilus_ng_sources = ['nautilus-task.c',
'nautilus-file.h',
'tasks/nautilus-attribute-task.c',
'tasks/nautilus-attribute-task.h',
+ 'nautilus-directory.c',
+ 'nautilus-directory.h',
'main.c']
nautilus_ng_dependencies = [gio, glib]
diff --git a/src-ng/nautilus-directory.c b/src-ng/nautilus-directory.c
new file mode 100644
index 0000000..e509265
--- /dev/null
+++ b/src-ng/nautilus-directory.c
@@ -0,0 +1,47 @@
+/* Copyright (C) 2017 Ernestas Kulik <ernestask gnome org>
+ *
+ * This file is part of Nautilus.
+ *
+ * Nautilus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Nautilus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Nautilus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "nautilus-directory.h"
+
+G_DEFINE_TYPE (NautilusDirectory, nautilus_directory, NAUTILUS_TYPE_FILE)
+
+static void
+nautilus_directory_class_init (NautilusDirectoryClass *klass)
+{
+}
+
+static void
+nautilus_directory_init (NautilusDirectory *self)
+{
+}
+
+NautilusFile *
+nautilus_directory_new (GFile *location)
+{
+ gpointer instance;
+
+ g_return_val_if_fail (G_IS_FILE (location), NULL);
+
+ instance = g_object_new (NAUTILUS_TYPE_DIRECTORY,
+ "location", location,
+ NULL);
+
+ g_assert (NAUTILUS_IS_DIRECTORY (instance));
+
+ return instance;
+}
diff --git a/src-ng/nautilus-directory.h b/src-ng/nautilus-directory.h
new file mode 100644
index 0000000..8d44959
--- /dev/null
+++ b/src-ng/nautilus-directory.h
@@ -0,0 +1,37 @@
+/* Copyright (C) 2017 Ernestas Kulik <ernestask gnome org>
+ *
+ * This file is part of Nautilus.
+ *
+ * Nautilus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Nautilus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Nautilus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NAUTILUS_DIRECTORY_H_INCLUDED
+#define NAUTILUS_DIRECTORY_H_INCLUDED
+
+#include "nautilus-file.h"
+
+#define NAUTILUS_TYPE_DIRECTORY (nautilus_directory_get_type ())
+
+G_DECLARE_DERIVABLE_TYPE (NautilusDirectory, nautilus_directory,
+ NAUTILUS, DIRECTORY,
+ NautilusFile)
+
+struct _NautilusDirectoryClass
+{
+ NautilusFileClass parent_class;
+};
+
+NautilusFile *nautilus_directory_new (GFile *location);
+
+#endif
diff --git a/src-ng/nautilus-file.c b/src-ng/nautilus-file.c
index 3b8c552..65692a8 100644
--- a/src-ng/nautilus-file.c
+++ b/src-ng/nautilus-file.c
@@ -18,6 +18,7 @@
#include "nautilus-file.h"
+#include "nautilus-directory.h"
#include "nautilus-task-manager.h"
#include "tasks/nautilus-attribute-task.h"
@@ -50,6 +51,54 @@ static GParamSpec *properties[N_PROPERTIES] = { NULL };
static GHashTable *files = NULL;
static GMutex files_mutex;
+static GObject *
+constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
+{
+ GFile *location = NULL;
+ gpointer instance;
+
+ for (guint i = 0; i < n_construct_properties; i++)
+ {
+ if (construct_properties[i].pspec == properties[PROP_LOCATION])
+ {
+ location = g_value_get_object (construct_properties[i].value);
+ }
+ }
+
+ g_assert (location != NULL);
+
+ g_mutex_lock (&files_mutex);
+
+ if (files == NULL)
+ {
+ files = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal,
+ g_object_unref, NULL);
+ }
+
+
+ instance = g_hash_table_lookup (files, location);
+ if (instance != NULL)
+ {
+ instance = g_object_ref (instance);
+ }
+ else
+ {
+ GObjectClass *parent_class;
+
+ parent_class = G_OBJECT_CLASS (nautilus_file_parent_class);
+ instance = parent_class->constructor (type, n_construct_properties,
+ construct_properties);
+
+ g_assert (g_hash_table_insert (files, location, instance));
+ }
+
+ g_mutex_unlock (&files_mutex);
+
+ return instance;
+}
+
static void
set_property (GObject *object,
guint property_id,
@@ -98,6 +147,7 @@ nautilus_file_class_init (NautilusFileClass *klass)
object_class = G_OBJECT_CLASS (klass);
+ object_class->constructor = constructor;
object_class->set_property = set_property;
object_class->finalize = finalize;
@@ -211,32 +261,26 @@ nautilus_file_query_info (NautilusFile *file,
NautilusFile *
nautilus_file_new (GFile *location)
{
- NautilusFile *file;
+ GFileType file_type;
g_return_val_if_fail (G_IS_FILE (location), NULL);
- g_mutex_lock (&files_mutex);
-
- if (files == NULL)
- {
- files = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal,
- g_object_unref, NULL);
- }
-
-
- file = g_hash_table_lookup (files, location);
- if (file != NULL)
+ /* TODO: extension points? */
+ file_type = g_file_query_file_type (location, G_FILE_QUERY_INFO_NONE,
+ NULL);
+ /* File does not exist.
+ * Search directory URIs also fall under this category.
+ * TODO: creation?
+ */
+ if (file_type == G_FILE_TYPE_UNKNOWN)
{
- file = g_object_ref (file);
+ return NULL;
}
- else
+ else if (file_type == G_FILE_TYPE_DIRECTORY)
{
- file = g_object_new (NAUTILUS_TYPE_FILE, "location", location, NULL);
-
- g_assert (g_hash_table_insert (files, location, file));
+ /* Asserts that the constructed file is a directory. */
+ return nautilus_directory_new (location);
}
- g_mutex_unlock (&files_mutex);
-
- return file;
+ return g_object_new (NAUTILUS_TYPE_FILE, "location", location, NULL);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]