HOWTO: Implementing custom connection managers

This document is released under the GPL license.

Introduction

This guide gives you a breaf introduction on how to implement a custom connection manager plugin for the Internet Tablet OS 2006. The messaging framework in Internet Tablet OS 2006 is based on Telepathy framework architecture. Telepathy provides D-Bus based framework that unifies all forms of real time communication like instant messaging, IRC, voice and video over Internet. The framework provides an interface for plugins to extend the protocol support by implementing new connection managers. These new supported protocols can then be used by all client applications that communicate via Telepathy framework architecture.

For any detailed information, see The Telepathy framework specification by the Freedesktop.org.

Since the connection manager uses D-Bus for communication it can be implemented using any language, even interpreted like Python, that supports D-Bus communication. In order to run on Internet tablets natively, however, C or C++ is currently preferred.

Example connection manager implementations

There exists several Telpathy connection manager implementation already in the open source. See, for instance, Gabble and Idle projects. In maemo 2.2 there exists a source package of telepathy-gabble which has been modified for maemo platform and packaged as a DEB package. The package can be downloaded from the 2.2 repository. The package can be build the usual way with dpkg-buildpackage.

Before compiling source code of Telepathy Idle the following steps need to be taken: First you need Sofia package, which can be downloaded from Sourceforge. Follow the compilation instructions of Sofia and after the build create symbolic links for pkg-config:

ln -s /usr/local/lib/pkgconfig/sofia-sip-ua.pc /usr/lib/pkgconfig/sofia-sip-ua.pc

ln -s /usr/local/lib/pkgconfig/sofia-sip-ua-glib.pc /usr/lib/pkgconfig/sofia-sip-ua-glib.pc

Now you are ready to build the Idle which can be done in the normal way using configure and make:

./configure ./make ./make install

Connection manager and connections

Telepathy connection managers establish the actual connections to IM or VoIP servers. A connection manager provides support for one or more connection protocols like SIP, for instance. Connection managers are started using D-Bus service activation, and they present a connection manager object to the bus. A connection can be eshtablished by sending a D-Bus message request to the connection manager object. A new D-Bus object is then created to handle the new connection. The D-Bus interface of a connection manager is:

org.freedesktop.Telepathy.ConnectionManager

Methods:

GetParameters ( s: proto ) -> a(susv)

ListProtocols ( ) -> as

RequestConnection ( s: proto, a{sv}: parameters ) -> so

NewConnection ( s: bus_name, o: object_path, s: proto )

The connection object provides the interfaces to basic connection signaling as well as requesting communication channels. The D-Bus interface of a connection is:

org.freedesktop.Telepathy.Connection

Methods:

Connect ( ) -> None

Disconnect ( ) -> None

GetInterfaces ( ) -> as

GetProtocol ( ) -> s

GetSelfHandle ( ) -> u

GetStatus ( ) -> u

HoldHandles ( u: handle_type, au: handles ) -> None

InspectHandles ( u: handle_type, au: handles ) -> as

ListChannels ( ) -> a(osuu)

ReleaseHandles ( u: handle_type, au: handles ) -> None

RequestChannel ( s: type, u: handle_type, u: handle, b: suppress_handler ) -> o

RequestHandles ( u: handle_type, as: names ) -> au

Signals:

NewChannel ( o: object_path, s: channel_type, u: handle_type, u: handle, b: suppress_handler )

StatusChanged ( u: status, u: reason )

Channels and channel types

Communication with the server and other contacts is carried out with instances of various channel types. The interface for creating, closing and handling channels is the following:

org.freedesktop.Telepathy.Channel

Methods:

Close ( ) -> None

GetChannelType ( ) -> s

GetHandle ( ) -> uu

GetInterfaces ( ) -> as

Signals:

Closed ( )

Various channel types are supported in the Telepathy framework to match with the nature of the real time communication protocol needs. For example, a text channel provides methods to send messages, and has signals to indicate that messages have been sent and received.

org.freedesktop.Telepathy.Channel.Type.ContactList

org.freedesktop.Telepathy.Channel.Type.ContactSearch

Methods:

GetSearchKeys ( ) -> sa{s(bg)}

GetSearchState ( ) -> u

Search ( a{sv}: terms ) -> None

Signals:

SearchResultReceived ( u: contact, a{sv}: values )

SearchStateChanged ( u: state )

org.freedesktop.Telepathy.Channel.Type.StreamedMedia

Methods:

ListStreams ( ) -> a(uuuuuu)

RemoveStreams ( au: streams ) -> None

RequestStreamDirection ( u: stream_id, u: stream_direction ) -> None

RequestStreams ( u: contact_handle, au: types ) -> a(uuuuuu)

Signals:

StreamAdded ( u: stream_id, u: contact_handle, u: stream_type )

StreamDirectionChanged ( u: stream_id, u: stream_direction, u: pending_flags )

StreamError ( u: stream_id, u: errno, s: message )

StreamRemoved ( u: stream_id )

StreamStateChanged ( u: stream_id, u: stream_state )

org.freedesktop.Telepathy.Channel.Type.RoomList

Methods:

GetListingRooms ( ) -> b

ListRooms ( ) -> None

Signals:

GotRooms ( a(usa{sv}): rooms )

ListingRooms ( b: listing )

org.freedesktop.Telepathy.Channel.Type.Text

Methods:

AcknowledgePendingMessages ( au: ids ) -> None

GetMessageTypes ( ) -> au

ListPendingMessages ( b: clear ) -> a(uuuuus)

Send ( u: type, s: text ) -> None

Signals:

LostMessage ( )

Received ( u: id, u: timestamp, u: sender, u: type, u: flags, s: text )

SendError ( u: error, u: timestamp, u: type, s: text )

Sent ( u: timestamp, u: type, s: text )

Additional connection interfaces

The connection interfaces can handle special needs of the connection protocol like aliasing which means that contacts can have an alias which they can change via the server. The D-Bus interfaces are presented here shortly below but see the specification for more details.

org.freedesktop.Telepathy.Connection.Interface.Aliasing

Methods:

GetAliasFlags ( ) -> u

RequestAliases ( au: contacts ) -> as

SetAliases ( a{us}: aliases ) -> None

Signals:

AliasesChanged ( a(us): aliases )

org.freedesktop.Telepathy.Connection.Interface.Avatars

Methods:

GetAvatarRequirements ( ) -> asqqqqu

GetAvatarTokens ( au: contacts ) -> as

RequestAvatar ( u: contact ) -> ays

SetAvatar ( ay: avatar, s: mime_type ) -> s

Signals:

AvatarUpdated ( u: contact, s: new_avatar_token )

org.freedesktop.Telepathy.Connection.Interface.Capabilities

Methods:

AdvertiseCapabilities ( a(su): add, as: remove ) -> a(su)

GetCapabilities ( au: handles ) -> a(usuu)

Signals:

CapabilitiesChanged ( a(usuuuu): caps )

org.freedesktop.Telepathy.Connection.Interface.ContactInfo

Methods:

RequestContactInfo ( u: contact ) -> None

Signals:

GotContactInfo ( u: contact, s: vcard )

org.freedesktop.Telepathy.Connection.Interface.Forwarding

Methods:

GetForwardingHandle ( ) -> u

SetForwardingHandle ( u: forward_to ) -> None

Signals:

ForwardingChanged ( u: forward_to )

org.freedesktop.Telepathy.Connection.Interface.Presence

Methods:

AddStatus ( s: status, a{sv}: parms ) -> None

ClearStatus ( ) -> None

GetStatuses ( ) -> a{s(ubba{ss})}

RemoveStatus ( s: status ) -> None

RequestPresence ( au: contacts ) -> None

SetLastActivityTime ( u: time ) -> None

SetStatus ( a{sa{sv}}: statuses ) -> None

Signals:

PresenceUpdate ( a{u(ua{sa{sv}})}: presence )

org.freedesktop.Telepathy.Connection.Interface.Privacy

Methods:

GetPrivacyMode ( ) -> s

GetPrivacyModes ( ) -> as

SetPrivacyMode ( s: mode ) -> None

Signals:

PrivacyModeChanged ( s: mode )

org.freedesktop.Telepathy.Connection.Interface.Renaming

Methods:

RequestRename ( s: name ) -> None

Signals:

Renamed ( u: original, u: new )


Improve this page