]> git.0d.be Git - empathy.git/blob - nautilus-sendto-plugin/empathy-nautilus-sendto.c
individual-menu: remove link-contacts-activated signal
[empathy.git] / nautilus-sendto-plugin / empathy-nautilus-sendto.c
1 /*
2  * Copyright (C) 2008, 2009 Collabora Ltd.
3  *
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.
8  *
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.
13  *
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.
18  *
19  * Authors: Jonny Lamb <jonny.lamb@collabora.co.uk>
20  *          Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
21  */
22
23 #include "config.h"
24
25 #include <glib.h>
26 #include <glib/gi18n-lib.h>
27 #include <gtk/gtk.h>
28 #include <gio/gio.h>
29
30 #include <telepathy-glib/enums.h>
31
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
37 #include <libempathy-gtk/empathy-contact-chooser.h>
38 #include <libempathy-gtk/empathy-ui-utils.h>
39
40 #include "nautilus-sendto-plugin.h"
41
42 static EmpathyFTFactory *factory = NULL;
43 static guint transfers = 0;
44
45 static gboolean destroy (NstPlugin *plugin);
46
47 static gboolean
48 init (NstPlugin *plugin)
49 {
50   g_print ("Init %s plugin\n", plugin->info->id);
51
52   empathy_gtk_init ();
53
54   return TRUE;
55 }
56
57 static EmpathyContact *
58 dup_contact_from_individual (FolksIndividual *individual)
59 {
60   EmpathyContact *contact;
61   gboolean can_do_action;
62
63   if (individual == NULL)
64     return NULL;
65
66   contact = empathy_contact_dup_best_for_action (individual,
67       EMPATHY_ACTION_SEND_FILE);
68   if (contact == NULL)
69     return NULL;
70
71   can_do_action = empathy_contact_can_do_action (contact,
72       EMPATHY_ACTION_SEND_FILE);
73
74   if (!can_do_action)
75     {
76       /* If contact can't do FT we don't care about him */
77       g_object_unref (contact);
78       return NULL;
79     }
80
81   return contact;
82 }
83
84 static gboolean
85 filter_individual (EmpathyContactChooser *chooser,
86     FolksIndividual *individual,
87     gboolean is_online,
88     gboolean searching,
89     gpointer user_data)
90 {
91   EmpathyContact *contact;
92
93   if (!is_online)
94     return FALSE;
95
96   contact = dup_contact_from_individual (individual);
97   if (contact == NULL)
98     return FALSE;
99
100   g_object_unref (contact);
101   return TRUE;
102 }
103
104 static GtkWidget *
105 get_contacts_widget (NstPlugin *plugin)
106 {
107   GtkWidget *chooser;
108
109   chooser = empathy_contact_chooser_new ();
110   empathy_contact_chooser_set_filter_func (EMPATHY_CONTACT_CHOOSER (chooser),
111       filter_individual, plugin);
112
113   empathy_contact_chooser_show_search_entry (EMPATHY_CONTACT_CHOOSER (chooser),
114       FALSE);
115
116   /* Make sure to display some contacts */
117   gtk_widget_set_size_request (chooser, -1, 300);
118   return chooser;
119 }
120
121 static EmpathyContact *
122 get_selected_contact (GtkWidget *widget)
123 {
124   FolksIndividual *individual;
125   EmpathyContact *contact;
126
127   individual = empathy_contact_chooser_dup_selected (
128       EMPATHY_CONTACT_CHOOSER (widget));
129   if (individual == NULL)
130     return NULL;
131
132   contact = dup_contact_from_individual (individual);
133
134   g_object_unref (individual);
135   return contact;
136 }
137
138 static gboolean
139 validate_destination (NstPlugin *plugin,
140                       GtkWidget *contact_widget,
141                       gchar **error)
142 {
143   EmpathyContact *contact = NULL;
144   gboolean ret = TRUE;
145
146   contact = get_selected_contact (contact_widget);
147
148   if (contact == NULL)
149     return FALSE;
150
151   g_object_unref (contact);
152
153   return TRUE;
154 }
155
156 static void
157 quit (void)
158 {
159   if (--transfers > 0)
160     return;
161
162   destroy (NULL);
163   gtk_main_quit ();
164 }
165
166 static void
167 transfer_done_cb (EmpathyFTHandler *handler,
168                   TpFileTransferChannel *channel,
169                   NstPlugin *plugin)
170 {
171   quit ();
172 }
173
174 static void
175 transfer_error_cb (EmpathyFTHandler *handler,
176                    GError *error,
177                    NstPlugin *plugin)
178 {
179   quit ();
180 }
181
182 static void
183 error_dialog_cb (GtkDialog *dialog,
184                  gint arg,
185                  gpointer user_data)
186 {
187   gtk_widget_destroy (GTK_WIDGET (dialog));
188   quit ();
189 }
190
191 static void
192 handler_ready_cb (EmpathyFTFactory *fact,
193                   EmpathyFTHandler *handler,
194                   GError *error,
195                   NstPlugin *plugin)
196 {
197   if (error != NULL)
198     {
199       GtkWidget *dialog;
200       dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR,
201           GTK_BUTTONS_CLOSE, "%s",
202           error->message ? error->message : _("No error message"));
203
204       g_signal_connect (dialog, "response", G_CALLBACK (error_dialog_cb), NULL);
205       gtk_widget_show (dialog);
206     }
207   else
208     {
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);
213
214       empathy_ft_handler_start_transfer (handler);
215     }
216 }
217
218 static gboolean
219 send_files (NstPlugin *plugin,
220             GtkWidget *contact_widget,
221             GList *file_list)
222 {
223   EmpathyContact *contact;
224   GList *l;
225
226   contact = get_selected_contact (contact_widget);
227
228   if (contact == NULL)
229     return FALSE;
230
231   factory = empathy_ft_factory_dup_singleton ();
232
233   g_signal_connect (factory, "new-ft-handler",
234       G_CALLBACK (handler_ready_cb), plugin);
235
236   for (l = file_list; l; l = l->next)
237     {
238       gchar *path = l->data;
239       GFile *file;
240
241       file = g_file_new_for_uri (path);
242
243       ++transfers;
244
245       empathy_ft_factory_new_transfer_outgoing (factory,
246           contact, file, empathy_get_current_action_time ());
247
248       g_object_unref (file);
249     }
250
251   g_object_unref (contact);
252
253   if (transfers == 0)
254     {
255       destroy (NULL);
256       return TRUE;
257     }
258
259   return FALSE;
260 }
261
262 static gboolean
263 destroy (NstPlugin *plugin)
264 {
265   if (factory)
266     g_object_unref (factory);
267
268   return TRUE;
269 }
270
271 static
272 NstPluginInfo plugin_info = {
273   "im",
274   "empathy",
275   N_("Instant Message (Empathy)"),
276   GETTEXT_PACKAGE,
277   NAUTILUS_CAPS_NONE,
278   init,
279   get_contacts_widget,
280   validate_destination,
281   send_files,
282   destroy
283 };
284
285 NST_INIT_PLUGIN (plugin_info)
286