2 * Copyright (C) 2008 Collabora Ltd.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 * Authors: Xavier Claessens <xclaesse@gmail.com>
19 * Elliot Fairweather <elliot.fairweather@collabora.co.uk>
24 #include <dbus/dbus-glib.h>
26 #include <telepathy-glib/dbus.h>
27 #include <telepathy-glib/connection.h>
28 #include <telepathy-glib/channel.h>
29 #include <telepathy-glib/interfaces.h>
30 #include <telepathy-glib/util.h>
32 #include <extensions/extensions.h>
34 #include "empathy-tp-tube.h"
35 #include "empathy-tube-handler.h"
37 #define DEBUG_FLAG EMPATHY_DEBUG_OTHER
38 #include "empathy-debug.h"
40 static void empathy_tube_handler_iface_init (EmpSvcTubeHandlerClass
*klass
);
48 static guint signals
[LAST_SIGNAL
];
50 G_DEFINE_TYPE_WITH_CODE (EmpathyTubeHandler
, empathy_tube_handler
,
51 G_TYPE_OBJECT
, G_IMPLEMENT_INTERFACE (EMP_TYPE_SVC_TUBE_HANDLER
,
52 empathy_tube_handler_iface_init
))
56 EmpathyTubeHandler
*thandler
;
65 tube_handler_handle_tube_idle_cb (gpointer data
)
67 IdleData
*idle_data
= data
;
68 TpConnection
*connection
;
71 static TpDBusDaemon
*daemon
= NULL
;
73 DEBUG ("New tube to be handled");
76 daemon
= tp_dbus_daemon_new (tp_get_bus ());
78 connection
= tp_connection_new (daemon
, idle_data
->bus_name
,
79 idle_data
->connection
, NULL
);
80 channel
= tp_channel_new (connection
, idle_data
->channel
,
81 TP_IFACE_CHANNEL_TYPE_TUBES
, idle_data
->handle_type
,
82 idle_data
->handle
, NULL
);
83 tp_channel_run_until_ready (channel
, NULL
, NULL
);
85 tube
= empathy_tp_tube_new (channel
);
86 g_signal_emit (idle_data
->thandler
, signals
[NEW_TUBE
], 0, tube
);
88 g_object_unref (tube
);
89 g_object_unref (channel
);
90 g_object_unref (connection
);
91 g_free (idle_data
->bus_name
);
92 g_free (idle_data
->connection
);
93 g_free (idle_data
->channel
);
94 g_slice_free (IdleData
, idle_data
);
100 tube_handler_handle_tube (EmpSvcTubeHandler
*self
,
101 const gchar
*bus_name
,
102 const gchar
*connection
,
103 const gchar
*channel
,
106 DBusGMethodInvocation
*context
)
108 EmpathyTubeHandler
*thandler
= EMPATHY_TUBE_HANDLER (self
);
111 data
= g_slice_new (IdleData
);
112 data
->thandler
= thandler
;
113 data
->bus_name
= g_strdup (bus_name
);
114 data
->connection
= g_strdup (connection
);
115 data
->channel
= g_strdup (channel
);
116 data
->handle_type
= handle_type
;
117 data
->handle
= handle
;
119 g_idle_add_full (G_PRIORITY_HIGH
, tube_handler_handle_tube_idle_cb
,
122 emp_svc_tube_handler_return_from_handle_tube (context
);
126 empathy_tube_handler_class_init (EmpathyTubeHandlerClass
*klass
)
129 g_signal_new ("new-tube", G_OBJECT_CLASS_TYPE (klass
),
130 G_SIGNAL_RUN_LAST
, 0, NULL
, NULL
, g_cclosure_marshal_VOID__OBJECT
,
131 G_TYPE_NONE
, 1, EMPATHY_TYPE_TP_TUBE
);
135 empathy_tube_handler_iface_init (EmpSvcTubeHandlerClass
*klass
)
137 emp_svc_tube_handler_implement_handle_tube (klass
,
138 tube_handler_handle_tube
);
142 empathy_tube_handler_init (EmpathyTubeHandler
*thandler
)
147 empathy_tube_handler_new (TpTubeType type
, const gchar
*service
)
149 EmpathyTubeHandler
*thandler
= NULL
;
154 GError
*error
= NULL
;
156 g_return_val_if_fail (type
< NUM_TP_TUBE_TYPES
, NULL
);
157 g_return_val_if_fail (service
!= NULL
, NULL
);
159 bus_name
= empathy_tube_handler_build_bus_name (type
, service
);
160 object_path
= empathy_tube_handler_build_object_path (type
, service
);
162 proxy
= dbus_g_proxy_new_for_name (tp_get_bus (), DBUS_SERVICE_DBUS
,
163 DBUS_PATH_DBUS
, DBUS_INTERFACE_DBUS
);
165 if (!dbus_g_proxy_call (proxy
, "RequestName", &error
,
166 G_TYPE_STRING
, bus_name
, G_TYPE_UINT
, DBUS_NAME_FLAG_DO_NOT_QUEUE
,
167 G_TYPE_INVALID
, G_TYPE_UINT
, &result
, G_TYPE_INVALID
))
169 DEBUG ("Failed to request name: %s",
170 error
? error
->message
: "No error given");
171 g_clear_error (&error
);
175 DEBUG ("Creating tube handler %s", bus_name
);
176 thandler
= g_object_new (EMPATHY_TYPE_TUBE_HANDLER
, NULL
);
177 dbus_g_connection_register_g_object (tp_get_bus (), object_path
,
178 G_OBJECT (thandler
));
181 g_object_unref (proxy
);
183 g_free (object_path
);
189 empathy_tube_handler_build_bus_name (TpTubeType type
,
190 const gchar
*service
)
193 const gchar
*prefix
= NULL
;
195 g_return_val_if_fail (type
< NUM_TP_TUBE_TYPES
, NULL
);
196 g_return_val_if_fail (service
!= NULL
, NULL
);
198 if (type
== TP_TUBE_TYPE_DBUS
)
199 prefix
= "org.gnome.Empathy.DTubeHandler.";
200 else if (type
== TP_TUBE_TYPE_STREAM
)
201 prefix
= "org.gnome.Empathy.StreamTubeHandler.";
203 g_return_val_if_reached (NULL
);
205 str
= g_strconcat (prefix
, service
, NULL
);
211 empathy_tube_handler_build_object_path (TpTubeType type
,
212 const gchar
*service
)
217 g_return_val_if_fail (type
< NUM_TP_TUBE_TYPES
, NULL
);
218 g_return_val_if_fail (service
!= NULL
, NULL
);
220 bus_name
= empathy_tube_handler_build_bus_name (type
, service
);
221 str
= g_strdelimit (g_strdup_printf ("/%s", bus_name
), ".", '/');