diff options
Diffstat (limited to 'nautilus-sendto-plugin')
-rw-r--r-- | nautilus-sendto-plugin/Makefile.am | 19 | ||||
-rw-r--r-- | nautilus-sendto-plugin/empathy-nautilus-sendto.c | 290 |
2 files changed, 309 insertions, 0 deletions
diff --git a/nautilus-sendto-plugin/Makefile.am b/nautilus-sendto-plugin/Makefile.am new file mode 100644 index 000000000..dc0c74416 --- /dev/null +++ b/nautilus-sendto-plugin/Makefile.am @@ -0,0 +1,19 @@ +plugindir = $(libdir)/nautilus-sendto/plugins + +INCLUDES = \ + -I$(top_builddir) \ + -DLOCALEDIR=\""$(datadir)/locale"\" \ + $(NST_CFLAGS) \ + $(WARN_CFLAGS) \ + $(DISABLE_DEPRECATED) \ + $(EMPATHY_CFLAGS) + +plugin_LTLIBRARIES = libnstempathy.la + +libnstempathy_la_SOURCES = empathy-nautilus-sendto.c +libnstempathy_la_LDFLAGS = -module -avoid-version +libnstempathy_la_LIBADD = \ + $(NST_LIBS) \ + $(top_builddir)/libempathy/libempathy.la \ + $(top_builddir)/libempathy-gtk/libempathy-gtk.la + diff --git a/nautilus-sendto-plugin/empathy-nautilus-sendto.c b/nautilus-sendto-plugin/empathy-nautilus-sendto.c new file mode 100644 index 000000000..976ed84c7 --- /dev/null +++ b/nautilus-sendto-plugin/empathy-nautilus-sendto.c @@ -0,0 +1,290 @@ +/* + * Copyright (C) 2008, 2009 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more av. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + * Authors: Jonny Lamb <jonny.lamb@collabora.co.uk> + * Cosimo Cecchi <cosimo.cecchi@collabora.co.uk> + */ + +#include "config.h" + +#include <glib.h> +#include <glib/gi18n-lib.h> +#include <gtk/gtk.h> +#include <gio/gio.h> + +#include <telepathy-glib/enums.h> + +#include <libempathy/empathy-contact.h> +#include <libempathy/empathy-debug.h> +#include <libempathy/empathy-contact-manager.h> +#include <libempathy/empathy-ft-factory.h> +#include <libempathy/empathy-ft-handler.h> +#include <libempathy/empathy-tp-file.h> +#include <libempathy/empathy-account-manager.h> + +#include <libempathy-gtk/empathy-contact-selector.h> +#include <libempathy-gtk/empathy-ui-utils.h> + +#include "nautilus-sendto-plugin.h" + +static EmpathyAccountManager *acc_manager = NULL; +static EmpathyFTFactory *factory = NULL; +static guint transfers = 0; + +static gboolean destroy (NstPlugin *plugin); + +static void +handle_account_manager_ready () +{ + TpConnectionPresenceType presence; + + presence = empathy_account_manager_get_global_presence (acc_manager, + NULL, NULL); + + if (presence < TP_CONNECTION_PRESENCE_TYPE_AVAILABLE) + return; +} + +static void +acc_manager_ready_cb (EmpathyAccountManager *am, + GParamSpec *pspec, + gpointer _user_data) +{ + if (!empathy_account_manager_is_ready (am)) + return; + + handle_account_manager_ready (); +} + +static gboolean +init (NstPlugin *plugin) +{ + g_print ("Init %s plugin\n", plugin->info->id); + + empathy_gtk_init (); + + acc_manager = empathy_account_manager_dup_singleton (); + + if (empathy_account_manager_is_ready (acc_manager)) + handle_account_manager_ready (); + else + g_signal_connect (acc_manager, "notify::ready", + G_CALLBACK (acc_manager_ready_cb), NULL); + + return TRUE; +} + +static GtkWidget * +get_contacts_widget (NstPlugin *plugin) +{ + EmpathyContactManager *manager; + GtkWidget *selector; + + manager = empathy_contact_manager_dup_singleton (); + selector = empathy_contact_selector_new (EMPATHY_CONTACT_LIST (manager)); + + empathy_contact_selector_set_visible (EMPATHY_CONTACT_SELECTOR (selector), + (EmpathyContactSelectorFilterFunc) empathy_contact_can_send_files, NULL); + + g_object_unref (manager); + + return selector; +} + +static EmpathyContact * +get_selected_contact (GtkWidget *contact_widget) +{ + EmpathyContact *contact; + GtkTreeModel *model; + GtkTreeIter iter; + + if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (contact_widget), &iter)) + return NULL; + + model = gtk_combo_box_get_model (GTK_COMBO_BOX (contact_widget)); + gtk_tree_model_get (model, &iter, + EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, &contact, -1); + + return contact; +} + +static gboolean +validate_destination (NstPlugin *plugin, + GtkWidget *contact_widget, + gchar **error) +{ + EmpathyContact *contact = NULL; + gboolean ret = TRUE; + + contact = get_selected_contact (contact_widget); + + if (!contact) + return FALSE; + + if (!empathy_contact_can_send_files (contact)) + { + *error = g_strdup (_("The contact selected cannot receive files.")); + ret = FALSE; + } + + if (ret && !empathy_contact_is_online (contact)) + { + *error = g_strdup (_("The contact selected is offline.")); + ret = FALSE; + } + + g_object_unref (contact); + + return ret; +} + +static void +quit (void) +{ + if (--transfers > 0) + return; + + destroy (NULL); + gtk_main_quit (); +} + +static void +transfer_done_cb (EmpathyFTHandler *handler, + EmpathyTpFile *tp_file, + NstPlugin *plugin) +{ + quit (); +} + +static void +transfer_error_cb (EmpathyFTHandler *handler, + GError *error, + NstPlugin *plugin) +{ + quit (); +} + +static void +error_dialog_cb (GtkDialog *dialog, + gint arg, + gpointer user_data) +{ + gtk_widget_destroy (GTK_WIDGET (dialog)); + quit (); +} + +static void +handler_ready_cb (EmpathyFTFactory *factory, + EmpathyFTHandler *handler, + GError *error, + NstPlugin *plugin) +{ + if (error != NULL) + { + GtkWidget *dialog; + dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, "%s", + error->message ? error->message : _("No error message")); + + g_signal_connect (dialog, "response", G_CALLBACK (error_dialog_cb), NULL); + gtk_widget_show (dialog); + } + else + { + g_signal_connect (handler, "transfer-done", + G_CALLBACK (transfer_done_cb), plugin); + g_signal_connect (handler, "transfer-error", + G_CALLBACK (transfer_error_cb), plugin); + + empathy_ft_handler_start_transfer (handler); + } +} + +static gboolean +send_files (NstPlugin *plugin, + GtkWidget *contact_widget, + GList *file_list) +{ + EmpathyContact *contact; + GList *l; + + contact = get_selected_contact (contact_widget); + + if (!contact) + return FALSE; + + factory = empathy_ft_factory_dup_singleton (); + + g_signal_connect (factory, "new-ft-handler", + G_CALLBACK (handler_ready_cb), plugin); + + for (l = file_list; l; l = l->next) + { + gchar *path = l->data; + GFile *file; + + file = g_file_new_for_uri (path); + + ++transfers; + + empathy_ft_factory_new_transfer_outgoing (factory, + contact, file); + + g_object_unref (file); + } + + g_object_unref (contact); + + if (transfers == 0) + { + destroy (NULL); + return TRUE; + } + + return FALSE; +} + +static gboolean +destroy (NstPlugin *plugin) +{ + if (acc_manager) + g_object_unref (acc_manager); + + if (factory) + g_object_unref (factory); + + return TRUE; +} + +static +NstPluginInfo plugin_info = { + "im", + "empathy", + N_("Instant Message (Empathy)"), + GETTEXT_PACKAGE, + TRUE, + NAUTILUS_CAPS_NONE, + init, + get_contacts_widget, + validate_destination, + send_files, + destroy +}; + +NST_INIT_PLUGIN (plugin_info) + |