Blame src/nautilus-sendto.c

Packit bedeea
/*
Packit bedeea
 * Copyright (C) 2004 Roberto Majadas
Packit bedeea
 * Copyright (C) 2005-2013 Bastien Nocera
Packit bedeea
 *
Packit bedeea
 * This program is free software; you can redistribute it and/or
Packit bedeea
 * modify it under the terms of the GNU General Public License as
Packit bedeea
 * published by the Free Software Foundation; either version 2 of the
Packit bedeea
 * License, or (at your option) any later version.
Packit bedeea
 *
Packit bedeea
 * This program is distributed in the hope that it will be useful,
Packit bedeea
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bedeea
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit bedeea
 * General Public License for more av.
Packit bedeea
 *
Packit bedeea
 * You should have received a copy of the GNU General Public
Packit bedeea
 * License along with this program; if not, write to the
Packit bedeea
 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit bedeea
 * Boston, MA 02110-1301  USA.
Packit bedeea
 *
Packit bedeea
 * Author:  Roberto Majadas <roberto.majadas@openshine.com>
Packit bedeea
 *          Bastien Nocera <hadess@hadess.net>
Packit bedeea
 */
Packit bedeea
Packit bedeea
#include "config.h"
Packit bedeea
#include <string.h>
Packit bedeea
#include <stdlib.h>
Packit bedeea
#include <glib/gi18n.h>
Packit bedeea
#include <locale.h>
Packit bedeea
#include <glib/gstdio.h>
Packit bedeea
#include <gio/gio.h>
Packit bedeea
Packit bedeea
/* Options */
Packit bedeea
static char **filenames = NULL;
Packit bedeea
static gboolean run_from_build_dir = FALSE;
Packit bedeea
static gint64 xid = 0;
Packit bedeea
static gboolean show_version = FALSE;
Packit bedeea
Packit bedeea
typedef enum {
Packit bedeea
	MAILER_UNKNOWN,
Packit bedeea
	MAILER_EVO,
Packit bedeea
	MAILER_BALSA,
Packit bedeea
	MAILER_SYLPHEED,
Packit bedeea
	MAILER_THUNDERBIRD,
Packit bedeea
} MailerType;
Packit bedeea
Packit bedeea
typedef struct {
Packit bedeea
	GList *file_list;
Packit bedeea
	guint num_dirs;
Packit bedeea
	MailerType type;
Packit bedeea
	char *mail_cmd;
Packit bedeea
} NautilusSendto;
Packit bedeea
Packit bedeea
static const GOptionEntry entries[] = {
Packit bedeea
	{ "run-from-build-dir", 'b', 0, G_OPTION_ARG_NONE, &run_from_build_dir, N_("Run from build directory (ignored)"), NULL },
Packit bedeea
	{ "xid", 'x', 0, G_OPTION_ARG_INT64, &xid, N_("Use XID as parent to the send dialogue (ignored)"), NULL },
Packit bedeea
	{ G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, N_("Files to send"), "[FILES...]" },
Packit bedeea
	{"version", 'v', 0, G_OPTION_ARG_NONE, &show_version, N_("Output version information and exit"), NULL},
Packit bedeea
	{ NULL }
Packit bedeea
};
Packit bedeea
Packit bedeea
static char *
Packit bedeea
get_evo_cmd (void)
Packit bedeea
{
Packit bedeea
	char *tmp, *retval;
Packit bedeea
Packit bedeea
	tmp = g_find_program_in_path ("evolution");
Packit bedeea
	if (tmp == NULL)
Packit bedeea
		return NULL;
Packit bedeea
Packit bedeea
	retval = g_strdup_printf ("%s --component=mail %%s", tmp);
Packit bedeea
	g_free (tmp);
Packit bedeea
Packit bedeea
	return retval;
Packit bedeea
}
Packit bedeea
Packit bedeea
static gboolean
Packit bedeea
init_mailer (NautilusSendto *nst)
Packit bedeea
{
Packit bedeea
	GAppInfo *app_info;
Packit bedeea
	char *needle;
Packit bedeea
Packit bedeea
	nst->type = MAILER_UNKNOWN;
Packit bedeea
Packit bedeea
	app_info = g_app_info_get_default_for_uri_scheme ("mailto");
Packit bedeea
	if (app_info) {
Packit bedeea
		nst->mail_cmd = g_strdup (g_app_info_get_commandline (app_info));
Packit bedeea
		g_object_unref (app_info);
Packit bedeea
	} else {
Packit bedeea
		nst->mail_cmd = NULL;
Packit bedeea
	}
Packit bedeea
Packit bedeea
	if (nst->mail_cmd == NULL || *nst->mail_cmd == '\0') {
Packit bedeea
		g_free (nst->mail_cmd);
Packit bedeea
		nst->mail_cmd = get_evo_cmd ();
Packit bedeea
		nst->type = MAILER_EVO;
Packit bedeea
	} else {
Packit bedeea
		/* Find what the default mailer is */
Packit bedeea
		if (strstr (nst->mail_cmd, "balsa"))
Packit bedeea
			nst->type = MAILER_BALSA;
Packit bedeea
		else if (strstr (nst->mail_cmd, "thunder") || strstr (nst->mail_cmd, "seamonkey") || strstr (nst->mail_cmd, "icedove")) {
Packit bedeea
			char **strv;
Packit bedeea
Packit bedeea
			nst->type = MAILER_THUNDERBIRD;
Packit bedeea
Packit bedeea
			/* Thunderbird sucks, see
Packit bedeea
			 * https://bugzilla.gnome.org/show_bug.cgi?id=614222 */
Packit bedeea
			strv = g_strsplit (nst->mail_cmd, " ", -1);
Packit bedeea
			g_free (nst->mail_cmd);
Packit bedeea
			nst->mail_cmd = g_strdup_printf ("%s %%s", strv[0]);
Packit bedeea
			g_strfreev (strv);
Packit bedeea
		} else if (strstr (nst->mail_cmd, "sylpheed") || strstr (nst->mail_cmd, "claws"))
Packit bedeea
			nst->type = MAILER_SYLPHEED;
Packit bedeea
		else if (strstr (nst->mail_cmd, "anjal"))
Packit bedeea
			nst->type = MAILER_EVO;
Packit bedeea
	}
Packit bedeea
Packit bedeea
	if (nst->mail_cmd == NULL)
Packit bedeea
		return FALSE;
Packit bedeea
Packit bedeea
	/* Replace %U by %s */
Packit bedeea
	while ((needle = g_strrstr (nst->mail_cmd, "%U")) != NULL)
Packit bedeea
		needle[1] = 's';
Packit bedeea
	while ((needle = g_strrstr (nst->mail_cmd, "%u")) != NULL)
Packit bedeea
		needle[1] = 's';
Packit bedeea
Packit bedeea
	return TRUE;
Packit bedeea
}
Packit bedeea
Packit bedeea
static char *
Packit bedeea
get_filename_from_list (GList *file_list)
Packit bedeea
{
Packit bedeea
	GList *l;
Packit bedeea
	GString *common_part = NULL;
Packit bedeea
	gboolean matches = TRUE;
Packit bedeea
	guint offset = 0;
Packit bedeea
	const char *encoding;
Packit bedeea
	gboolean use_utf8 = TRUE;
Packit bedeea
Packit bedeea
	encoding = g_getenv ("G_FILENAME_ENCODING");
Packit bedeea
Packit bedeea
	if (encoding != NULL && strcasecmp (encoding, "UTF-8") != 0)
Packit bedeea
		use_utf8 = FALSE;
Packit bedeea
Packit bedeea
	if (file_list == NULL)
Packit bedeea
		return NULL;
Packit bedeea
Packit bedeea
	common_part = g_string_new ("");
Packit bedeea
Packit bedeea
	while (TRUE) {
Packit bedeea
		gunichar cur_char = '\0';
Packit bedeea
		for (l = file_list; l ; l = l->next) {
Packit bedeea
			char *path = NULL, *name = NULL;
Packit bedeea
			char *offset_name = NULL;
Packit bedeea
Packit bedeea
			path = g_filename_from_uri ((char *) l->data, NULL, NULL);
Packit bedeea
			if (!path)
Packit bedeea
				break;
Packit bedeea
Packit bedeea
			name = g_path_get_basename (path);
Packit bedeea
Packit bedeea
			if (!use_utf8) {
Packit bedeea
				char *tmp;
Packit bedeea
Packit bedeea
				tmp = g_filename_to_utf8 (name, -1, NULL, NULL, NULL);
Packit bedeea
				g_free (name);
Packit bedeea
				name = tmp;
Packit bedeea
			}
Packit bedeea
Packit bedeea
			if (!name) {
Packit bedeea
				g_free (path);
Packit bedeea
				break;
Packit bedeea
			}
Packit bedeea
Packit bedeea
			if (offset >= g_utf8_strlen (name, -1)) {
Packit bedeea
				g_free(name);
Packit bedeea
				g_free(path);
Packit bedeea
				matches = FALSE;
Packit bedeea
				break;
Packit bedeea
			}
Packit bedeea
Packit bedeea
			offset_name = g_utf8_offset_to_pointer (name, offset);
Packit bedeea
Packit bedeea
			if (offset_name == g_utf8_strrchr (name, -1, '.')) {
Packit bedeea
				g_free (name);
Packit bedeea
				g_free (path);
Packit bedeea
				matches = FALSE;
Packit bedeea
				break;
Packit bedeea
			}
Packit bedeea
			if (cur_char == '\0') {
Packit bedeea
				cur_char = g_utf8_get_char (offset_name);
Packit bedeea
			} else if (cur_char != g_utf8_get_char (offset_name)) {
Packit bedeea
				g_free (name);
Packit bedeea
				g_free (path);
Packit bedeea
				matches = FALSE;
Packit bedeea
				break;
Packit bedeea
			}
Packit bedeea
			g_free (name);
Packit bedeea
			g_free (path);
Packit bedeea
		}
Packit bedeea
		if (matches == TRUE &&
Packit bedeea
		    cur_char != '\0' &&
Packit bedeea
		    cur_char != '-' &&
Packit bedeea
		    cur_char != '_') {
Packit bedeea
			offset++;
Packit bedeea
			common_part = g_string_append_unichar (common_part,
Packit bedeea
					cur_char);
Packit bedeea
		} else {
Packit bedeea
			break;
Packit bedeea
		}
Packit bedeea
	}
Packit bedeea
Packit bedeea
	if (g_utf8_strlen (common_part->str, -1) < 4) {
Packit bedeea
		g_string_free (common_part, TRUE);
Packit bedeea
		return NULL;
Packit bedeea
	}
Packit bedeea
Packit bedeea
	return g_string_free (common_part, FALSE);
Packit bedeea
}
Packit bedeea
Packit bedeea
static char *
Packit bedeea
pack_filename_from_names (GList *file_list)
Packit bedeea
{
Packit bedeea
	char *filename;
Packit bedeea
	gboolean one_file;
Packit bedeea
Packit bedeea
	if (file_list != NULL && file_list->next != NULL)
Packit bedeea
		one_file = FALSE;
Packit bedeea
	else if (file_list != NULL)
Packit bedeea
		one_file = TRUE;
Packit bedeea
Packit bedeea
	if (one_file) {
Packit bedeea
		char *filepath;
Packit bedeea
Packit bedeea
		filepath = g_filename_from_uri ((char *)file_list->data,
Packit bedeea
						NULL, NULL);
Packit bedeea
		filename = g_path_get_basename (filepath);
Packit bedeea
		g_free (filepath);
Packit bedeea
	} else {
Packit bedeea
		filename = get_filename_from_list (file_list);
Packit bedeea
	}
Packit bedeea
Packit bedeea
	if (filename == NULL) {
Packit bedeea
		/* Translators: the default archive name if it
Packit bedeea
		 * could not be deduced from the provided files */
Packit bedeea
		filename = g_strdup (_("Archive"));
Packit bedeea
	}
Packit bedeea
Packit bedeea
	return filename;
Packit bedeea
}
Packit bedeea
Packit bedeea
static char *
Packit bedeea
pack_files (GList *file_list)
Packit bedeea
{
Packit bedeea
	char *file_roller_cmd;
Packit bedeea
	const char *filename;
Packit bedeea
	GList *l;
Packit bedeea
	GString *cmd, *tmp;
Packit bedeea
	char *pack_type, *tmp_work_dir, *packed_file;
Packit bedeea
Packit bedeea
	file_roller_cmd = g_find_program_in_path ("file-roller");
Packit bedeea
	filename = pack_filename_from_names (file_list);
Packit bedeea
Packit bedeea
	g_assert (filename != NULL && *filename != '\0');
Packit bedeea
Packit bedeea
	tmp_work_dir = g_build_filename (g_get_tmp_dir (),
Packit bedeea
					 "nautilus-sendto-XXXXXX",
Packit bedeea
					 NULL);
Packit bedeea
	tmp_work_dir = g_mkdtemp (tmp_work_dir);
Packit bedeea
Packit bedeea
	pack_type = g_strdup (".zip");
Packit bedeea
Packit bedeea
	cmd = g_string_new ("");
Packit bedeea
	g_string_printf (cmd, "%s --add-to=\"%s/%s%s\"",
Packit bedeea
			 file_roller_cmd, tmp_work_dir,
Packit bedeea
			 filename,
Packit bedeea
			 pack_type);
Packit bedeea
Packit bedeea
	/* file-roller doesn't understand URIs */
Packit bedeea
	for (l = file_list ; l; l=l->next){
Packit bedeea
		char *file;
Packit bedeea
Packit bedeea
		file = g_filename_from_uri (l->data, NULL, NULL);
Packit bedeea
		g_string_append_printf (cmd," \"%s\"", file);
Packit bedeea
		g_free (file);
Packit bedeea
	}
Packit bedeea
Packit bedeea
	g_spawn_command_line_sync (cmd->str, NULL, NULL, NULL, NULL);
Packit bedeea
	g_string_free (cmd, TRUE);
Packit bedeea
	tmp = g_string_new("");
Packit bedeea
	g_string_printf (tmp,"%s/%s%s", tmp_work_dir,
Packit bedeea
			 filename,
Packit bedeea
			 pack_type);
Packit bedeea
	g_free (tmp_work_dir);
Packit bedeea
	packed_file = g_filename_to_uri (tmp->str, NULL, NULL);
Packit bedeea
	g_string_free(tmp, TRUE);
Packit bedeea
Packit bedeea
	return packed_file;
Packit bedeea
}
Packit bedeea
Packit bedeea
static void
Packit bedeea
get_evo_mailto (GString         *mailto,
Packit bedeea
		GList           *file_list)
Packit bedeea
{
Packit bedeea
	GList *l;
Packit bedeea
Packit bedeea
	g_string_append (mailto, "mailto:");
Packit bedeea
	g_string_append (mailto, "\"\"");
Packit bedeea
	g_string_append_printf (mailto,"?attach=\"%s\"", (char *)file_list->data);
Packit bedeea
	for (l = file_list->next ; l; l=l->next)
Packit bedeea
		g_string_append_printf (mailto,"&attach=\"%s\"", (char *)l->data);
Packit bedeea
}
Packit bedeea
Packit bedeea
static void
Packit bedeea
get_balsa_mailto (NautilusSendto  *nst,
Packit bedeea
		  GString         *mailto,
Packit bedeea
		  GList           *file_list)
Packit bedeea
{
Packit bedeea
	GList *l;
Packit bedeea
Packit bedeea
	if (strstr (nst->mail_cmd, " -m ") == NULL && strstr (nst->mail_cmd, " --compose=") == NULL)
Packit bedeea
		g_string_append (mailto, " --compose=");
Packit bedeea
	g_string_append (mailto, "\"\"");
Packit bedeea
	g_string_append_printf (mailto," --attach=\"%s\"", (char *)file_list->data);
Packit bedeea
	for (l = file_list->next ; l; l=l->next)
Packit bedeea
		g_string_append_printf (mailto," --attach=\"%s\"", (char *)l->data);
Packit bedeea
}
Packit bedeea
Packit bedeea
static void
Packit bedeea
get_thunderbird_mailto (GString         *mailto,
Packit bedeea
			GList           *file_list)
Packit bedeea
{
Packit bedeea
	GList *l;
Packit bedeea
Packit bedeea
	g_string_append (mailto, "-compose \"");
Packit bedeea
	g_string_append_printf (mailto,"attachment='%s", (char *)file_list->data);
Packit bedeea
	for (l = file_list->next ; l; l=l->next)
Packit bedeea
		g_string_append_printf (mailto,",%s", (char *)l->data);
Packit bedeea
	g_string_append (mailto, "'\"");
Packit bedeea
}
Packit bedeea
Packit bedeea
static void
Packit bedeea
get_sylpheed_mailto (GString         *mailto,
Packit bedeea
		     GList           *file_list)
Packit bedeea
{
Packit bedeea
	GList *l;
Packit bedeea
Packit bedeea
	g_string_append (mailto, "--compose ");
Packit bedeea
	g_string_append (mailto, "\"\"");
Packit bedeea
	g_string_append_printf (mailto,"--attach \"%s\"", (char *)file_list->data);
Packit bedeea
	for (l = file_list->next ; l; l=l->next)
Packit bedeea
		g_string_append_printf (mailto," \"%s\"", (char *)l->data);
Packit bedeea
}
Packit bedeea
Packit bedeea
static void
Packit bedeea
send_files (NautilusSendto *nst)
Packit bedeea
{
Packit bedeea
	GString *mailto;
Packit bedeea
	char *cmd;
Packit bedeea
Packit bedeea
	if (nst->num_dirs > 0) {
Packit bedeea
		char *zip;
Packit bedeea
		zip = pack_files (nst->file_list);
Packit bedeea
		g_list_free_full (nst->file_list, g_free);
Packit bedeea
		nst->file_list = g_list_append (NULL, zip);
Packit bedeea
	}
Packit bedeea
Packit bedeea
	mailto = g_string_new ("");
Packit bedeea
	switch (nst->type) {
Packit bedeea
	case MAILER_BALSA:
Packit bedeea
		get_balsa_mailto (nst, mailto, nst->file_list);
Packit bedeea
		break;
Packit bedeea
	case MAILER_SYLPHEED:
Packit bedeea
		get_sylpheed_mailto (mailto, nst->file_list);
Packit bedeea
		break;
Packit bedeea
	case MAILER_THUNDERBIRD:
Packit bedeea
		get_thunderbird_mailto (mailto, nst->file_list);
Packit bedeea
		break;
Packit bedeea
	case MAILER_EVO:
Packit bedeea
	default:
Packit bedeea
		get_evo_mailto (mailto, nst->file_list);
Packit bedeea
	}
Packit bedeea
Packit bedeea
#pragma GCC diagnostic push
Packit bedeea
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
Packit bedeea
	cmd = g_strdup_printf (nst->mail_cmd, mailto->str);
Packit bedeea
	g_string_free (mailto, TRUE);
Packit bedeea
#pragma GCC diagnostic pop
Packit bedeea
Packit bedeea
	g_debug ("Mailer type: %d", nst->type);
Packit bedeea
	g_debug ("Command: %s", cmd);
Packit bedeea
Packit bedeea
	/* FIXME: collect errors from this call */
Packit bedeea
	g_spawn_command_line_async (cmd, NULL);
Packit bedeea
	g_free (cmd);
Packit bedeea
}
Packit bedeea
Packit bedeea
static char *
Packit bedeea
escape_ampersands_and_commas (const char *url)
Packit bedeea
{
Packit bedeea
	int i;
Packit bedeea
	char *str, *ptr;
Packit bedeea
Packit bedeea
	/* Count the number of ampersands & commas */
Packit bedeea
	i = 0;
Packit bedeea
	ptr = (char *) url;
Packit bedeea
	while ((ptr = strchr (ptr, '&')) != NULL) {
Packit bedeea
		i++;
Packit bedeea
		ptr++;
Packit bedeea
	}
Packit bedeea
	ptr = (char *) url;
Packit bedeea
	while ((ptr = strchr (ptr, ',')) != NULL) {
Packit bedeea
		i++;
Packit bedeea
		ptr++;
Packit bedeea
	}
Packit bedeea
Packit bedeea
	/* No ampersands or commas ? */
Packit bedeea
	if (i == 0)
Packit bedeea
		return NULL;
Packit bedeea
Packit bedeea
	/* Replace the '&' */
Packit bedeea
	str = g_malloc0 (strlen (url) - i + 3 * i + 1);
Packit bedeea
	ptr = str;
Packit bedeea
	for (i = 0; url[i] != '\0'; i++) {
Packit bedeea
		if (url[i] == '&') {
Packit bedeea
			*ptr++ = '%';
Packit bedeea
			*ptr++ = '2';
Packit bedeea
			*ptr++ = '6';
Packit bedeea
		} else if (url[i] == ',') {
Packit bedeea
			*ptr++ = '%';
Packit bedeea
			*ptr++ = '2';
Packit bedeea
			*ptr++ = 'C';
Packit bedeea
		} else {
Packit bedeea
			*ptr++ = url[i];
Packit bedeea
		}
Packit bedeea
	}
Packit bedeea
Packit bedeea
	return str;
Packit bedeea
}
Packit bedeea
Packit bedeea
static char *
Packit bedeea
get_target_filename (GFile *file)
Packit bedeea
{
Packit bedeea
	GFileInfo *info;
Packit bedeea
	const char *target;
Packit bedeea
	GFile *new_file;
Packit bedeea
	char *ret;
Packit bedeea
Packit bedeea
	info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI, G_FILE_QUERY_INFO_NONE, NULL, NULL);
Packit bedeea
	if (info == NULL)
Packit bedeea
		return NULL;
Packit bedeea
Packit bedeea
	target = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
Packit bedeea
	if (target == NULL) {
Packit bedeea
		g_object_unref (info);
Packit bedeea
		return NULL;
Packit bedeea
	}
Packit bedeea
Packit bedeea
	new_file = g_file_new_for_uri (target);
Packit bedeea
	g_object_unref (info);
Packit bedeea
Packit bedeea
	ret = g_file_get_path (new_file);
Packit bedeea
	g_object_unref (new_file);
Packit bedeea
Packit bedeea
	return ret;
Packit bedeea
}
Packit bedeea
Packit bedeea
Packit bedeea
static void
Packit bedeea
nautilus_sendto_init (NautilusSendto *nst)
Packit bedeea
{
Packit bedeea
	int i;
Packit bedeea
Packit bedeea
	/* Clean up the URIs passed, and collect whether we have directories */
Packit bedeea
	for (i = 0; filenames != NULL && filenames[i] != NULL; i++) {
Packit bedeea
		GFile *file;
Packit bedeea
		char *filename, *escaped, *uri;
Packit bedeea
		GFileInfo *info;
Packit bedeea
		const char *mimetype;
Packit bedeea
Packit bedeea
		/* We need a filename */
Packit bedeea
		file = g_file_new_for_commandline_arg (filenames[i]);
Packit bedeea
		filename = g_file_get_path (file);
Packit bedeea
		if (filename == NULL) {
Packit bedeea
			filename = get_target_filename (file);
Packit bedeea
			if (filename == NULL) {
Packit bedeea
				g_object_unref (file);
Packit bedeea
				g_debug ("Could not get a filename for '%s'", filenames[i]);
Packit bedeea
				continue;
Packit bedeea
			}
Packit bedeea
		}
Packit bedeea
Packit bedeea
		/* Get the mime-type, and whether the file is readable */
Packit bedeea
		info = g_file_query_info (file,
Packit bedeea
					  G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE","G_FILE_ATTRIBUTE_ACCESS_CAN_READ,
Packit bedeea
					  G_FILE_QUERY_INFO_NONE,
Packit bedeea
					  NULL,
Packit bedeea
					  NULL);
Packit bedeea
		g_object_unref (file);
Packit bedeea
Packit bedeea
		if (info == NULL) {
Packit bedeea
			g_debug ("Could not get info for '%s'", filenames[i]);
Packit bedeea
			continue;
Packit bedeea
		}
Packit bedeea
Packit bedeea
		if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_ACCESS_CAN_READ)) {
Packit bedeea
			if (g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_READ) == FALSE) {
Packit bedeea
				g_debug ("'%s' is not readable", filenames[i]);
Packit bedeea
				g_object_unref (info);
Packit bedeea
				continue;
Packit bedeea
			}
Packit bedeea
		} else {
Packit bedeea
			g_debug ("No can-read attribute for '%s', assuming it is", filenames[i]);
Packit bedeea
		}
Packit bedeea
Packit bedeea
		mimetype = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE);
Packit bedeea
		if (!mimetype)
Packit bedeea
			mimetype = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE);
Packit bedeea
		if (!mimetype) {
Packit bedeea
			g_object_unref (info);
Packit bedeea
			g_debug ("Could not get mime-type for '%s'", filenames[i]);
Packit bedeea
			continue;
Packit bedeea
		}
Packit bedeea
		if (g_str_equal (mimetype, "inode/directory"))
Packit bedeea
			nst->num_dirs++;
Packit bedeea
Packit bedeea
		g_object_unref (info);
Packit bedeea
Packit bedeea
		uri = g_filename_to_uri (filename, NULL, NULL);
Packit bedeea
		g_free (filename);
Packit bedeea
		escaped = escape_ampersands_and_commas (uri);
Packit bedeea
Packit bedeea
		if (escaped == NULL) {
Packit bedeea
			nst->file_list = g_list_prepend (nst->file_list, uri);
Packit bedeea
		} else {
Packit bedeea
			nst->file_list = g_list_prepend (nst->file_list, escaped);
Packit bedeea
			g_free (uri);
Packit bedeea
		}
Packit bedeea
	}
Packit bedeea
Packit bedeea
	nst->file_list = g_list_reverse (nst->file_list);
Packit bedeea
}
Packit bedeea
Packit bedeea
int main (int argc, char **argv)
Packit bedeea
{
Packit bedeea
	GOptionContext *context;
Packit bedeea
	GError *error = NULL;
Packit bedeea
	NautilusSendto *nst;
Packit bedeea
	int ret = 0;
Packit bedeea
Packit bedeea
	setlocale (LC_ALL, "");
Packit bedeea
	bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
Packit bedeea
	bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
Packit bedeea
	textdomain (GETTEXT_PACKAGE);
Packit bedeea
Packit bedeea
	context = g_option_context_new ("");
Packit bedeea
	g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
Packit bedeea
	if (g_option_context_parse (context, &argc, &argv, &error) == FALSE) {
Packit bedeea
		g_print (_("Could not parse command-line options: %s\n"), error->message);
Packit bedeea
		g_error_free (error);
Packit bedeea
		return 1;
Packit bedeea
	}
Packit bedeea
Packit bedeea
        if (show_version) {
Packit bedeea
		g_print ("%s %s\n", PACKAGE_NAME, PACKAGE_VERSION);
Packit bedeea
		return 0;
Packit bedeea
	}
Packit bedeea
Packit bedeea
	nst = g_new0 (NautilusSendto, 1);
Packit bedeea
	nautilus_sendto_init (nst);
Packit bedeea
	if (!init_mailer (nst)) {
Packit bedeea
		g_print (_("No mail client installed, not sending files\n"));
Packit bedeea
		goto out;
Packit bedeea
	}
Packit bedeea
Packit bedeea
Packit bedeea
	if (nst->file_list == NULL) {
Packit bedeea
		g_print (_("Expects URIs or filenames to be passed as options\n"));
Packit bedeea
		ret = 1;
Packit bedeea
		goto out;
Packit bedeea
	}
Packit bedeea
Packit bedeea
	send_files (nst);
Packit bedeea
Packit bedeea
out:
Packit bedeea
	g_free (nst);
Packit bedeea
Packit bedeea
	return ret;
Packit bedeea
}