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-contact-manager.h>
35 #include <libempathy/empathy-ft-factory.h>
36 #include <libempathy/empathy-ft-handler.h>
37 #include <libempathy/empathy-tp-file.h>
38 #include <libempathy/empathy-account-manager.h>
40 #include <libempathy-gtk/empathy-contact-selector.h>
41 #include <libempathy-gtk/empathy-ui-utils.h>
43 #include "nautilus-sendto-plugin.h"
45 static EmpathyAccountManager *acc_manager = NULL;
46 static EmpathyFTFactory *factory = NULL;
47 static guint transfers = 0;
49 static gboolean destroy (NstPlugin *plugin);
52 handle_account_manager_ready ()
54 TpConnectionPresenceType presence;
56 presence = empathy_account_manager_get_global_presence (acc_manager,
59 if (presence < TP_CONNECTION_PRESENCE_TYPE_AVAILABLE)
64 acc_manager_ready_cb (EmpathyAccountManager *am,
68 if (!empathy_account_manager_is_ready (am))
71 handle_account_manager_ready ();
75 init (NstPlugin *plugin)
77 g_print ("Init %s plugin\n", plugin->info->id);
81 acc_manager = empathy_account_manager_dup_singleton ();
83 if (empathy_account_manager_is_ready (acc_manager))
84 handle_account_manager_ready ();
86 g_signal_connect (acc_manager, "notify::ready",
87 G_CALLBACK (acc_manager_ready_cb), NULL);
93 get_contacts_widget (NstPlugin *plugin)
95 EmpathyContactManager *manager;
98 manager = empathy_contact_manager_dup_singleton ();
99 selector = empathy_contact_selector_new (EMPATHY_CONTACT_LIST (manager));
101 empathy_contact_selector_set_visible (EMPATHY_CONTACT_SELECTOR (selector),
102 (EmpathyContactSelectorFilterFunc) empathy_contact_can_send_files, NULL);
104 g_object_unref (manager);
109 static EmpathyContact *
110 get_selected_contact (GtkWidget *contact_widget)
112 EmpathyContact *contact;
116 if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (contact_widget), &iter))
119 model = gtk_combo_box_get_model (GTK_COMBO_BOX (contact_widget));
120 gtk_tree_model_get (model, &iter,
121 EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, &contact, -1);
127 validate_destination (NstPlugin *plugin,
128 GtkWidget *contact_widget,
131 EmpathyContact *contact = NULL;
134 contact = get_selected_contact (contact_widget);
139 if (!empathy_contact_can_send_files (contact))
141 *error = g_strdup (_("The contact selected cannot receive files."));
145 if (ret && !empathy_contact_is_online (contact))
147 *error = g_strdup (_("The contact selected is offline."));
151 g_object_unref (contact);
167 transfer_done_cb (EmpathyFTHandler *handler,
168 EmpathyTpFile *tp_file,
175 transfer_error_cb (EmpathyFTHandler *handler,
183 error_dialog_cb (GtkDialog *dialog,
187 gtk_widget_destroy (GTK_WIDGET (dialog));
192 handler_ready_cb (EmpathyFTFactory *factory,
193 EmpathyFTHandler *handler,
200 dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR,
201 GTK_BUTTONS_CLOSE, "%s",
202 error->message ? error->message : _("No error message"));
204 g_signal_connect (dialog, "response", G_CALLBACK (error_dialog_cb), NULL);
205 gtk_widget_show (dialog);
209 g_signal_connect (handler, "transfer-done",
210 G_CALLBACK (transfer_done_cb), plugin);
211 g_signal_connect (handler, "transfer-error",
212 G_CALLBACK (transfer_error_cb), plugin);
214 empathy_ft_handler_start_transfer (handler);
219 send_files (NstPlugin *plugin,
220 GtkWidget *contact_widget,
223 EmpathyContact *contact;
226 contact = get_selected_contact (contact_widget);
231 factory = empathy_ft_factory_dup_singleton ();
233 g_signal_connect (factory, "new-ft-handler",
234 G_CALLBACK (handler_ready_cb), plugin);
236 for (l = file_list; l; l = l->next)
238 gchar *path = l->data;
241 file = g_file_new_for_uri (path);
245 empathy_ft_factory_new_transfer_outgoing (factory,
248 g_object_unref (file);
251 g_object_unref (contact);
263 destroy (NstPlugin *plugin)
266 g_object_unref (acc_manager);
269 g_object_unref (factory);
275 NstPluginInfo plugin_info = {
278 N_("Instant Message (Empathy)"),
284 validate_destination,
289 NST_INIT_PLUGIN (plugin_info)