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.pcln -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 installConnection 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