summaryrefslogtreecommitdiff
path: root/libnautilus-extensions/nautilus-mime-actions.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnautilus-extensions/nautilus-mime-actions.c')
-rw-r--r--libnautilus-extensions/nautilus-mime-actions.c268
1 files changed, 170 insertions, 98 deletions
diff --git a/libnautilus-extensions/nautilus-mime-actions.c b/libnautilus-extensions/nautilus-mime-actions.c
index 375c5e0e1..94f24fb47 100644
--- a/libnautilus-extensions/nautilus-mime-actions.c
+++ b/libnautilus-extensions/nautilus-mime-actions.c
@@ -70,7 +70,8 @@ static gboolean server_matches_content_requirements (OAF_ServerInfo
GList *explicit_iids);
static GList *nautilus_do_component_query (const char *mime_type,
const char *uri_scheme,
- GList *files,
+ GList *content_mime_types,
+ gboolean ignore_content_mime_types,
GList *explicit_iids,
char **extra_sort_criteria,
char *extra_requirements,
@@ -98,40 +99,64 @@ is_known_mime_type (const char *mime_type)
static gboolean
-nautilus_mime_actions_check_if_required_attributes_ready (NautilusFile *file)
+nautilus_mime_actions_check_if_minimum_attributes_ready (NautilusFile *file)
{
GList *attributes;
gboolean ready;
- attributes = nautilus_mime_actions_get_required_file_attributes ();
+ attributes = nautilus_mime_actions_get_minimum_file_attributes ();
ready = nautilus_file_check_if_ready (file, attributes);
g_list_free (attributes);
return ready;
}
+static gboolean
+nautilus_mime_actions_check_if_full_attributes_ready (NautilusFile *file)
+{
+ GList *attributes;
+ gboolean ready;
+
+ attributes = nautilus_mime_actions_get_full_file_attributes ();
+ ready = nautilus_file_check_if_ready (file, attributes);
+ g_list_free (attributes);
+
+ return ready;
+}
GList *
-nautilus_mime_actions_get_required_file_attributes ()
+nautilus_mime_actions_get_minimum_file_attributes ()
{
GList *attributes;
attributes = NULL;
attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_METADATA);
attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_MIME_TYPE);
+
+ return attributes;
+}
+
+
+GList *
+nautilus_mime_actions_get_full_file_attributes ()
+{
+ GList *attributes;
+
+ attributes = nautilus_mime_actions_get_minimum_file_attributes ();
attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES);
return attributes;
}
+
void
-nautilus_mime_actions_wait_for_required_file_attributes (NautilusFile *file)
+nautilus_mime_actions_wait_for_full_file_attributes (NautilusFile *file)
{
GList *attributes;
- attributes = nautilus_mime_actions_get_required_file_attributes ();
+ attributes = nautilus_mime_actions_get_full_file_attributes ();
nautilus_file_wait_until_ready (file, attributes);
@@ -146,7 +171,7 @@ nautilus_mime_get_default_action_type_for_file (NautilusFile *file)
char *action_type_string;
GnomeVFSMimeActionType action_type;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
GNOME_VFS_MIME_ACTION_TYPE_NONE);
action_type_string = nautilus_file_get_metadata
@@ -173,7 +198,7 @@ nautilus_mime_get_default_action_for_file (NautilusFile *file)
{
GnomeVFSMimeAction *action;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
NULL);
action = g_new0 (GnomeVFSMimeAction, 1);
@@ -209,15 +234,15 @@ nautilus_mime_get_default_action_for_file (NautilusFile *file)
static GnomeVFSMimeApplication *
-nautilus_mime_get_default_application_for_file_internal (NautilusFile *file,
- gboolean *user_chosen)
+nautilus_mime_get_default_application_for_file_internal (NautilusFile *file,
+ gboolean *user_chosen)
{
char *mime_type;
GnomeVFSMimeApplication *result;
char *default_application_string;
gboolean used_user_chosen_info;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
NULL);
used_user_chosen_info = TRUE;
@@ -225,6 +250,8 @@ nautilus_mime_get_default_application_for_file_internal (NautilusFile *file
default_application_string = nautilus_file_get_metadata
(file, NAUTILUS_METADATA_KEY_DEFAULT_APPLICATION, NULL);
+ /* FIXME: should fall back to normal default if user-specified default is bogus */
+
if (default_application_string == NULL) {
mime_type = nautilus_file_get_mime_type (file);
result = gnome_vfs_mime_get_default_application (mime_type);
@@ -242,13 +269,13 @@ nautilus_mime_get_default_application_for_file_internal (NautilusFile *file
}
GnomeVFSMimeApplication *
-nautilus_mime_get_default_application_for_file (NautilusFile *file)
+nautilus_mime_get_default_application_for_file (NautilusFile *file)
{
return nautilus_mime_get_default_application_for_file_internal (file, NULL);
}
gboolean
-nautilus_mime_is_default_application_for_file_user_chosen (NautilusFile *file)
+nautilus_mime_is_default_application_for_file_user_chosen (NautilusFile *file)
{
GnomeVFSMimeApplication *application;
gboolean user_chosen;
@@ -268,60 +295,19 @@ nautilus_mime_is_default_application_for_file_user_chosen (NautilusFile *fi
}
-static OAF_ServerInfo *
-nautilus_mime_get_default_component_for_file_internal (NautilusFile *file,
- gboolean *user_chosen)
+static char **
+nautilus_mime_get_default_component_sort_conditions (NautilusFile *file, char *default_component_string)
{
- GList *info_list;
- OAF_ServerInfo *mime_default;
- char *default_component_string;
- char *mime_type;
- char *uri_scheme;
- GList *item_mime_types;
- GList *explicit_iids;
- CORBA_Environment ev;
- OAF_ServerInfo *server;
- char *sort_conditions[5];
+ char **sort_conditions;
char *supertype;
- gboolean used_user_chosen_info;
+ char *mime_type;
GList *short_list;
GList *p;
char *prev;
-
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
- NULL);
-
- used_user_chosen_info = TRUE;
-
- CORBA_exception_init (&ev);
-
- mime_type = nautilus_file_get_mime_type (file);
-
- uri_scheme = nautilus_file_get_uri_scheme (file);
-
- explicit_iids = get_explicit_content_view_iids_from_metafile (file);
- nautilus_file_get_directory_item_mime_types (file, &item_mime_types);
-
- default_component_string = nautilus_file_get_metadata
- (file, NAUTILUS_METADATA_KEY_DEFAULT_COMPONENT, NULL);
-
- if (default_component_string == NULL && is_known_mime_type (mime_type)) {
- mime_default = gnome_vfs_mime_get_default_component (mime_type);
- if (mime_default != NULL) {
- default_component_string = g_strdup (mime_default->iid);
- if (default_component_string != NULL) {
- /* Default component chosen based only on type. */
- used_user_chosen_info = FALSE;
- }
- CORBA_free (mime_default);
- }
- }
- /* FIXME bugzilla.eazel.com 1264:
- * should return NULL for the following cases:
- * - Known URI scheme pointing to nonexistent location
- * - Syntactically invalid URI
- */
+ sort_conditions = g_new0 (char *, 5);
+
+ mime_type = nautilus_file_get_mime_type (file);
supertype = mime_type_get_supertype (mime_type);
@@ -373,9 +359,96 @@ nautilus_mime_get_default_component_for_file_internal (NautilusFile *file,
}
sort_conditions[4] = NULL;
+
+ g_free (mime_type);
+ g_free (supertype);
+
+ return sort_conditions;
+}
+
+
+
+static OAF_ServerInfo *
+nautilus_mime_get_default_component_for_file_internal (NautilusFile *file,
+ gboolean *user_chosen)
+{
+ GList *info_list;
+ OAF_ServerInfo *mime_default;
+ char *default_component_string;
+ char *mime_type;
+ char *uri_scheme;
+ GList *item_mime_types;
+ GList *explicit_iids;
+ CORBA_Environment ev;
+ OAF_ServerInfo *server;
+ char **sort_conditions;
+ char *extra_requirements;
+ gboolean used_user_chosen_info;
+ gboolean metadata_default;
+
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
+ NULL);
+
+ used_user_chosen_info = TRUE;
+
+ info_list = NULL;
+
+ CORBA_exception_init (&ev);
+
+ mime_type = nautilus_file_get_mime_type (file);
+
+ uri_scheme = nautilus_file_get_uri_scheme (file);
+
+ explicit_iids = get_explicit_content_view_iids_from_metafile (file);
+
+ if (!nautilus_mime_actions_check_if_full_attributes_ready (file) ||
+ !nautilus_file_get_directory_item_mime_types (file, &item_mime_types)) {
+ item_mime_types = NULL;
+ }
+
+ default_component_string = nautilus_file_get_metadata
+ (file, NAUTILUS_METADATA_KEY_DEFAULT_COMPONENT, NULL);
+
+ if (default_component_string == NULL) {
+ metadata_default = FALSE;
+
+ if (is_known_mime_type (mime_type)) {
+ mime_default = gnome_vfs_mime_get_default_component (mime_type);
+ if (mime_default != NULL) {
+ default_component_string = g_strdup (mime_default->iid);
+ if (default_component_string != NULL) {
+ /* Default component chosen based only on type. */
+ used_user_chosen_info = FALSE;
+ }
+ CORBA_free (mime_default);
+ }
+ }
+ } else {
+ metadata_default = TRUE;
+ }
- info_list = nautilus_do_component_query (mime_type, uri_scheme, item_mime_types, explicit_iids,
- sort_conditions, NULL, &ev);
+ /* FIXME bugzilla.eazel.com 1264:
+ * should return NULL for the following cases:
+ * - Known URI scheme pointing to nonexistent location
+ * - Syntactically invalid URI
+ */
+
+ sort_conditions = nautilus_mime_get_default_component_sort_conditions (file, default_component_string);
+
+ /* If the default is specified in the per-uri metadata,
+ respect the setting regardless of content type requirements */
+ if (metadata_default) {
+ extra_requirements = g_strconcat ("iid == '", default_component_string, "'", NULL);
+
+ info_list = nautilus_do_component_query (mime_type, uri_scheme, item_mime_types, TRUE,
+ explicit_iids, sort_conditions, extra_requirements, &ev);
+ g_free (extra_requirements);
+ }
+
+ if (info_list == NULL) {
+ info_list = nautilus_do_component_query (mime_type, uri_scheme, item_mime_types, FALSE,
+ explicit_iids, sort_conditions, NULL, &ev);
+ }
if (ev._major == CORBA_NO_EXCEPTION && info_list != NULL) {
server = OAF_ServerInfo_duplicate (info_list->data);
@@ -390,11 +463,8 @@ nautilus_mime_get_default_component_for_file_internal (NautilusFile *file,
return NULL;
}
- g_free (sort_conditions[0]);
- g_free (sort_conditions[1]);
- g_free (sort_conditions[2]);
- g_free (sort_conditions[3]);
- g_free (supertype);
+ g_strfreev (sort_conditions);
+
g_free (uri_scheme);
g_free (mime_type);
g_free (default_component_string);
@@ -448,7 +518,7 @@ nautilus_mime_get_short_list_applications_for_file (NautilusFile *file)
GnomeVFSMimeApplication *application;
CORBA_Environment ev;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
NULL);
CORBA_exception_init (&ev);
@@ -510,7 +580,7 @@ nautilus_mime_get_short_list_components_for_file (NautilusFile *file)
char *extra_requirements;
char *prev;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
NULL);
CORBA_exception_init (&ev);
@@ -518,7 +588,11 @@ nautilus_mime_get_short_list_components_for_file (NautilusFile *file)
uri_scheme = nautilus_file_get_uri_scheme (file);
explicit_iids = get_explicit_content_view_iids_from_metafile (file);
- nautilus_file_get_directory_item_mime_types (file, &item_mime_types);
+
+ if (!nautilus_mime_actions_check_if_full_attributes_ready (file) ||
+ !nautilus_file_get_directory_item_mime_types (file, &item_mime_types)) {
+ item_mime_types = NULL;
+ }
metadata_component_add_ids = nautilus_file_get_metadata_list
(file,
@@ -574,7 +648,8 @@ nautilus_mime_get_short_list_components_for_file (NautilusFile *file)
}
- result = nautilus_do_component_query (mime_type, uri_scheme, item_mime_types, explicit_iids, NULL, extra_requirements, &ev);
+ result = nautilus_do_component_query (mime_type, uri_scheme, item_mime_types, FALSE,
+ explicit_iids, NULL, extra_requirements, &ev);
g_free (extra_requirements);
}
@@ -594,7 +669,7 @@ nautilus_mime_get_short_list_methods_for_file (NautilusFile *file)
char *mime_type;
const char *method;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
NULL);
mime_type = nautilus_file_get_mime_type (file);
@@ -612,7 +687,7 @@ nautilus_mime_get_all_applications_for_file (NautilusFile *file)
GList *p;
GnomeVFSMimeApplication *application;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
NULL);
metadata_application_ids = nautilus_file_get_metadata_list
@@ -663,7 +738,7 @@ nautilus_mime_get_all_components_for_file (NautilusFile *file)
GList *explicit_iids;
CORBA_Environment ev;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
NULL);
CORBA_exception_init (&ev);
@@ -672,9 +747,14 @@ nautilus_mime_get_all_components_for_file (NautilusFile *file)
mime_type = nautilus_file_get_mime_type (file);
explicit_iids = get_explicit_content_view_iids_from_metafile (file);
- nautilus_file_get_directory_item_mime_types (file, &item_mime_types);
- info_list = nautilus_do_component_query (mime_type, uri_scheme, item_mime_types, explicit_iids, NULL, NULL, &ev);
+ if (!nautilus_mime_actions_check_if_full_attributes_ready (file) ||
+ !nautilus_file_get_directory_item_mime_types (file, &item_mime_types)) {
+ item_mime_types = NULL;
+ }
+
+ info_list = nautilus_do_component_query (mime_type, uri_scheme, item_mime_types, FALSE,
+ explicit_iids, NULL, NULL, &ev);
g_free (uri_scheme);
g_free (mime_type);
@@ -724,7 +804,7 @@ GnomeVFSResult
nautilus_mime_set_default_application_for_file (NautilusFile *file,
const char *application_id)
{
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
GNOME_VFS_ERROR_GENERIC);
nautilus_file_set_metadata
@@ -743,7 +823,7 @@ GnomeVFSResult
nautilus_mime_set_default_component_for_file (NautilusFile *file,
const char *component_iid)
{
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
GNOME_VFS_ERROR_GENERIC);
nautilus_file_set_metadata
@@ -769,7 +849,7 @@ nautilus_mime_set_short_list_applications_for_file (NautilusFile *file,
GList *p;
char *mime_type;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
GNOME_VFS_ERROR_GENERIC);
/* get per-mime short list */
@@ -817,7 +897,7 @@ nautilus_mime_set_short_list_components_for_file (NautilusFile *file,
GList *p;
char *mime_type;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
GNOME_VFS_ERROR_GENERIC);
/* get per-mime short list */
@@ -860,7 +940,7 @@ nautilus_mime_add_application_to_short_list_for_file (NautilusFile *file,
GList *old_list, *new_list;
GnomeVFSResult result;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
GNOME_VFS_ERROR_GENERIC);
result = GNOME_VFS_OK;
@@ -887,7 +967,7 @@ nautilus_mime_remove_application_from_short_list_for_file (NautilusFile *fi
gboolean was_in_list;
GnomeVFSResult result;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
GNOME_VFS_ERROR_GENERIC);
old_list = nautilus_mime_get_short_list_applications_for_file (file);
@@ -914,7 +994,7 @@ nautilus_mime_add_component_to_short_list_for_file (NautilusFile *file,
GList *old_list, *new_list;
GnomeVFSResult result;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
GNOME_VFS_ERROR_GENERIC);
old_list = nautilus_mime_get_short_list_components_for_file (file);
@@ -941,7 +1021,7 @@ nautilus_mime_remove_component_from_short_list_for_file (NautilusFile *file,
gboolean was_in_list;
GnomeVFSResult result;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
GNOME_VFS_ERROR_GENERIC);
old_list = nautilus_mime_get_short_list_components_for_file (file);
@@ -969,7 +1049,7 @@ nautilus_mime_extend_all_applications_for_file (NautilusFile *file,
GList *extras;
GList *final_applications;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
GNOME_VFS_ERROR_GENERIC);
metadata_application_ids = nautilus_file_get_metadata_list
@@ -997,7 +1077,7 @@ nautilus_mime_remove_from_all_applications_for_file (NautilusFile *file,
GList *metadata_application_ids;
GList *final_applications;
- g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file),
+ g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file),
GNOME_VFS_ERROR_GENERIC);
metadata_application_ids = nautilus_file_get_metadata_list
@@ -1390,22 +1470,13 @@ static char *nautilus_sort_criteria[] = {
"name",
NULL};
-#if 0
- /* Prefer the industrial strengthe html viewer most */
- "iid == 'OAFIID:nautilus_mozilla_content_view:1ee70717-57bf-4079-aae5-922abdd576b1'",
- /* Prefer the gtkhtml viewer next */
- "iid == 'OAFIID:ntl_web_browser:0ce1a736-c939-4ac7-b12c-19d72bf1510b'",
- /* Prefer the icon view next */
- "iid == 'OAFIID:ntl_file_manager_icon_view:42681b21-d5ca-4837-87d2-394d88ecc058'",
-#endif;
-
-
static GList *
nautilus_do_component_query (const char *mime_type,
const char *uri_scheme,
GList *item_mime_types,
+ gboolean ignore_content_mime_types,
GList *explicit_iids,
char **extra_sort_criteria,
char *extra_requirements,
@@ -1449,7 +1520,8 @@ nautilus_do_component_query (const char *mime_type,
server = &oaf_result->_buffer[i];
- if (server_matches_content_requirements (server, content_types, explicit_iids)) {
+ if (ignore_content_mime_types ||
+ server_matches_content_requirements (server, content_types, explicit_iids)) {
retval = g_list_append
(retval,
OAF_ServerInfo_duplicate (server));