static void do_constructed (GObject *object) { EmpathyTpFile *self = (EmpathyTpFile *) object; g_signal_connect (self->priv->channel, "invalidated", G_CALLBACK (tp_file_invalidated_cb), self); self->priv->incoming = !tp_channel_get_requested (self->priv->channel); tp_cli_channel_type_file_transfer_connect_to_file_transfer_state_changed ( self->priv->channel, tp_file_state_changed_cb, NULL, NULL, object, NULL); tp_cli_channel_type_file_transfer_connect_to_transferred_bytes_changed ( self->priv->channel, tp_file_transferred_bytes_changed_cb, NULL, NULL, object, NULL); tp_cli_dbus_properties_call_get (self->priv->channel, -1, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "State", tp_file_get_state_cb, NULL, NULL, object); tp_cli_dbus_properties_call_get (self->priv->channel, -1, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "AvailableSocketTypes", tp_file_get_available_socket_types_cb, NULL, NULL, object); self->priv->state_change_reason = TP_FILE_TRANSFER_STATE_CHANGE_REASON_NONE; }
static void file_transfer_channel_ready (TpChannel *channel, const GError *in_error, gpointer user_data) { GError *error = NULL; handle_error (in_error); GHashTable *map = tp_channel_borrow_immutable_properties (channel); const char *filename = tp_asv_get_string (map, TP_PROP_CHANNEL_TYPE_FILE_TRANSFER_FILENAME); guint64 size = tp_asv_get_uint64 (map, TP_PROP_CHANNEL_TYPE_FILE_TRANSFER_SIZE, NULL); g_print ("New file transfer to %s -- `%s' (%llu bytes)\n", tp_channel_get_identifier (channel), filename, size); /* File transfers in Telepathy work by opening a socket to the * Connection Manager and streaming the file over that socket. * Let's find out what manner of sockets are supported by this CM */ GHashTable *sockets = tp_asv_get_boxed (map, TP_PROP_CHANNEL_TYPE_FILE_TRANSFER_AVAILABLE_SOCKET_TYPES, TP_HASH_TYPE_SUPPORTED_SOCKET_MAP); /* let's try for IPv4 */ if (g_hash_table_lookup (sockets, GINT_TO_POINTER (TP_SOCKET_ADDRESS_TYPE_IPV4))) { g_print ("ipv4 supported\n"); } else if (g_hash_table_lookup (sockets, GINT_TO_POINTER (TP_SOCKET_ADDRESS_TYPE_UNIX))) { struct ft_state *state = g_slice_new0 (struct ft_state); state->sa.sun_family = AF_UNIX; tp_cli_channel_type_file_transfer_connect_to_file_transfer_state_changed ( channel, file_transfer_unix_state_changed_cb, state, NULL, NULL, &error); handle_error (error); GValue *value = tp_g_value_slice_new_static_string (""); /* set up the socket for providing the file */ tp_cli_channel_type_file_transfer_call_provide_file ( channel, -1, TP_SOCKET_ADDRESS_TYPE_UNIX, TP_SOCKET_ACCESS_CONTROL_LOCALHOST, value, file_transfer_unix_cb, state, NULL, NULL); tp_g_value_slice_free (value); } }