|
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 |
}
|