Connection Managers

Support for the various communication protocols is provided by several Connection Managers. For instance, the telepathy-gabble Connection Manager provides support for the XMPP protocol, also known as Jabber.

There is no central Telepathy D-Bus service in Telepathy. Instead there are several connection manager services, activated on demand. Each connection manager implements the Telepathy specification, allowing a Telepathy client to utilise any messaging protocol.

All Telepathy Connection Managers have bus names that begin with "org.freedesktop.Telepathy.ConnectionManager". You can discover all available connection managers by calling the D-Bus ListActivatableNames method and then comparing the names with that prefix.

A Connection Manager may implement more than one protocol (e.g. telepathy-haze is a connection manager using libpurple and thus provides many protocols). You may then discover what protocols are provided by each connection manager by calling the ConnectionManagers's ListProtocols method.

In general, there is little need for a client to interact much with the ConnectionManager interface. Most of the work in obtaining and managing connections should be done via Mission Control.

5.1.1. telepathy-glib

telepathy-glib provides the tp_list_connection_managers function to list the available connection managers. This is demonstrated in Example 5-1.

telepathy-glib's TpConnectionManager object automatically calls ListProtocols upon creation and emits the got-info signal when it has returned. You can examine the TpConnectionManager::protocols struct field in your signal handler.

Example 5-1tp_list_connection_managers Example
static void
get_connection_managers (TpDBusDaemon *bus_daemon)
{
        /* let's get a list of the connection managers */
        tp_list_connection_managers (bus_daemon, got_connection_managers,
                        NULL, NULL, NULL);
}

static void
got_connection_managers (TpConnectionManager    * const * cms,
                         gsize                   ncms,
                         const GError           *error,
                         gpointer                user_data,
                         GObject                *weak_object)
{
        g_print (" > got_connection_managers\n");

        /* From the documentation:
         *  tp_list_connection_managers() will wait for each
         *  TpConnectionManager to become ready, so all connection managers
         *  passed to callback will be ready */

        int i;
        for (i = 0; i < ncms; i++)
        {
                TpConnectionManager *cm = cms[i];

                if (!tp_connection_manager_is_ready (cm))
                {
                        /* this should never happen, unless there is an
                         * error */
                        g_print ("CM not ready!\n");
                        continue;
                }

                g_print (" - %s\n", cm->name);

                /* get the protocols */
                const TpConnectionManagerProtocol * const *iter;
                for (iter = cm->protocols; iter && *iter; iter++)
                {
                        const TpConnectionManagerProtocol *prot = *iter;
                        g_print ("   . %s\n", prot->name);
                }
        }
}

Complete Source Code