## TpBaseChannel TpBaseChannel — base class for TpExportableChannel implementations |

## Synopsis

    #include <telepathy-glib/base-channel.h>

                        TpBaseChannel;
                        TpBaseChannelClass;
    void                (*TpBaseChannelFillPropertiesFunc)  (TpBaseChannel *chan,
                                                             GHashTable *properties);
    void                (*TpBaseChannelCloseFunc)           (TpBaseChannel *chan);
    gchar *             (*TpBaseChannelGetPathFunc)         (TpBaseChannel *chan);
    void                tp_base_channel_register            (TpBaseChannel *chan);
    void                tp_base_channel_close               (TpBaseChannel *chan);
    void                tp_base_channel_destroyed           (TpBaseChannel *chan);
    void                tp_base_channel_reopened            (TpBaseChannel *chan,
                                                             TpHandle initiator);
    const gchar *       tp_base_channel_get_object_path     (TpBaseChannel *chan);
    TpBaseConnection *  tp_base_channel_get_connection      (TpBaseChannel *chan);
    TpHandle            tp_base_channel_get_target_handle   (TpBaseChannel *chan);
    TpHandle            tp_base_channel_get_initiator       (TpBaseChannel *chan);
    gboolean            tp_base_channel_is_requested        (TpBaseChannel *chan);
    gboolean            tp_base_channel_is_registered       (TpBaseChannel *chan);
    gboolean            tp_base_channel_is_destroyed        (TpBaseChannel *chan);

## Object Hierarchy

      GObject
       +----TpBaseChannel

## Implemented Interfaces

TpBaseChannel implements TpSvcDBusProperties, TpSvcChannel, TpChannelIface and TpExportableChannel.

## Properties

      "connection"               TpBaseConnection*     : Read / Write / Construct Only
      "initiator-handle"         guint                 : Read / Write / Construct Only
      "initiator-id"             gchar*                : Read
      "interfaces"               GStrv*                : Read
      "requested"                gboolean              : Read / Write / Construct Only
      "target-id"                gchar*                : Read

## Description

This base class makes it easier to write TpExportableChannel implementations by implementing some of its properties, and defining other relevant properties.

Subclasses should fill in TpBaseChannelClass.channel_type, TpBaseChannelClass.target_handle_type and TpBaseChannelClass.interfaces, and implement the TpBaseChannelClass.close virtual function.

If the channel type and/or interfaces being implemented define immutable D-Bus properties besides those on the Channel interface, the subclass should implement the TpBaseChannelClass.fill_immutable_properties virtual function.

If the "object-path" property is not set at construct time, the TpBaseChannelClass.get_object_path_suffix virtual function will be called to determine the channel's path, whose default implementation simply generates a unique path based on the object's address in memory.

## Details

### TpBaseChannel

    typedef struct _TpBaseChannel TpBaseChannel;

A base class for channel implementations

Since 0.11.14

### TpBaseChannelClass

    typedef struct {
      TpDBusPropertiesMixinClass dbus_props_class;

      const gchar *channel_type;
      TpHandleType target_handle_type;
      const gchar **interfaces;

      TpBaseChannelCloseFunc close;
      TpBaseChannelFillPropertiesFunc fill_immutable_properties;
      TpBaseChannelGetPathFunc get_object_path_suffix;
    } TpBaseChannelClass;

The class structure for TpBaseChannel

TpDBusPropertiesMixinClass `dbus_props_class`; | The class structure for the DBus properties mixin
const gchar *`channel_type`; | The type of channel that instances of this class represent (e.g. TP_IFACE_CHANNEL_TYPE_TEXT)
TpHandleType `target_handle_type`; | The type of handle that is the target of channels of this type
const gchar **`interfaces`; | Extra interfaces provided by this channel (this SHOULD NOT include the channel type and interface itself)
TpBaseChannelCloseFunc `close`; | A virtual function called to close the channel, which will be called by `tp_base_channel_close()` and by the implementation of the Closed D-Bus method.
TpBaseChannelFillPropertiesFunc `fill_immutable_properties`; | A virtual function called to add custom properties to the DBus properties hash. Implementations must chain up to the parent class implementation and call `tp_dbus_properties_mixin_fill_properties_hash()` on the supplied hash table
TpBaseChannelGetPathFunc `get_object_path_suffix`; | Returns a string that will be appended to the Connection objects's object path to get the Channel's object path. This function will only be called as a fallback if the "object-path" property is not set. The default implementation simply generates a unique path based on the object's address in memory. The returned string will be freed automatically.

Since 0.11.14

### TpBaseChannelFillPropertiesFunc ()

    void                (*TpBaseChannelFillPropertiesFunc)  (TpBaseChannel *chan,
                                                             GHashTable *properties);

Signature of an implementation of the TpBaseChannelClass.fill_immutable_properties virtual function. A typical implementation, for a channel implementing TpSvcChannelTypeContactSearch, would be:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    static void
    my_search_channel_fill_properties (
        TpBaseChannel *chan,
        GHashTable *properties)
    {
      TpBaseChannelClass *klass = TP_BASE_CHANNEL_CLASS (my_search_channel_parent_class);

      klass->fill_immutable_properties (chan, properties);

      tp_dbus_properties_mixin_fill_properties_hash (
          G_OBJECT (chan), properties,
          TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH, "Limit",
          TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH, "AvailableSearchKeys",
          TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH, "Server",
          NULL);
    }

Note that the SearchState property is not added to `properties`, since only immutable properties (whose value cannot change over the lifetime of `chan`) should be included.

`chan` : | a channel
`properties` : | a dictionary of `chan`'s immutable properties, which the implementation may add to using `tp_dbus_properties_mixin_fill_properties_hash()`

Since 0.11.14

### TpBaseChannelCloseFunc ()

    void                (*TpBaseChannelCloseFunc)           (TpBaseChannel *chan);

Signature of an implementation of the TpBaseChannelClass.close virtual function. Implementations should eventually call either `tp_base_channel_destroyed()` if the channel is really closed as a result, or `tp_base_channel_reopened()` if the channel will be re-spawned (for instance, due to unacknowledged messages on a text channel), but need not do so before returning. Note that channels that support re-spawning must also implement TpSvcChannelInterfaceDestroyable.

Implementations may assume that `tp_base_channel_is_destroyed()` is FALSE for `chan` when called. Note that if this function is implemented asynchronously, it may be called more than once. A subclass which needs to perform some asynchronous clean-up in order to close might implement this function as follows:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    static void
    my_channel_close (TpBaseChannel *chan)
    {
      MyChannel *self = MY_CHANNEL (chan);

      if (self->priv->closing)
        return;

      self->priv->closing = TRUE;

      // some hypothetical channel-specific clean-up function:
      clean_up (self, cleaned_up_cb);
    }

    static void
    cleaned_up_cb (MyChannel *self)
    {
      // all done, we can finish closing now
      tp_base_channel_destroyed (TP_BASE_CHANNEL (self));
    }
    static void
    my_channel_class_init (MyChannelClass *klass)
    {
      TpBaseChannelClass *base_channel_class = TP_BASE_CHANNEL_CLASS (klass);

      klass->close = my_channel_close;
      // ...
    }

If a subclass does not need to do anything to clean itself up, it may implement TpBaseChannelClass.close using `tp_base_channel_destroyed()` directly:

    1
    2
    3
    4
    5
    6
    7
    8
    static void
    my_channel_class_init (MyChannelClass *klass)
    {
      TpBaseChannelClass *base_channel_class = TP_BASE_CHANNEL_CLASS (klass);

      klass->close = tp_base_channel_destroyed;
      // ...
    }

`chan` : | a channel

Since 0.11.14

### TpBaseChannelGetPathFunc ()

    gchar *             (*TpBaseChannelGetPathFunc)         (TpBaseChannel *chan);

Signature of an implementation of the TpBaseChannelClass.get_object_path_suffix virtual function.

`chan` : | a channel
Returns : | a string that will be appended to the Connection objects's object path to get the Channel's object path. [transfer full]

Since 0.11.14

### tp_base_channel_register ()

    void                tp_base_channel_register            (TpBaseChannel *chan);

Make the channel appear on the bus. "object-path" must have been set to a valid path, which must not already be in use as another object's path.

`chan` : | a channel

Since 0.11.14

### tp_base_channel_close ()

    void                tp_base_channel_close               (TpBaseChannel *chan);

Asks `chan` to close, just as if the Close D-Bus method had been called. If "channel-destroyed" is TRUE, this is a no-op.

Note that, depending on the subclass's implementation of TpBaseChannelClass.close and internal behaviour, this may or may not be a suitable method to use during connection teardown. For instance, if the channel may respawn when Close is called, an equivalent of the Destroy D-Bus method would be more appropriate during teardown, since the intention is to forcibly terminate all channels.

`chan` : | a channel

Since 0.11.14

### tp_base_channel_destroyed ()

    void                tp_base_channel_destroyed           (TpBaseChannel *chan);

Called by subclasses to indicate that this channel was destroyed and can be removed from the bus. The "Closed" signal will be emitted and the "channel-destroyed" property will be set.

`chan` : | a channel

Since 0.11.14

### tp_base_channel_reopened ()

    void                tp_base_channel_reopened            (TpBaseChannel *chan,
                                                             TpHandle initiator);

Called by subclasses to indicate that this channel was closed but was re-opened due to pending messages. The "Closed" signal will be emitted, but the "channel-destroyed" property will not be set. The channel's "initiator-handle" property will be set to `initiator`, and the "requested" property will be set to FALSE.

`chan` : | a channel
`initiator` : | the handle of the contact that re-opened the channel

Since 0.11.14

### tp_base_channel_get_object_path ()

    const gchar *       tp_base_channel_get_object_path     (TpBaseChannel *chan);

Returns `chan`'s object path, as a shortcut for retrieving the "object-path" property.

`chan` : | a channel
Returns : | `chan`'s object path. [transfer none]

Since 0.11.14

### tp_base_channel_get_connection ()

    TpBaseConnection *  tp_base_channel_get_connection      (TpBaseChannel *chan);

Returns the connection to which `chan` is attached, as a shortcut for retrieving the "connection" property.

`chan` : | a channel
Returns : | the connection to which `chan` is attached. [transfer none]

Since 0.11.14

### tp_base_channel_get_target_handle ()

    TpHandle            tp_base_channel_get_target_handle   (TpBaseChannel *chan);

Returns the target handle of `chan` (without a reference), which will be 0 if TpBaseChannelClass.target_handle_type is TP_HANDLE_TYPE_NONE for this class, and non-zero otherwise. This is a shortcut for retrieving the "handle" property. The reference count of the handle is not increased; you should use `tp_handle_ref()` if you want to keep a hold of it.

`chan` : | a channel
Returns : | the target handle of `chan`

Since 0.11.14

### tp_base_channel_get_initiator ()

    TpHandle            tp_base_channel_get_initiator       (TpBaseChannel *chan);

Returns the initiator handle of `chan`, as a shortcut for retrieving the "initiator-handle" property. The reference count of the handle is not increased; you should use `tp_handle_ref()` if you want to keep a hold of it.

`chan` : | a channel
Returns : | the initiator handle of `chan`

Since 0.11.14

### tp_base_channel_is_requested ()

    gboolean            tp_base_channel_is_requested        (TpBaseChannel *chan);

Returns whether or not `chan` was requested, as a shortcut for retrieving the "requested" property.

`chan` : | a channel
Returns : | whether or not `chan` was requested.

Since 0.11.14

### tp_base_channel_is_registered ()

    gboolean            tp_base_channel_is_registered       (TpBaseChannel *chan);

Returns whether or not `chan` is visible on the bus; that is, whether `tp_base_channel_register()` has been called and `tp_base_channel_destroyed()` has not been called.

`chan` : | a channel
Returns : | TRUE if `chan` is visible on the bus

Since 0.11.14

### tp_base_channel_is_destroyed ()

    gboolean            tp_base_channel_is_destroyed        (TpBaseChannel *chan);

Returns the value of the "channel-destroyed" property, which is TRUE if `tp_base_channel_destroyed()` has been called (and thus the channel has been removed from the bus).

`chan` : | a channel
Returns : | TRUE if `tp_base_channel_destroyed()` has been called.

Since 0.11.14

## Property Details

### The `"connection"` property

      "connection"               TpBaseConnection*     : Read / Write / Construct Only

Connection object that owns this channel.

### The `"initiator-handle"` property

      "initiator-handle"         guint                 : Read / Write / Construct Only

The contact who initiated the channel.

Default value: 0

### The `"initiator-id"` property

      "initiator-id"             gchar*                : Read

The string obtained by inspecting the initiator-handle.

Default value: NULL

### The `"interfaces"` property

      "interfaces"               GStrv*                : Read

Additional Channel.Interface.* interfaces.

### The `"requested"` property

      "requested"                gboolean              : Read / Write / Construct Only

True if this channel was requested by the local user.

Default value: FALSE

### The `"target-id"` property

      "target-id"                gchar*                : Read

The string obtained by inspecting the target handle.

Default value: NULL

## See Also

TpSvcChannel