## TpSimpleClientFactory TpSimpleClientFactory — a factory for TpContacts and plain subclasses of TpProxy |

## Synopsis

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

                        TpSimpleClientFactory;
    struct              TpSimpleClientFactoryClass;
    TpSimpleClientFactory * tp_simple_client_factory_new    (TpDBusDaemon *dbus);
    TpDBusDaemon *      tp_simple_client_factory_get_dbus_daemon
                                                            (TpSimpleClientFactory *self);

    TpAccount *         tp_simple_client_factory_ensure_account
                                                            (TpSimpleClientFactory *self,
                                                             const gchar *object_path,
                                                             const GHashTable *immutable_properties,
                                                             GError **error);
    GArray *            tp_simple_client_factory_dup_account_features
                                                            (TpSimpleClientFactory *self,
                                                             TpAccount *account);
    void                tp_simple_client_factory_add_account_features
                                                            (TpSimpleClientFactory *self,
                                                             const GQuark *features);
    void                tp_simple_client_factory_add_account_features_varargs
                                                            (TpSimpleClientFactory *self,
                                                             GQuark feature,
                                                             ...);

    TpConnection *      tp_simple_client_factory_ensure_connection
                                                            (TpSimpleClientFactory *self,
                                                             const gchar *object_path,
                                                             const GHashTable *immutable_properties,
                                                             GError **error);
    GArray *            tp_simple_client_factory_dup_connection_features
                                                            (TpSimpleClientFactory *self,
                                                             TpConnection *connection);
    void                tp_simple_client_factory_add_connection_features
                                                            (TpSimpleClientFactory *self,
                                                             const GQuark *features);
    void                tp_simple_client_factory_add_connection_features_varargs
                                                            (TpSimpleClientFactory *self,
                                                             GQuark feature,
                                                             ...);

    TpChannel *         tp_simple_client_factory_ensure_channel
                                                            (TpSimpleClientFactory *self,
                                                             TpConnection *connection,
                                                             const gchar *object_path,
                                                             const GHashTable *immutable_properties,
                                                             GError **error);
    GArray *            tp_simple_client_factory_dup_channel_features
                                                            (TpSimpleClientFactory *self,
                                                             TpChannel *channel);
    void                tp_simple_client_factory_add_channel_features
                                                            (TpSimpleClientFactory *self,
                                                             const GQuark *features);
    void                tp_simple_client_factory_add_channel_features_varargs
                                                            (TpSimpleClientFactory *self,
                                                             GQuark feature,
                                                             ...);

    TpContact *         tp_simple_client_factory_ensure_contact
                                                            (TpSimpleClientFactory *self,
                                                             TpConnection *connection,
                                                             TpHandle handle,
                                                             const gchar *identifier);
    void                tp_simple_client_factory_upgrade_contacts_async
                                                            (TpSimpleClientFactory *self,
                                                             TpConnection *connection,
                                                             guint n_contacts,
                                                             TpContact * const *contacts,
                                                             GAsyncReadyCallback callback,
                                                             gpointer user_data);
    gboolean            tp_simple_client_factory_upgrade_contacts_finish
                                                            (TpSimpleClientFactory *self,
                                                             GAsyncResult *result,
                                                             GPtrArray **contacts,
                                                             GError **error);
    void                tp_simple_client_factory_ensure_contact_by_id_async
                                                            (TpSimpleClientFactory *self,
                                                             TpConnection *connection,
                                                             const gchar *identifier,
                                                             GAsyncReadyCallback callback,
                                                             gpointer user_data);
    TpContact *         tp_simple_client_factory_ensure_contact_by_id_finish
                                                            (TpSimpleClientFactory *self,
                                                             GAsyncResult *result,
                                                             GError **error);
    GArray *            tp_simple_client_factory_dup_contact_features
                                                            (TpSimpleClientFactory *self,
                                                             TpConnection *connection);
    void                tp_simple_client_factory_add_contact_features
                                                            (TpSimpleClientFactory *self,
                                                             guint n_features,
                                                             const TpContactFeature *features);
    void                tp_simple_client_factory_add_contact_features_varargs
                                                            (TpSimpleClientFactory *self,
                                                             TpContactFeature feature,
                                                             ...);

## Object Hierarchy

      GObject
       +----TpSimpleClientFactory
             +----TpAutomaticClientFactory

## Properties

      "dbus-daemon"              TpDBusDaemon*         : Read / Write / Construct Only

## Description

This factory constructs various TpProxy subclasses as well as TpContact, which guarantees that at most one instance of those objects will exist for a given remote object or contact. It also stores the desired features for contacts and each type of proxy.

Note that the factory will not prepare the desired features: it is the caller's responsibility to do so. By default, only core features are requested.

Currently supported classes are TpAccount, TpConnection, TpChannel and TpContact. Those objects should always be acquired through a factory or a "larger" object (e.g. getting the TpConnection from a TpAccount), rather than being constructed directly.

One can subclass TpSimpleClientFactory and override some of its virtual methods to construct more specialized objects. See TpAutomaticClientFactory for a subclass which automatically constructs subclasses of TpChannel for common channel types.

An application using its own factory subclass would look like this:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main(int argc, char *argv[])
    {
      TpSimpleClientFactory *factory;
      TpAccountManager *manager;

      factory = my_factory_new ();
      manager = tp_account_manager_new_with_factory (factory);
      tp_account_manager_set_default (manager);

      ...
      tp_proxy_prepare_async (manager, am_features, callback, user_data);
      ...
    }

The call to `tp_account_manager_set_default()` near the beginning of `main()` will ensure that any libraries or plugins which also use Telepathy (and call `tp_account_manager_dup()`) will share your TpAccountManager.

## Details

### TpSimpleClientFactory

    typedef struct _TpSimpleClientFactory TpSimpleClientFactory;

Data structure representing a TpSimpleClientFactory

Since 0.15.5

### struct TpSimpleClientFactoryClass

    struct TpSimpleClientFactoryClass {
        GObjectClass parent_class;

        /* TpAccount */
        TpAccount * (*create_account) (TpSimpleClientFactory *self,
            const gchar *object_path,
            const GHashTable *immutable_properties,
            GError **error);
        GArray * (*dup_account_features) (TpSimpleClientFactory *self,
            TpAccount *account);

        /* TpConnection */
        TpConnection * (*create_connection) (TpSimpleClientFactory *self,
            const gchar *object_path,
            const GHashTable *immutable_properties,
            GError **error);
        GArray * (*dup_connection_features) (TpSimpleClientFactory *self,
            TpConnection *connection);

        /* TpChannel */
        TpChannel * (*create_channel) (TpSimpleClientFactory *self,
            TpConnection *conn,
            const gchar *object_path,
            const GHashTable *immutable_properties,
            GError **error);
        GArray * (*dup_channel_features) (TpSimpleClientFactory *self,
            TpChannel *channel);

        /* TpContact */
        TpContact * (*create_contact) (TpSimpleClientFactory *self,
            TpConnection *connection,
            TpHandle handle,
            const gchar *identifier);
        GArray * (*dup_contact_features) (TpSimpleClientFactory *self,
            TpConnection *connection);
    };

The class structure for TpSimpleClientFactory.

TpSimpleClientFactory maintains a cache of previously-constructed proxy objects, so the implementations of `create_account`, `create_connection`, `create_channel`, and `create_contact` may assume that a new object should be created when they are called. The default implementations create unadorned instances of the relevant classes; subclasses of the factory may choose to create more interesting proxy subclasses.

The default implementation of `dup_channel_features` returns TP_CHANNEL_FEATURE_CORE, plus all features passed to `tp_simple_client_factory_add_channel_features()` by the application. Subclasses may override this method to prepare more interesting features from subclasses of TpChannel, for instance. The default implementations of the other `dup_x_features` methods behave similarly.

GObjectClass `parent_class`; | the parent
`create_account` () | create a TpAccount; see `tp_simple_client_factory_ensure_account()`
`dup_account_features` () | implementation of `tp_simple_client_factory_dup_account_features()`
`create_connection` () | create a TpConnection; see `tp_simple_client_factory_ensure_connection()`
`dup_connection_features` () | implementation of `tp_simple_client_factory_dup_connection_features()`
`create_channel` () | create a TpChannel; see `tp_simple_client_factory_ensure_channel()`
`dup_channel_features` () | implementation of `tp_simple_client_factory_dup_channel_features()`
`create_contact` () | create a TpContact; see `tp_simple_client_factory_ensure_contact()`
`dup_contact_features` () | implementation of `tp_simple_client_factory_dup_contact_features()`

Since 0.15.5

### tp_simple_client_factory_new ()

    TpSimpleClientFactory * tp_simple_client_factory_new    (TpDBusDaemon *dbus);

Creates a new TpSimpleClientFactory instance. If `dbus` is `NULL`, `tp_dbus_daemon_dup()` will be used.

`dbus` : | a TpDBusDaemon, or `NULL`. [allow-none]
Returns : | a new TpSimpleClientFactory

Since 0.15.5

### tp_simple_client_factory_get_dbus_daemon ()

    TpDBusDaemon *      tp_simple_client_factory_get_dbus_daemon
                                                            (TpSimpleClientFactory *self);

`self` : | a TpSimpleClientFactory object
Returns : | the value of the "dbus-daemon" property. [transfer none]

Since 0.15.5

### tp_simple_client_factory_ensure_account ()

    TpAccount *         tp_simple_client_factory_ensure_account
                                                            (TpSimpleClientFactory *self,
                                                             const gchar *object_path,
                                                             const GHashTable *immutable_properties,
                                                             GError **error);

Returns a TpAccount proxy for the account at `object_path`. The returned TpAccount is cached; the same TpAccount object will be returned by this function repeatedly, as long as at least one reference exists.

Note that the returned TpAccount is not guaranteed to be ready; the caller is responsible for calling `tp_proxy_prepare_async()` with the desired features (as given by `tp_simple_client_factory_dup_account_features()`).

This function is rather low-level. `tp_account_manager_dup_valid_accounts()` and "validity-changed" are more appropriate for most applications.

`self` : | a TpSimpleClientFactory object
`object_path` : | the object path of an account
`immutable_properties` : | the immutable properties of the account, or `NULL`. [transfer none][element-type utf8 GObject.Value]
`error` : | Used to raise an error if `object_path` is not valid
Returns : | a reference to a TpAccount; see `tp_account_new()`. [transfer full]

Since 0.15.5

### tp_simple_client_factory_dup_account_features ()

    GArray *            tp_simple_client_factory_dup_account_features
                                                            (TpSimpleClientFactory *self,
                                                             TpAccount *account);

Return a zero-terminated GArray containing the TpAccount features that should be prepared on `account`.

`self` : | a TpSimpleClientFactory object
`account` : | a TpAccount
Returns : | a newly allocated GArray. [transfer full][element-type GLib.Quark]

Since 0.15.5

### tp_simple_client_factory_add_account_features ()

    void                tp_simple_client_factory_add_account_features
                                                            (TpSimpleClientFactory *self,
                                                             const GQuark *features);

Add `features` to the desired features to be prepared on TpAccount objects. Those features will be added to the features already returned be `tp_simple_client_factory_dup_account_features()`.

It is not necessary to add `TP_ACCOUNT_FEATURE_CORE` as it is already included by default.

Note that these features will not be added to existing TpAccount objects; the user must call `tp_proxy_prepare_async()` themself.

`self` : | a TpSimpleClientFactory object
`features` : | an array of desired features, ending with 0; `NULL` is equivalent to an array containing only 0. [transfer none][array zero-terminated=1][allow-none]

Since 0.15.5

### tp_simple_client_factory_add_account_features_varargs ()

    void                tp_simple_client_factory_add_account_features_varargs
                                                            (TpSimpleClientFactory *self,
                                                             GQuark feature,
                                                             ...);

The same as `tp_simple_client_factory_add_account_features()`, but with a more convenient calling convention from C.

`self` : | a TpSimpleClientFactory
`feature` : | the first feature
`...` : | the second and subsequent features, if any, ending with 0

Since 0.15.5

### tp_simple_client_factory_ensure_connection ()

    TpConnection *      tp_simple_client_factory_ensure_connection
                                                            (TpSimpleClientFactory *self,
                                                             const gchar *object_path,
                                                             const GHashTable *immutable_properties,
                                                             GError **error);

Returns a TpConnection proxy for the connection at `object_path`. The returned TpConnection is cached; the same TpConnection object will be returned by this function repeatedly, as long as at least one reference exists.

Note that the returned TpConnection is not guaranteed to be ready; the caller is responsible for calling `tp_proxy_prepare_async()` with the desired features (as given by `tp_simple_client_factory_dup_connection_features()`).

This function is rather low-level. "connection" is more appropriate for most applications.

`self` : | a TpSimpleClientFactory object
`object_path` : | the object path of a connection
`immutable_properties` : | the immutable properties of the connection. [transfer none][element-type utf8 GObject.Value]
`error` : | Used to raise an error if `object_path` is not valid
Returns : | a reference to a TpConnection; see `tp_connection_new()`. [transfer full]

Since 0.15.5

### tp_simple_client_factory_dup_connection_features ()

    GArray *            tp_simple_client_factory_dup_connection_features
                                                            (TpSimpleClientFactory *self,
                                                             TpConnection *connection);

Return a zero-terminated GArray containing the TpConnection features that should be prepared on `connection`.

`self` : | a TpSimpleClientFactory object
`connection` : | a TpConnection
Returns : | a newly allocated GArray. [transfer full][element-type GLib.Quark]

Since 0.15.5

### tp_simple_client_factory_add_connection_features ()

    void                tp_simple_client_factory_add_connection_features
                                                            (TpSimpleClientFactory *self,
                                                             const GQuark *features);

Add `features` to the desired features to be prepared on TpConnection objects. Those features will be added to the features already returned be `tp_simple_client_factory_dup_connection_features()`.

It is not necessary to add `TP_CONNECTION_FEATURE_CORE` as it is already included by default.

Note that these features will not be added to existing TpConnection objects; the user must call `tp_proxy_prepare_async()` themself.

`self` : | a TpSimpleClientFactory object
`features` : | an array of desired features, ending with 0; `NULL` is equivalent to an array containing only 0. [transfer none][array zero-terminated=1][allow-none]

Since 0.15.5

### tp_simple_client_factory_add_connection_features_varargs ()

    void                tp_simple_client_factory_add_connection_features_varargs
                                                            (TpSimpleClientFactory *self,
                                                             GQuark feature,
                                                             ...);

The same as `tp_simple_client_factory_add_connection_features()`, but with a more convenient calling convention from C.

`self` : | a TpSimpleClientFactory
`feature` : | the first feature
`...` : | the second and subsequent features, if any, ending with 0

Since 0.15.5

### tp_simple_client_factory_ensure_channel ()

    TpChannel *         tp_simple_client_factory_ensure_channel
                                                            (TpSimpleClientFactory *self,
                                                             TpConnection *connection,
                                                             const gchar *object_path,
                                                             const GHashTable *immutable_properties,
                                                             GError **error);

Returns a TpChannel proxy for the channel at `object_path` on `connection`. The returned TpChannel is cached; the same TpChannel object will be returned by this function repeatedly, as long as at least one reference exists.

Note that the returned TpChannel is not guaranteed to be ready; the caller is responsible for calling `tp_proxy_prepare_async()` with the desired features (as given by `tp_simple_client_factory_dup_channel_features()`).

This function is rather low-level. TpAccountChannelRequest and TpBaseClient are more appropriate ways to obtain channels for most applications.

`self` : | a TpSimpleClientFactory object
`connection` : | a TpConnection whose "factory" is this object
`object_path` : | the object path of a channel on `connection`
`immutable_properties` : | the immutable properties of the channel. [transfer none][element-type utf8 GObject.Value]
`error` : | Used to raise an error if `object_path` is not valid
Returns : | a reference to a TpChannel; see `tp_channel_new_from_properties()`. [transfer full]

Since 0.15.5

### tp_simple_client_factory_dup_channel_features ()

    GArray *            tp_simple_client_factory_dup_channel_features
                                                            (TpSimpleClientFactory *self,
                                                             TpChannel *channel);

Return a zero-terminated GArray containing the TpChannel features that should be prepared on `channel`.

`self` : | a TpSimpleClientFactory object
`channel` : | a TpChannel
Returns : | a newly allocated GArray. [transfer full][element-type GLib.Quark]

Since 0.15.5

### tp_simple_client_factory_add_channel_features ()

    void                tp_simple_client_factory_add_channel_features
                                                            (TpSimpleClientFactory *self,
                                                             const GQuark *features);

Add `features` to the desired features to be prepared on TpChannel objects. Those features will be added to the features already returned be `tp_simple_client_factory_dup_channel_features()`.

It is not necessary to add `TP_CHANNEL_FEATURE_CORE` as it is already included by default.

Note that these features will not be added to existing TpChannel objects; the user must call `tp_proxy_prepare_async()` themself.

`self` : | a TpSimpleClientFactory object
`features` : | an array of desired features, ending with 0; `NULL` is equivalent to an array containing only 0. [transfer none][array zero-terminated=1][allow-none]

Since 0.15.5

### tp_simple_client_factory_add_channel_features_varargs ()

    void                tp_simple_client_factory_add_channel_features_varargs
                                                            (TpSimpleClientFactory *self,
                                                             GQuark feature,
                                                             ...);

The same as `tp_simple_client_factory_add_channel_features()`, but with a more convenient calling convention from C.

`self` : | a TpSimpleClientFactory
`feature` : | the first feature
`...` : | the second and subsequent features, if any, ending with 0

Since 0.15.5

### tp_simple_client_factory_ensure_contact ()

    TpContact *         tp_simple_client_factory_ensure_contact
                                                            (TpSimpleClientFactory *self,
                                                             TpConnection *connection,
                                                             TpHandle handle,
                                                             const gchar *identifier);

Returns a TpContact representing `identifier` (and `handle`) on `connection`. The returned TpContact is cached; the same TpContact object will be returned by this function repeatedly, as long as at least one reference exists.

Note that the returned TpContact is not guaranteed to be ready; the caller is responsible for calling `tp_connection_upgrade_contacts()` with the desired features (as given by `tp_simple_client_factory_dup_contact_features()`).

For this function to work properly, `tp_connection_has_immortal_handles()` must return `TRUE` for `connection`.

`self` : | a TpSimpleClientFactory object
`connection` : | a TpConnection whose "factory" is this object
`handle` : | a TpHandle
`identifier` : | a string representing the contact's identifier
Returns : | a reference to a TpContact. [transfer full]

Since 0.15.5

### tp_simple_client_factory_upgrade_contacts_async ()

    void                tp_simple_client_factory_upgrade_contacts_async
                                                            (TpSimpleClientFactory *self,
                                                             TpConnection *connection,
                                                             guint n_contacts,
                                                             TpContact * const *contacts,
                                                             GAsyncReadyCallback callback,
                                                             gpointer user_data);

Same as `tp_connection_upgrade_contacts_async()`, but prepare contacts with all features previously passed to `tp_simple_client_factory_add_contact_features()`.

`self` : | a TpSimpleClientFactory object
`connection` : | a TpConnection whose "factory" is this object
`n_contacts` : | The number of contacts in `contacts` (must be at least 1)
`contacts` : | An array of TpContact objects associated with `self`. [array length=n_contacts]
`callback` : | a callback to call when the operation finishes
`user_data` : | data to pass to `callback`

Since 0.19.1

### tp_simple_client_factory_upgrade_contacts_finish ()

    gboolean            tp_simple_client_factory_upgrade_contacts_finish
                                                            (TpSimpleClientFactory *self,
                                                             GAsyncResult *result,
                                                             GPtrArray **contacts,
                                                             GError **error);

Finishes `tp_simple_client_factory_upgrade_contacts_async()`

`self` : | a TpSimpleClientFactory
`result` : | a GAsyncResult
`contacts` : | a location to set a GPtrArray of upgraded TpContact, or `NULL`. [element-type TelepathyGLib.Contact][transfer container][out][allow-none]
`error` : | a GError to fill
Returns : | `TRUE` on success, `FALSE` otherwise.

Since 0.19.1

### tp_simple_client_factory_ensure_contact_by_id_async ()

    void                tp_simple_client_factory_ensure_contact_by_id_async
                                                            (TpSimpleClientFactory *self,
                                                             TpConnection *connection,
                                                             const gchar *identifier,
                                                             GAsyncReadyCallback callback,
                                                             gpointer user_data);

Same as `tp_connection_dup_contact_by_id_async()`, but prepare the contact with all features previously passed to `tp_simple_client_factory_add_contact_features()`.

`self` : | a TpSimpleClientFactory object
`connection` : | a TpConnection
`identifier` : | a string representing the contact's identifier
`callback` : | a callback to call when the operation finishes
`user_data` : | data to pass to `callback`

Since 0.19.1

### tp_simple_client_factory_ensure_contact_by_id_finish ()

    TpContact *         tp_simple_client_factory_ensure_contact_by_id_finish
                                                            (TpSimpleClientFactory *self,
                                                             GAsyncResult *result,
                                                             GError **error);

Finishes `tp_simple_client_factory_ensure_contact_by_id_async()`

`self` : | a TpSimpleClientFactory
`result` : | a GAsyncResult
`error` : | a GError to fill
Returns : | a TpContact or `NULL` on error. [transfer full]

Since 0.19.1

### tp_simple_client_factory_dup_contact_features ()

    GArray *            tp_simple_client_factory_dup_contact_features
                                                            (TpSimpleClientFactory *self,
                                                             TpConnection *connection);

Return a GArray containing the TpContactFeature that should be prepared on all contacts of `connection`.

`self` : | a TpSimpleClientFactory object
`connection` : | a TpConnection
Returns : | a newly allocated GArray. [transfer full][element-type TelepathyGLib.ContactFeature]

Since 0.15.5

### tp_simple_client_factory_add_contact_features ()

    void                tp_simple_client_factory_add_contact_features
                                                            (TpSimpleClientFactory *self,
                                                             guint n_features,
                                                             const TpContactFeature *features);

Add `features` to the desired features to be prepared on TpContact objects. Those features will be added to the features already returned be `tp_simple_client_factory_dup_contact_features()`.

Note that these features will not be added to existing TpContact objects; the user must call `tp_connection_upgrade_contacts()` themself.

`self` : | a TpSimpleClientFactory object
`n_features` : | The number of features in `features` (may be 0)
`features` : | an array of desired features (may be `NULL` if `n_features` is 0). [array length=n_features][allow-none]

Since 0.15.5

### tp_simple_client_factory_add_contact_features_varargs ()

    void                tp_simple_client_factory_add_contact_features_varargs
                                                            (TpSimpleClientFactory *self,
                                                             TpContactFeature feature,
                                                             ...);

The same as `tp_simple_client_factory_add_contact_features()`, but with a more convenient calling convention from C.

`self` : | a TpSimpleClientFactory
`feature` : | the first feature
`...` : | the second and subsequent features, if any, ending with `TP_CONTACT_FEATURE_INVALID`

Since 0.15.5

## Property Details

### The `"dbus-daemon"` property

      "dbus-daemon"              TpDBusDaemon*         : Read / Write / Construct Only

The D-Bus daemon for this object.

## See Also

TpAutomaticClientFactory