/**
 * tp_yts_client_new:
 * @service_name: The Ytstenut service name for this client.
 * @account: The Ytstenut account for this client.
 *
 * Create a new #TpYtsClient object for the given Ytstenut name and
 * account. After getting the new client object, you should add
 * localized names, capabilities and interests with
 * tp_yts_client_add_names(), tp_yts_client_add_capabilities() and
 * tp_yts_client_add_interests() respectively.

 * After setting these values, You should call
 * tp_yts_client_register() to register the client. g_object_unref()
 * should be used to free the object.
 *
 * Returns: A newly allocated client object.
 */
TpYtsClient *
tp_yts_client_new (const gchar *service_name,
    TpAccount *account)
{
  TpYtsClient *out = NULL;
  TpDBusDaemon *bus;
  gchar *name, *tmp;

  g_return_val_if_fail (tp_dbus_check_valid_interface_name (service_name, NULL),
      NULL);

  name = g_strdup_printf ("Ytsenut.Client.%s", service_name);
  bus = tp_dbus_daemon_dup (NULL);

  out = g_object_new (TP_TYPE_YTS_CLIENT,
      "dbus-daemon", bus,
      "name", name,
      "service-name", service_name,
      "uniquify-name", TRUE,
      "account", account,
      NULL);

  g_object_unref (bus);
  g_free (name);

  /* add uid handler capability token */
  tmp = g_strdup_printf (TP_YTS_IFACE_CHANNEL "/uid/%s", service_name);
  tp_base_client_add_handler_capability (TP_BASE_CLIENT (out), tmp);
  g_free (tmp);

  return out;
}
/**
 * tp_yts_client_add_interest:
 * @client: a #TpYtsClient
 * @interest: an interest to add
 *
 * Adds @interest as an interest to @client. This will be advertised
 * to other Ytstenut clients when @client is registered and as a
 * result will mean that StatusChanged will be emitted for this
 * interest from other services.
 *
 * This must be called before tp_yts_client_register() is called.
 */
void
tp_yts_client_add_interest (TpYtsClient *client,
    const gchar *interest)
{
  gchar *tmp;

  tmp = g_strdup_printf (TP_YTS_IFACE_CHANNEL "/interested/%s", interest);

  tp_base_client_add_handler_capability (TP_BASE_CLIENT (client), tmp);

  g_free (tmp);
}
static void
shell_tp_client_init (ShellTpClient *self)
{
  GHashTable *filter;

  self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, SHELL_TYPE_TP_CLIENT,
      ShellTpClientPrivate);

  /* We only care about single-user text-based chats */
  filter = tp_asv_new (
      TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING,
        TP_IFACE_CHANNEL_TYPE_TEXT,
      TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT,
        TP_HANDLE_TYPE_CONTACT,
      NULL);

  /* Observer */
  tp_base_client_set_observer_recover (TP_BASE_CLIENT (self), TRUE);

  tp_base_client_add_observer_filter (TP_BASE_CLIENT (self), filter);

  /* Approver */
  tp_base_client_add_approver_filter (TP_BASE_CLIENT (self), filter);

  /* Approve room invitations. We don't handle or observe room channels so
   * just register this filter for the approver. */
  tp_base_client_take_approver_filter (TP_BASE_CLIENT (self), tp_asv_new (
      TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING,
        TP_IFACE_CHANNEL_TYPE_TEXT,
      TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT,
        TP_HANDLE_TYPE_ROOM,
      NULL));

  /* Handler */
  tp_base_client_add_handler_filter (TP_BASE_CLIENT (self), filter);

  g_hash_table_unref (filter);
}
/**
 * tp_yts_client_add_name:
 * @client: a #TpYtsClient
 * @lang: the IETF language tag
 * @name: the localized name
 *
 * Adds @name as a localized name to @client. This will be advertised
 * to other Ytstenut clients when @client is registered.
 *
 * This must be called before tp_yts_client_register() is called.
 */
void
tp_yts_client_add_name (TpYtsClient *client,
    const gchar *lang,
    const gchar *name)
{
  gchar *tmp;

  tmp = g_strdup_printf (TP_YTS_IFACE_CHANNEL "/name/%s/%s",
      lang, name);

  tp_base_client_add_handler_capability (TP_BASE_CLIENT (client), tmp);

  g_free (tmp);
}
static void
tp_yts_client_constructed (GObject *obj)
{
  TpYtsClient *self = TP_YTS_CLIENT (obj);
  TpBaseClient *client = TP_BASE_CLIENT (self);

  /* chain up to TpBaseClient first */
  G_OBJECT_CLASS (tp_yts_client_parent_class)->constructed (obj);

  _tp_yts_register_dbus_glib_marshallers ();

  tp_base_client_set_handler_bypass_approval (client, FALSE);

  tp_base_client_take_handler_filter (client, tp_asv_new (
      /* ChannelType */
      TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING, TP_YTS_IFACE_CHANNEL,
      /* TargetService */
      TP_YTS_IFACE_CHANNEL ".TargetService", G_TYPE_STRING,
      self->priv->service_name,
      NULL));
}
/**
 * tp_yts_client_register:
 * @self: The client object.
 * @error: If not %NULL, raise an error here when %FALSE is returned.
 *
 * Register this client with telepathy. This must be done before new channels
 * are created or received.
 *
 * Returns: %TRUE if registering was successful.
 */
gboolean
tp_yts_client_register (TpYtsClient *self,
    GError **error)
{
  return tp_base_client_register (TP_BASE_CLIENT (self), error);
}