34
34
#include <libempathy/empathy-presence-manager.h>
35
35
#include <libempathy/empathy-tp-contact-factory.h>
36
#include <libempathy/empathy-contact-manager.h>
36
#include <libempathy/empathy-connection-aggregator.h>
37
37
#include <libempathy/empathy-tp-chat.h>
38
38
#include <libempathy/empathy-tp-streamed-media.h>
39
#include <libempathy/empathy-tp-file.h>
40
39
#include <libempathy/empathy-utils.h>
41
40
#include <libempathy/empathy-gsettings.h>
423
425
empathy_tp_chat_leave (user_data, "");
425
else if (EMPATHY_IS_TP_FILE (user_data))
427
else if (TP_IS_FILE_TRANSFER_CHANNEL (user_data))
427
empathy_tp_file_close (user_data);
429
tp_channel_close_async (user_data, NULL, NULL);
1115
1117
event_manager_call_channel_got_contact_cb,
1116
1118
approval, NULL, G_OBJECT (self));
1118
else if (EMPATHY_IS_TP_FILE (channel))
1120
else if (channel_type == TP_IFACE_QUARK_CHANNEL_TYPE_FILE_TRANSFER)
1120
1122
TpHandle handle;
1182
event_manager_pendings_changed_cb (EmpathyContactList *list,
1183
EmpathyContact *contact, EmpathyContact *actor,
1184
guint reason, gchar *message, gboolean is_pending,
1185
EmpathyEventManager *manager)
1184
check_publish_state (EmpathyEventManager *self,
1185
TpContact *tp_contact)
1187
EmpathyEventManagerPriv *priv = GET_PRIV (manager);
1188
gchar *header, *event_msg;
1187
EmpathyEventManagerPriv *priv = GET_PRIV (self);
1188
gchar *header, *event_msg;
1189
TpSubscriptionState state;
1190
EmpathyContact *contact;
1191
const gchar *message;
1193
state = tp_contact_get_publish_state (tp_contact);
1195
contact = empathy_contact_dup_from_tp_contact (tp_contact);
1197
if (state != TP_SUBSCRIPTION_STATE_ASK)
1209
1216
header = g_strdup_printf (
1210
1217
_("%s would like permission to see when you are online"),
1211
1218
empathy_contact_get_alias (contact));
1220
message = tp_contact_get_publish_request (tp_contact);
1213
1222
if (!EMP_STR_EMPTY (message))
1214
1223
event_msg = g_strdup_printf (_("\nMessage: %s"), message);
1216
1225
event_msg = NULL;
1218
event_manager_add (manager, NULL, contact, EMPATHY_EVENT_TYPE_SUBSCRIPTION,
1227
event_manager_add (self, NULL, contact, EMPATHY_EVENT_TYPE_SUBSCRIPTION,
1219
1228
GTK_STOCK_DIALOG_QUESTION, header, event_msg, NULL,
1220
1229
event_pending_subscribe_func, NULL);
1222
1231
g_free (event_msg);
1223
1232
g_free (header);
1235
g_object_unref (contact);
1239
event_manager_publish_state_changed_cb (TpContact *contact,
1241
EmpathyEventManager *self)
1243
check_publish_state (self, contact);
1289
1309
g_object_unref (window);
1293
event_manager_members_changed_cb (EmpathyContactList *list,
1294
EmpathyContact *contact,
1295
EmpathyContact *actor,
1299
EmpathyEventManager *manager)
1302
g_signal_connect (contact, "presence-changed",
1303
G_CALLBACK (event_manager_presence_changed_cb), manager);
1305
g_signal_handlers_disconnect_by_func (contact,
1306
event_manager_presence_changed_cb, manager);
1309
1312
static GObject *
1310
1313
event_manager_constructor (GType type,
1338
1341
g_slist_free (priv->events);
1339
1342
g_slist_foreach (priv->approvals, (GFunc) event_manager_approval_free, NULL);
1340
1343
g_slist_free (priv->approvals);
1341
g_object_unref (priv->contact_manager);
1344
g_object_unref (priv->conn_aggregator);
1342
1345
g_object_unref (priv->approver);
1343
1346
g_object_unref (priv->auth_approver);
1344
1347
g_object_unref (priv->gsettings_notif);
1345
1348
g_object_unref (priv->gsettings_ui);
1346
1349
g_object_unref (priv->sound_mgr);
1350
g_hash_table_unref (priv->contacts);
1393
contact_list_changed_cb (EmpathyConnectionAggregator *aggregator,
1396
EmpathyEventManager *self)
1398
EmpathyEventManagerPriv *priv = GET_PRIV (self);
1401
for (i = 0; i < added->len; i++)
1403
TpContact *tp_contact = g_ptr_array_index (added, i);
1404
EmpathyContact *contact;
1406
if (g_hash_table_lookup (priv->contacts, tp_contact) != NULL)
1409
contact = empathy_contact_dup_from_tp_contact (tp_contact);
1411
tp_g_signal_connect_object (contact, "presence-changed",
1412
G_CALLBACK (event_manager_presence_changed_cb), self, 0);
1414
tp_g_signal_connect_object (tp_contact, "notify::publish-state",
1415
G_CALLBACK (event_manager_publish_state_changed_cb), self, 0);
1417
check_publish_state (self, tp_contact);
1419
/* Pass ownership to the hash table */
1420
g_hash_table_insert (priv->contacts, g_object_ref (tp_contact), contact);
1423
for (i = 0; i < removed->len; i++)
1425
TpContact *tp_contact = g_ptr_array_index (removed, i);
1426
EmpathyContact *contact;
1428
contact = g_hash_table_lookup (priv->contacts, tp_contact);
1429
if (contact == NULL)
1432
g_signal_handlers_disconnect_by_func (contact,
1433
event_manager_presence_changed_cb, self);
1435
g_signal_handlers_disconnect_by_func (tp_contact,
1436
event_manager_publish_state_changed_cb, self);
1438
g_hash_table_remove (priv->contacts, tp_contact);
1389
1443
empathy_event_manager_init (EmpathyEventManager *manager)
1391
1445
EmpathyEventManagerPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (manager,
1392
1446
EMPATHY_TYPE_EVENT_MANAGER, EmpathyEventManagerPriv);
1393
1447
GError *error = NULL;
1394
1448
TpAccountManager *am;
1449
GPtrArray *contacts, *empty;
1396
1451
manager->priv = priv;
1401
1456
priv->sound_mgr = empathy_sound_manager_dup_singleton ();
1403
priv->contact_manager = empathy_contact_manager_dup_singleton ();
1404
g_signal_connect (priv->contact_manager, "pendings-changed",
1405
G_CALLBACK (event_manager_pendings_changed_cb), manager);
1407
g_signal_connect (priv->contact_manager, "members-changed",
1408
G_CALLBACK (event_manager_members_changed_cb), manager);
1458
priv->contacts = g_hash_table_new_full (NULL, NULL, g_object_unref,
1461
priv->conn_aggregator = empathy_connection_aggregator_dup_singleton ();
1463
tp_g_signal_connect_object (priv->conn_aggregator, "contact-list-changed",
1464
G_CALLBACK (contact_list_changed_cb), manager, 0);
1466
contacts = empathy_connection_aggregator_dup_all_contacts (
1467
priv->conn_aggregator);
1469
empty = g_ptr_array_new ();
1471
contact_list_changed_cb (priv->conn_aggregator, contacts, empty, manager);
1473
g_ptr_array_unref (contacts);
1474
g_ptr_array_unref (empty);
1410
1476
am = tp_account_manager_dup ();