/* * Factory creating higher level proxy objects * * Copyright © 2010 Collabora Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /** * SECTION:automatic-proxy-factory * @title: TpAutomaticProxyFactory * @short_description: factory creating higher level proxy objects * @see_also: #TpBasicProxyFactory * * This factory implements the #TpClientChannelFactoryInterface interface to * create specialized #TpChannel subclasses. * * #TpAutomaticProxyFactory will currently create #TpChannel objects * as follows: * * * * a #TpStreamTubeChannel, if the channel is of type * %TP_IFACE_CHANNEL_TYPE_STREAM_TUBE; * * * a #TpTextChannel, if the channel is of type * %TP_IFACE_CHANNEL_TYPE_TEXT and implements * %TP_IFACE_CHANNEL_INTERFACE_MESSAGES; * * * a plain #TpChannel, otherwise * * * * It is guaranteed that the objects returned by future versions * will be either the class that is currently used, or a more specific * subclass of that class. * * This factory asks to prepare the following properties: * * * * %TP_CHANNEL_FEATURE_CORE and %TP_CHANNEL_FEATURE_GROUP for all * type of channels. * * * %TP_TEXT_CHANNEL_FEATURE_INCOMING_MESSAGES for * #TpTextChannel * * * * TpProxy subclasses other than TpChannel are not currently supported. * * Since: 0.13.2 */ /** * TpAutomaticProxyFactory: * * Data structure representing a #TpAutomaticProxyFactory * * Since: 0.13.2 */ /** * TpAutomaticProxyFactoryClass: * @parent_class: the parent class * * The class of a #TpAutomaticProxyFactory. * * Since: 0.13.2 */ #include "telepathy-glib/automatic-proxy-factory.h" #include #include #include #include #include #include #define DEBUG_FLAG TP_DEBUG_CLIENT #include "telepathy-glib/debug-internal.h" static void client_proxy_factory_iface_init (gpointer, gpointer); G_DEFINE_TYPE_WITH_CODE(TpAutomaticProxyFactory, tp_automatic_proxy_factory, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (TP_TYPE_CLIENT_CHANNEL_FACTORY, client_proxy_factory_iface_init)) static void tp_automatic_proxy_factory_init (TpAutomaticProxyFactory *self) { } static void tp_automatic_proxy_factory_class_init (TpAutomaticProxyFactoryClass *cls) { } static TpChannel * tp_automatic_proxy_factory_create_channel_impl ( TpConnection *conn, const gchar *path, GHashTable *properties, GError **error) { const gchar *chan_type; chan_type = tp_asv_get_string (properties, TP_PROP_CHANNEL_CHANNEL_TYPE); if (!tp_strdiff (chan_type, TP_IFACE_CHANNEL_TYPE_STREAM_TUBE)) { return TP_CHANNEL (tp_stream_tube_channel_new (conn, path, properties, error)); } else if (!tp_strdiff (chan_type, TP_IFACE_CHANNEL_TYPE_TEXT)) { /* Create a TpTextChannel only if the channel supports Messages */ const gchar * const * interfaces; interfaces = tp_asv_get_strv (properties, TP_PROP_CHANNEL_INTERFACES); if (tp_strv_contains (interfaces, TP_IFACE_CHANNEL_INTERFACE_MESSAGES)) return TP_CHANNEL (tp_text_channel_new (conn, path, properties, error)); DEBUG ("channel %s doesn't implement Messages so we can't create " "a TpTextChannel", path); } return tp_channel_new_from_properties (conn, path, properties, error); } static TpChannel * tp_automatic_proxy_factory_create_channel ( TpClientChannelFactoryInterface *iface G_GNUC_UNUSED, TpConnection *conn, const gchar *path, GHashTable *properties, GError **error) { return tp_automatic_proxy_factory_create_channel_impl (conn, path, properties, error); } static TpChannel * tp_automatic_proxy_factory_obj_create_channel ( TpClientChannelFactory *self G_GNUC_UNUSED, TpConnection *conn, const gchar *path, GHashTable *properties, GError **error) { return tp_automatic_proxy_factory_create_channel_impl (conn, path, properties, error); } static GArray * tp_automatic_proxy_factory_dup_channel_features_impl (TpChannel *channel) { GArray *features; GQuark feature; features = g_array_sized_new (TRUE, FALSE, sizeof (GQuark), 2); feature = TP_CHANNEL_FEATURE_CORE; g_array_append_val (features, feature); feature = TP_CHANNEL_FEATURE_GROUP; g_array_append_val (features, feature); if (TP_IS_TEXT_CHANNEL (channel)) { feature = TP_TEXT_CHANNEL_FEATURE_INCOMING_MESSAGES; g_array_append_val (features, feature); } return features; } static GArray * tp_automatic_proxy_factory_obj_dup_channel_features ( TpClientChannelFactory *self G_GNUC_UNUSED, TpChannel *channel) { return tp_automatic_proxy_factory_dup_channel_features_impl (channel); } static GArray * tp_automatic_proxy_factory_dup_channel_features ( TpClientChannelFactoryInterface *iface G_GNUC_UNUSED, TpChannel *channel) { return tp_automatic_proxy_factory_dup_channel_features_impl (channel); } static void client_proxy_factory_iface_init (gpointer g_iface, gpointer unused G_GNUC_UNUSED) { TpClientChannelFactoryInterface *iface = g_iface; iface->create_channel = tp_automatic_proxy_factory_create_channel; iface->dup_channel_features = tp_automatic_proxy_factory_dup_channel_features; iface->obj_create_channel = tp_automatic_proxy_factory_obj_create_channel; iface->obj_dup_channel_features = tp_automatic_proxy_factory_obj_dup_channel_features; } /** * tp_automatic_proxy_factory_new: * * Convenient function to create a new #TpAutomaticProxyFactory instance. * * Returns: a new #TpAutomaticProxyFactory * * Since: 0.13.2 */ TpAutomaticProxyFactory * tp_automatic_proxy_factory_new (void) { return g_object_new (TP_TYPE_AUTOMATIC_PROXY_FACTORY, NULL); } /** * tp_automatic_proxy_factory_dup: * * Returns a cached #TpAutomaticProxyFactory; the same * #TpAutomaticProxyFactory object will be returned by this function repeatedly, * as long as at least one reference exists. * * Returns: (transfer full): a #TpAutomaticProxyFactory * * Since: 0.13.2 */ TpAutomaticProxyFactory * tp_automatic_proxy_factory_dup (void) { static TpAutomaticProxyFactory *singleton = NULL; if (singleton != NULL) return g_object_ref (singleton); singleton = tp_automatic_proxy_factory_new (); g_object_add_weak_pointer (G_OBJECT (singleton), (gpointer) &singleton); return singleton; }