/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include GMainLoop *mainloop = NULL; static void handle_with_cb (GObject *source, GAsyncResult *result, gpointer user_data) { TpChannelDispatchOperation *cdo = TP_CHANNEL_DISPATCH_OPERATION (source); GtkMessageDialog *dialog = GTK_MESSAGE_DIALOG (user_data); GError *error = NULL; if (!tp_channel_dispatch_operation_handle_with_finish (cdo, result, &error)) { g_print ("HandleWith() failed: %s\n", error->message); gtk_message_dialog_format_secondary_markup (dialog, "Error\n\nAsking LibreOffice to accept the session failed: %s", error->message); g_error_free (error); return; } g_print ("HandleWith() succeeded\n"); gtk_widget_destroy (GTK_WIDGET (dialog)); } static void close_cb (GObject *source, GAsyncResult *result, gpointer user_data) { TpChannelDispatchOperation *cdo = TP_CHANNEL_DISPATCH_OPERATION (source); GError *error = NULL; (void)user_data; /* suppress unused-parameter warning */ if (!tp_channel_dispatch_operation_close_channels_finish (cdo, result, &error)) { g_print ("Rejecting channels failed: %s\n", error->message); g_error_free (error); return; } g_print ("Rejected all the things!\n"); } static void dialog_response_cb ( GtkWidget *dialog, gint response_id, gpointer user_data) { TpSimpleApprover *self = TP_SIMPLE_APPROVER (g_object_get_data (G_OBJECT (dialog), "client")); TpChannelDispatchOperation *cdo = TP_CHANNEL_DISPATCH_OPERATION (user_data); (void)self; /* suppress unused-parameter warning (could remove TP_SIMPLE_APPROVER above?) */ if (response_id == GTK_RESPONSE_ACCEPT) { g_print ("Approve channels\n"); tp_channel_dispatch_operation_handle_with_async (cdo, NULL, handle_with_cb, dialog); gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT, FALSE); gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_REJECT, FALSE); } else { g_print ("Reject channels\n"); tp_channel_dispatch_operation_close_channels_async (cdo, close_cb, dialog); gtk_widget_destroy (dialog); } g_object_unref (cdo); } static void show_dialog ( TpSimpleApprover *self, TpChannelDispatchOperation *cdo, TpContact *target) { GFile *avatar_file = tp_contact_get_avatar_file (target); GtkWidget *dialog = gtk_message_dialog_new_with_markup (NULL, 0, /* flags */ GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, "%s (%s) would like to edit a spreadsheet in LibreOffice " "with you.", tp_contact_get_alias (target), tp_contact_get_identifier (target)); if (avatar_file != NULL) { GtkWidget *avatar = gtk_image_new_from_file (g_file_get_path (avatar_file)); gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (dialog), avatar); } gtk_dialog_add_buttons (GTK_DIALOG (dialog), "_Reject", GTK_RESPONSE_REJECT, "_Accept", GTK_RESPONSE_ACCEPT, NULL); g_object_set_data_full (G_OBJECT (dialog), "client", g_object_ref (self), g_object_unref); g_signal_connect (dialog, "response", G_CALLBACK (dialog_response_cb), g_object_ref (cdo)); gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog), FALSE); gtk_widget_show_all (dialog); } static void add_dispatch_operation_cb (TpSimpleApprover *self, TpAccount *account, TpConnection *connection, GList *channels, TpChannelDispatchOperation *cdo, TpAddDispatchOperationContext *context, gpointer user_data) { TpContact *target = NULL; GList *l; (void)account; /* suppress unused-parameter warning */ (void)connection; /* suppress unused-parameter warning */ (void)user_data; /* suppress unused-parameter warning */ g_print ("Approving this batch of channels:\n"); for (l = channels; l != NULL; l = g_list_next (l)) { TpChannel *channel = l->data; if (TP_IS_DBUS_TUBE_CHANNEL (channel)) { target = tp_channel_get_target_contact (channel); break; } } if (target == NULL) { g_critical ("Hmm. No 1-1 D-Bus tube in cdo %s, so why did we get it?", tp_proxy_get_object_path (cdo)); g_return_if_reached (); } tp_add_dispatch_operation_context_accept (context); show_dialog (self, cdo, target); } int main (int argc, char **argv) { TpAccountManager *manager; TpSimpleClientFactory *factory; TpBaseClient *approver; GError *error = NULL; gtk_init (&argc, &argv); tp_debug_set_flags (g_getenv ("LIBO_APPROVER_DEBUG")); manager = tp_account_manager_dup (); factory = tp_proxy_get_factory (manager); /* We want the target contact on channels to be available... */ tp_simple_client_factory_add_channel_features_varargs (factory, TP_CHANNEL_FEATURE_CONTACTS, 0); /* ...and for it to have its alias and avatar available */ tp_simple_client_factory_add_contact_features_varargs (factory, TP_CONTACT_FEATURE_ALIAS, TP_CONTACT_FEATURE_AVATAR_DATA, TP_CONTACT_FEATURE_INVALID); approver = tp_simple_approver_new_with_am (manager, "LibreOfficeApprover", FALSE, add_dispatch_operation_cb, NULL, NULL); tp_base_client_take_approver_filter (approver, tp_asv_new ( TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING, TP_IFACE_CHANNEL_TYPE_DBUS_TUBE, TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT, TP_HANDLE_TYPE_CONTACT, TP_PROP_CHANNEL_TYPE_DBUS_TUBE_SERVICE_NAME, G_TYPE_STRING, LIBO_DTUBE_SERVICE, NULL)); if (!tp_base_client_register (approver, &error)) { g_warning ("Failed to register Approver: %s\n", error->message); g_error_free (error); goto out; } g_print ("Start approving\n"); mainloop = g_main_loop_new (NULL, FALSE); g_main_loop_run (mainloop); /* TODO: time out after 5 seconds of inactivity? */ if (mainloop != NULL) g_main_loop_unref (mainloop); out: g_object_unref (manager); g_object_unref (approver); return 0; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */