X-Git-Url: https://git.0d.be/?p=empathy.git;a=blobdiff_plain;f=libempathy%2Fempathy-tube-handler.c;h=43e19fde7207dbe2d31efc45e89c9634e8948f63;hp=146fe79ff167d1f2ab5788ce3fbb06a5eeb45b0e;hb=c8d23985b7754541cab512992294c19f5c87cfaa;hpb=d2381ad9d91773176a4a2daa309693cf39fc75bc diff --git a/libempathy/empathy-tube-handler.c b/libempathy/empathy-tube-handler.c index 146fe79f..43e19fde 100644 --- a/libempathy/empathy-tube-handler.c +++ b/libempathy/empathy-tube-handler.c @@ -59,19 +59,41 @@ typedef struct gchar *channel; guint handle_type; guint handle; - guint id; + EmpathyTpTube *tube; } IdleData; +static void +tube_ready_cb (EmpathyTpTube *tube, + const GError *error, + gpointer user_data, + GObject *weak_object) +{ + IdleData *idle_data = user_data; + + g_signal_emit (idle_data->thandler, signals[NEW_TUBE], 0, tube); +} + +static void +tube_ready_destroy_notify (gpointer data) +{ + IdleData *idle_data = data; + + g_object_unref (idle_data->tube); + g_free (idle_data->bus_name); + g_free (idle_data->connection); + g_free (idle_data->channel); + g_slice_free (IdleData, idle_data); +} + static gboolean tube_handler_handle_tube_idle_cb (gpointer data) { IdleData *idle_data = data; TpConnection *connection; TpChannel *channel; - EmpathyTpTube *tube; static TpDBusDaemon *daemon = NULL; - DEBUG ("New tube to be handled id=%d", idle_data->id); + DEBUG ("New tube to be handled"); if (!daemon) daemon = tp_dbus_daemon_new (tp_get_bus ()); @@ -83,16 +105,12 @@ tube_handler_handle_tube_idle_cb (gpointer data) idle_data->handle, NULL); tp_channel_run_until_ready (channel, NULL, NULL); - tube = empathy_tp_tube_new (channel, idle_data->id); - g_signal_emit (idle_data->thandler, signals[NEW_TUBE], 0, tube); + idle_data->tube = empathy_tp_tube_new (channel); + empathy_tp_tube_call_when_ready (idle_data->tube, tube_ready_cb, idle_data, + tube_ready_destroy_notify, NULL); - g_object_unref (tube); g_object_unref (channel); g_object_unref (connection); - g_free (idle_data->bus_name); - g_free (idle_data->connection); - g_free (idle_data->channel); - g_slice_free (IdleData, idle_data); return FALSE; } @@ -104,7 +122,6 @@ tube_handler_handle_tube (EmpSvcTubeHandler *self, const gchar *channel, guint handle_type, guint handle, - guint id, DBusGMethodInvocation *context) { EmpathyTubeHandler *thandler = EMPATHY_TUBE_HANDLER (self); @@ -117,7 +134,6 @@ tube_handler_handle_tube (EmpSvcTubeHandler *self, data->channel = g_strdup (channel); data->handle_type = handle_type; data->handle = handle; - data->id = id; g_idle_add_full (G_PRIORITY_HIGH, tube_handler_handle_tube_idle_cb, data, NULL); @@ -156,7 +172,7 @@ empathy_tube_handler_new (TpTubeType type, const gchar *service) gchar *object_path; GError *error = NULL; - g_return_val_if_fail (type <= TP_TUBE_TYPE_STREAM, NULL); + g_return_val_if_fail (type < NUM_TP_TUBE_TYPES, NULL); g_return_val_if_fail (service != NULL, NULL); bus_name = empathy_tube_handler_build_bus_name (type, service); @@ -175,6 +191,7 @@ empathy_tube_handler_new (TpTubeType type, const gchar *service) goto OUT; } + DEBUG ("Creating tube handler %s", bus_name); thandler = g_object_new (EMPATHY_TYPE_TUBE_HANDLER, NULL); dbus_g_connection_register_g_object (tp_get_bus (), object_path, G_OBJECT (thandler)); @@ -187,50 +204,62 @@ OUT: return thandler; } +static gchar * +sanitize_service_name (const gchar *str) +{ + guint i; + gchar *result; + + g_assert (str != NULL); + result = g_strdup (str); + + for (i = 0; result[i] != '\0'; i++) + { + if (!g_ascii_isalnum (result[i])) + result[i] = '_'; + } + + return result; +} + gchar * -empathy_tube_handler_build_bus_name (TpTubeType type, const gchar *service) +empathy_tube_handler_build_bus_name (TpTubeType type, + const gchar *service) { - gchar *service_escaped; gchar *str = NULL; const gchar *prefix = NULL; + gchar *service_escaped; - g_return_val_if_fail (type <= TP_TUBE_TYPE_STREAM, NULL); + g_return_val_if_fail (type < NUM_TP_TUBE_TYPES, NULL); g_return_val_if_fail (service != NULL, NULL); if (type == TP_TUBE_TYPE_DBUS) - prefix = "org.gnome.Empathy.DTubeHandler.%s"; + prefix = "org.gnome.Empathy.DTubeHandler."; else if (type == TP_TUBE_TYPE_STREAM) - prefix = "org.gnome.Empathy.StreamTubeHandler.%s"; + prefix = "org.gnome.Empathy.StreamTubeHandler."; else g_return_val_if_reached (NULL); - service_escaped = tp_escape_as_identifier (service); - str = g_strdup_printf (prefix, service_escaped); + service_escaped = sanitize_service_name (service); + str = g_strconcat (prefix, service_escaped, NULL); g_free (service_escaped); return str; } gchar * -empathy_tube_handler_build_object_path (TpTubeType type, const gchar *service) +empathy_tube_handler_build_object_path (TpTubeType type, + const gchar *service) { - gchar *service_escaped; - gchar *str = NULL; - const gchar *prefix = NULL; + gchar *bus_name; + gchar *str; - g_return_val_if_fail (type <= TP_TUBE_TYPE_STREAM, NULL); + g_return_val_if_fail (type < NUM_TP_TUBE_TYPES, NULL); g_return_val_if_fail (service != NULL, NULL); - if (type == TP_TUBE_TYPE_DBUS) - prefix = "/org/gnome/Empathy/DTubeHandler/%s"; - else if (type == TP_TUBE_TYPE_STREAM) - prefix = "/org/gnome/Empathy/StreamTubeHandler/%s"; - else - g_return_val_if_reached (NULL); - - service_escaped = tp_escape_as_identifier (service); - str = g_strdup_printf (prefix, service_escaped); - g_free (service_escaped); + bus_name = empathy_tube_handler_build_bus_name (type, service); + str = g_strdelimit (g_strdup_printf ("/%s", bus_name), ".", '/'); + g_free (bus_name); return str; }