2 * Copyright (C) 2008, 2009 Collabora Ltd.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more av.
14 * You should have received a copy of the GNU General Public
15 * License along with this program; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301 USA.
19 * Authors: Jonny Lamb <jonny.lamb@collabora.co.uk>
20 * Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
26 #include <glib/gi18n-lib.h>
30 #include <telepathy-glib/enums.h>
32 #include <libempathy/empathy-contact.h>
33 #include <libempathy/empathy-debug.h>
34 #include <libempathy/empathy-ft-factory.h>
35 #include <libempathy/empathy-ft-handler.h>
36 #include <libempathy/empathy-tp-file.h>
38 #include <libempathy-gtk/empathy-contact-chooser.h>
39 #include <libempathy-gtk/empathy-ui-utils.h>
41 #include "nautilus-sendto-plugin.h"
43 static EmpathyFTFactory *factory = NULL;
44 static guint transfers = 0;
46 static gboolean destroy (NstPlugin *plugin);
49 init (NstPlugin *plugin)
51 g_print ("Init %s plugin\n", plugin->info->id);
58 static EmpathyContact *
59 dup_contact_from_individual (FolksIndividual *individual)
61 EmpathyContact *contact;
62 gboolean can_do_action;
64 if (individual == NULL)
67 contact = empathy_contact_dup_best_for_action (individual,
68 EMPATHY_ACTION_SEND_FILE);
72 can_do_action = empathy_contact_can_do_action (contact,
73 EMPATHY_ACTION_SEND_FILE);
77 /* If contact can't do FT we don't care about him */
78 g_object_unref (contact);
86 filter_individual (EmpathyContactChooser *chooser,
87 FolksIndividual *individual,
92 EmpathyContact *contact;
97 contact = dup_contact_from_individual (individual);
101 g_object_unref (contact);
106 get_contacts_widget (NstPlugin *plugin)
110 chooser = empathy_contact_chooser_new ();
111 empathy_contact_chooser_set_filter_func (EMPATHY_CONTACT_CHOOSER (chooser),
112 filter_individual, plugin);
114 empathy_contact_chooser_show_search_entry (EMPATHY_CONTACT_CHOOSER (chooser),
117 /* Make sure to display some contacts */
118 gtk_widget_set_size_request (chooser, -1, 300);
122 static EmpathyContact *
123 get_selected_contact (GtkWidget *widget)
125 FolksIndividual *individual;
126 EmpathyContact *contact;
128 individual = empathy_contact_chooser_dup_selected (
129 EMPATHY_CONTACT_CHOOSER (widget));
130 if (individual == NULL)
133 contact = dup_contact_from_individual (individual);
135 g_object_unref (individual);
140 validate_destination (NstPlugin *plugin,
141 GtkWidget *contact_widget,
144 EmpathyContact *contact = NULL;
147 contact = get_selected_contact (contact_widget);
152 g_object_unref (contact);
168 transfer_done_cb (EmpathyFTHandler *handler,
169 EmpathyTpFile *tp_file,
176 transfer_error_cb (EmpathyFTHandler *handler,
184 error_dialog_cb (GtkDialog *dialog,
188 gtk_widget_destroy (GTK_WIDGET (dialog));
193 handler_ready_cb (EmpathyFTFactory *fact,
194 EmpathyFTHandler *handler,
201 dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR,
202 GTK_BUTTONS_CLOSE, "%s",
203 error->message ? error->message : _("No error message"));
205 g_signal_connect (dialog, "response", G_CALLBACK (error_dialog_cb), NULL);
206 gtk_widget_show (dialog);
210 g_signal_connect (handler, "transfer-done",
211 G_CALLBACK (transfer_done_cb), plugin);
212 g_signal_connect (handler, "transfer-error",
213 G_CALLBACK (transfer_error_cb), plugin);
215 empathy_ft_handler_start_transfer (handler);
220 send_files (NstPlugin *plugin,
221 GtkWidget *contact_widget,
224 EmpathyContact *contact;
227 contact = get_selected_contact (contact_widget);
232 factory = empathy_ft_factory_dup_singleton ();
234 g_signal_connect (factory, "new-ft-handler",
235 G_CALLBACK (handler_ready_cb), plugin);
237 for (l = file_list; l; l = l->next)
239 gchar *path = l->data;
242 file = g_file_new_for_uri (path);
246 empathy_ft_factory_new_transfer_outgoing (factory,
247 contact, file, empathy_get_current_action_time ());
249 g_object_unref (file);
252 g_object_unref (contact);
264 destroy (NstPlugin *plugin)
267 g_object_unref (factory);
273 NstPluginInfo plugin_info = {
276 N_("Instant Message (Empathy)"),
281 validate_destination,
286 NST_INIT_PLUGIN (plugin_info)