summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Jon McCann <jmccann@redhat.com>2012-08-07 13:43:42 -0400
committerWilliam Jon McCann <jmccann@redhat.com>2012-08-07 15:53:37 -0400
commit47f4319f39c9f76a62d778212d9b916004f3670b (patch)
tree6c829d18f5c9133d8238d2a089c8ce013621a76d
parent5584ec42bd0e3f22473a76a0c602d03144f8ce95 (diff)
downloadnautilus-47f4319f39c9f76a62d778212d9b916004f3670b.tar.gz
Improve error handling of directory loading
-rw-r--r--src/nautilus-connect-server-dialog-nonmain.c4
-rw-r--r--src/nautilus-window-manage-views.c71
-rw-r--r--src/nautilus-window-slot.c8
-rw-r--r--src/nautilus-window-types.h6
4 files changed, 57 insertions, 32 deletions
diff --git a/src/nautilus-connect-server-dialog-nonmain.c b/src/nautilus-connect-server-dialog-nonmain.c
index 4d0a8ed97..74430b36c 100644
--- a/src/nautilus-connect-server-dialog-nonmain.c
+++ b/src/nautilus-connect-server-dialog-nonmain.c
@@ -33,7 +33,7 @@
static GSimpleAsyncResult *display_location_res = NULL;
-static void
+static gboolean
window_go_to_cb (NautilusWindow *window,
GError *error,
gpointer user_data)
@@ -46,6 +46,8 @@ window_go_to_cb (NautilusWindow *window,
g_object_unref (display_location_res);
display_location_res = NULL;
+
+ return TRUE;
}
gboolean
diff --git a/src/nautilus-window-manage-views.c b/src/nautilus-window-manage-views.c
index f8fa1148d..8e24b1ad7 100644
--- a/src/nautilus-window-manage-views.c
+++ b/src/nautilus-window-manage-views.c
@@ -87,8 +87,9 @@ static void end_location_change (NautilusWindowSlot
static void cancel_location_change (NautilusWindowSlot *slot);
static void got_file_info_for_view_selection_callback (NautilusFile *file,
gpointer callback_data);
-static void create_content_view (NautilusWindowSlot *slot,
- const char *view_id);
+static gboolean create_content_view (NautilusWindowSlot *slot,
+ const char *view_id,
+ GError **error);
static void display_view_selection_failure (NautilusWindow *window,
NautilusFile *file,
GFile *location,
@@ -555,12 +556,13 @@ report_callback (NautilusWindowSlot *slot,
GError *error)
{
if (slot->open_callback != NULL) {
- slot->open_callback (nautilus_window_slot_get_window (slot),
- error, slot->open_callback_user_data);
+ gboolean res;
+ res = slot->open_callback (nautilus_window_slot_get_window (slot),
+ error, slot->open_callback_user_data);
slot->open_callback = NULL;
slot->open_callback_user_data = NULL;
- return TRUE;
+ return res;
}
return FALSE;
@@ -751,7 +753,7 @@ static void
got_file_info_for_view_selection_callback (NautilusFile *file,
gpointer callback_data)
{
- GError *error;
+ GError *error = NULL;
char *view_id;
char *mimetype;
NautilusWindow *window;
@@ -769,9 +771,9 @@ got_file_info_for_view_selection_callback (NautilusFile *file,
slot->determine_view_file = NULL;
if (slot->mount_error) {
- error = slot->mount_error;
- } else {
- error = nautilus_file_get_file_info_error (file);
+ error = g_error_copy (slot->mount_error);
+ } else if (nautilus_file_get_file_info_error (file) != NULL) {
+ error = g_error_copy (nautilus_file_get_file_info_error (file));
}
if (error && error->domain == G_IO_ERROR && error->code == G_IO_ERROR_NOT_MOUNTED &&
@@ -790,9 +792,7 @@ got_file_info_for_view_selection_callback (NautilusFile *file,
g_object_unref (location);
g_object_unref (mount_op);
- nautilus_file_unref (file);
-
- return;
+ goto done;
}
parent_file = nautilus_file_get_parent (file);
@@ -816,9 +816,7 @@ got_file_info_for_view_selection_callback (NautilusFile *file,
got_file_info_for_view_selection_callback,
slot);
- nautilus_file_unref (file);
-
- return;
+ goto done;
}
nautilus_file_unref (parent_file);
@@ -862,11 +860,18 @@ got_file_info_for_view_selection_callback (NautilusFile *file,
}
if (view_id != NULL) {
- create_content_view (slot, view_id);
+ GError *err = NULL;
+
+ create_content_view (slot, view_id, &err);
g_free (view_id);
- report_callback (slot, NULL);
+ report_callback (slot, err);
+ g_clear_error (&err);
} else {
+ if (error == NULL) {
+ error = g_error_new (G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
+ _("Unable to load location"));
+ }
if (!report_callback (slot, error)) {
display_view_selection_failure (window, file,
location, error);
@@ -932,7 +937,10 @@ got_file_info_for_view_selection_callback (NautilusFile *file,
}
}
}
-
+
+ done:
+ g_clear_error (&error);
+
nautilus_file_unref (file);
}
@@ -943,13 +951,16 @@ got_file_info_for_view_selection_callback (NautilusFile *file,
* pending_location/selection will be used. If not, we're just switching
* view, and the current location will be used.
*/
-static void
+static gboolean
create_content_view (NautilusWindowSlot *slot,
- const char *view_id)
+ const char *view_id,
+ GError **error_out)
{
NautilusWindow *window;
NautilusView *view;
GList *selection;
+ gboolean ret = TRUE;
+ GError *error = NULL;
window = nautilus_window_slot_get_window (slot);
@@ -1000,11 +1011,18 @@ create_content_view (NautilusWindowSlot *slot,
TRUE);
g_list_free_full (selection, g_object_unref);
} else {
- /* Something is busted, there was no location to load.
- Just load the homedir. */
- nautilus_window_slot_go_home (slot, FALSE);
-
+ /* Something is busted, there was no location to load. */
+ ret = FALSE;
+ error = g_error_new (G_IO_ERROR,
+ G_IO_ERROR_NOT_FOUND,
+ _("Unable to load location"));
}
+
+ if (error != NULL) {
+ g_propagate_error (error_out, error);
+ }
+
+ return ret;
}
static void
@@ -1720,7 +1738,10 @@ nautilus_window_slot_set_content_view (NautilusWindowSlot *slot,
}
slot->location_change_type = NAUTILUS_LOCATION_CHANGE_RELOAD;
- create_content_view (slot, id);
+ if (!create_content_view (slot, id, NULL)) {
+ /* Just load the homedir. */
+ nautilus_window_slot_go_home (slot, FALSE);
+ }
}
void
diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c
index 5a38c6b01..f054e3e89 100644
--- a/src/nautilus-window-slot.c
+++ b/src/nautilus-window-slot.c
@@ -96,14 +96,16 @@ sync_search_directory (NautilusWindowSlot *slot)
nautilus_directory_unref (directory);
}
-static void
+static gboolean
sync_search_location_cb (NautilusWindow *window,
GError *error,
gpointer user_data)
{
NautilusWindowSlot *slot = user_data;
-
- sync_search_directory (slot);
+ if (error == NULL) {
+ sync_search_directory (slot);
+ }
+ return (error == NULL);
}
static void
diff --git a/src/nautilus-window-types.h b/src/nautilus-window-types.h
index e918588b5..f202f9761 100644
--- a/src/nautilus-window-types.h
+++ b/src/nautilus-window-types.h
@@ -36,9 +36,9 @@ typedef struct NautilusWindow NautilusWindow;
typedef struct NautilusWindowSlot NautilusWindowSlot;
typedef struct NautilusWindowSlotClass NautilusWindowSlotClass;
-typedef void (* NautilusWindowGoToCallback) (NautilusWindow *window,
- GError *error,
- gpointer user_data);
+typedef gboolean (* NautilusWindowGoToCallback) (NautilusWindow *window,
+ GError *error,
+ gpointer user_data);
typedef enum {
NAUTILUS_WINDOW_OPEN_FLAG_CLOSE_BEHIND = 1<<0,