/* * account-request.c - object for a currently non-existent account to create * * Copyright © 2012 Collabora Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "config.h" #include "telepathy-glib/account-request.h" #include #include #include #include #define DEBUG_FLAG TP_DEBUG_ACCOUNTS #include "telepathy-glib/dbus-internal.h" #include "telepathy-glib/debug-internal.h" #include "telepathy-glib/util-internal.h" #include "telepathy-glib/variant-util-internal.h" /** * SECTION:account-request * @title: TpAccountRequest * @short_description: object for a currently non-existent account in * order to create easily without speaking fluent D-Bus * @see_also: #TpAccountManager * * This is a convenience object to aid in the creation of accounts on * a #TpAccountManager without having to construct #GHashTables with * well-known keys. For example: * * |[ * static void created_cb (GObject *object, GAsyncResult *res, gpointer user_data); * * static void * create_acount (void) * { * TpAccountManager *am = tp_account_manager_dup (); * TpAccountRequest *req; * * req = tp_account_request_new (am, "gabble", "jabber", "Work Jabber account"); * * tp_account_request_set_parameter (req, "account", "walter.white@lospollos.lit"); * * // ... * * tp_account_request_create_account_async (req, created_cb, NULL); * g_object_unref (req); * g_object_unref (am); * } * * static void * created_cb (GObject *object, * GAsyncResult *result, * gpointer user_data) * { * TpAccountRequest *req = TP_ACCOUNT_REQUEST (object); * TpAccount *account; * GError *error = NULL; * * account = tp_account_request_create_account_finish (req, result, &error); * * if (account == NULL) * { * g_error ("Failed to create account: %s\n", error->message); * g_clear_error (&error); * return; * } * * // ... * * g_object_unref (account); * } * ]| * * * Since: 0.19.1 */ /** * TpAccountRequest: * * An object for representing a currently non-existent account which * is to be created on a #TpAccountManager. * * Since: 0.19.1 */ /** * TpAccountRequestClass: * * The class of a #TpAccountRequest. */ struct _TpAccountRequestPrivate { TpAccountManager *account_manager; GSimpleAsyncResult *result; gboolean created; gchar *cm_name; gchar *proto_name; gchar *display_name; GHashTable *parameters; GHashTable *properties; }; G_DEFINE_TYPE (TpAccountRequest, tp_account_request, G_TYPE_OBJECT) /* properties */ enum { PROP_ACCOUNT_MANAGER = 1, PROP_CONNECTION_MANAGER, PROP_PROTOCOL, PROP_DISPLAY_NAME, PROP_PARAMETERS, PROP_PROPERTIES, PROP_ICON_NAME, PROP_NICKNAME, PROP_REQUESTED_PRESENCE_TYPE, PROP_REQUESTED_STATUS, PROP_REQUESTED_STATUS_MESSAGE, PROP_AUTOMATIC_PRESENCE_TYPE, PROP_AUTOMATIC_STATUS, PROP_AUTOMATIC_STATUS_MESSAGE, PROP_ENABLED, PROP_CONNECT_AUTOMATICALLY, PROP_SUPERSEDES, PROP_AVATAR, PROP_AVATAR_MIME_TYPE, PROP_SERVICE, PROP_STORAGE_PROVIDER, N_PROPS }; static void tp_account_request_init (TpAccountRequest *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, TP_TYPE_ACCOUNT_REQUEST, TpAccountRequestPrivate); } static void tp_account_request_constructed (GObject *object) { TpAccountRequest *self = TP_ACCOUNT_REQUEST (object); TpAccountRequestPrivate *priv = self->priv; void (*chain_up) (GObject *) = ((GObjectClass *) tp_account_request_parent_class)->constructed; if (chain_up != NULL) chain_up (object); g_assert (priv->account_manager != NULL); g_assert (priv->cm_name != NULL); g_assert (priv->proto_name != NULL); g_assert (priv->display_name != NULL); priv->parameters = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) tp_g_value_slice_free); priv->properties = tp_asv_new (NULL, NULL); } #define GET_PRESENCE_VALUE(key, offset, type) \ G_STMT_START { \ GValueArray *_arr = tp_asv_get_boxed (self->priv->properties, \ key, TP_STRUCT_TYPE_SIMPLE_PRESENCE); \ if (_arr != NULL) \ g_value_set_##type (value, g_value_get_##type (_arr->values + offset)); \ } G_STMT_END static void tp_account_request_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { TpAccountRequest *self = TP_ACCOUNT_REQUEST (object); switch (prop_id) { case PROP_ACCOUNT_MANAGER: g_value_set_object (value, self->priv->account_manager); break; case PROP_CONNECTION_MANAGER: g_value_set_string (value, self->priv->cm_name); break; case PROP_PROTOCOL: g_value_set_string (value, self->priv->proto_name); break; case PROP_DISPLAY_NAME: g_value_set_string (value, self->priv->display_name); break; case PROP_PARAMETERS: g_value_take_variant (value, _tp_asv_to_vardict (self->priv->parameters)); break; case PROP_PROPERTIES: g_value_take_variant (value, _tp_asv_to_vardict (self->priv->properties)); break; case PROP_ICON_NAME: g_value_set_string (value, tp_asv_get_string (self->priv->properties, TP_PROP_ACCOUNT_ICON)); break; case PROP_NICKNAME: g_value_set_string (value, tp_asv_get_string (self->priv->properties, TP_PROP_ACCOUNT_NICKNAME)); break; case PROP_REQUESTED_PRESENCE_TYPE: GET_PRESENCE_VALUE (TP_PROP_ACCOUNT_REQUESTED_PRESENCE, 0, uint); break; case PROP_REQUESTED_STATUS: GET_PRESENCE_VALUE (TP_PROP_ACCOUNT_REQUESTED_PRESENCE, 1, string); break; case PROP_REQUESTED_STATUS_MESSAGE: GET_PRESENCE_VALUE (TP_PROP_ACCOUNT_REQUESTED_PRESENCE, 2, string); break; case PROP_AUTOMATIC_PRESENCE_TYPE: GET_PRESENCE_VALUE (TP_PROP_ACCOUNT_AUTOMATIC_PRESENCE, 0, uint); break; case PROP_AUTOMATIC_STATUS: GET_PRESENCE_VALUE (TP_PROP_ACCOUNT_AUTOMATIC_PRESENCE, 1, string); break; case PROP_AUTOMATIC_STATUS_MESSAGE: GET_PRESENCE_VALUE (TP_PROP_ACCOUNT_AUTOMATIC_PRESENCE, 2, string); break; case PROP_ENABLED: g_value_set_boolean (value, tp_asv_get_boolean (self->priv->properties, TP_PROP_ACCOUNT_ENABLED, NULL)); break; case PROP_CONNECT_AUTOMATICALLY: g_value_set_boolean (value, tp_asv_get_boolean (self->priv->properties, TP_PROP_ACCOUNT_CONNECT_AUTOMATICALLY, NULL)); break; case PROP_SUPERSEDES: { GPtrArray *array = tp_asv_get_boxed (self->priv->properties, TP_PROP_ACCOUNT_SUPERSEDES, TP_ARRAY_TYPE_OBJECT_PATH_LIST); if (array != NULL) { /* add the NULL-termination to make it a real GStrv */ g_ptr_array_add (array, NULL); g_value_set_boxed (value, array->pdata); g_ptr_array_remove_index (array, (array->len - 1)); } else { g_value_set_boxed (value, NULL); } } break; case PROP_AVATAR: { GValueArray *array = tp_asv_get_boxed (self->priv->properties, TP_PROP_ACCOUNT_INTERFACE_AVATAR_AVATAR, TP_STRUCT_TYPE_AVATAR); if (array != NULL) g_value_set_boxed (value, g_value_get_boxed (array->values)); } break; case PROP_AVATAR_MIME_TYPE: { GValueArray *array = tp_asv_get_boxed (self->priv->properties, TP_PROP_ACCOUNT_INTERFACE_AVATAR_AVATAR, TP_STRUCT_TYPE_AVATAR); if (array != NULL) g_value_set_string (value, g_value_get_string (array->values + 1)); } break; case PROP_SERVICE: g_value_set_string (value, tp_asv_get_string (self->priv->properties, TP_PROP_ACCOUNT_SERVICE)); break; case PROP_STORAGE_PROVIDER: g_value_set_string (value, tp_asv_get_string (self->priv->properties, TP_PROP_ACCOUNT_INTERFACE_STORAGE_STORAGE_PROVIDER)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } #undef GET_PRESENCE_VALUE static void tp_account_request_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { TpAccountRequest *self = TP_ACCOUNT_REQUEST (object); TpAccountRequestPrivate *priv = self->priv; switch (property_id) { case PROP_ACCOUNT_MANAGER: g_assert (priv->account_manager == NULL); priv->account_manager = g_value_dup_object (value); break; case PROP_CONNECTION_MANAGER: g_assert (priv->cm_name == NULL); priv->cm_name = g_value_dup_string (value); break; case PROP_PROTOCOL: g_assert (priv->proto_name == NULL); priv->proto_name = g_value_dup_string (value); break; case PROP_DISPLAY_NAME: g_assert (priv->display_name == NULL); priv->display_name = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void tp_account_request_dispose (GObject *object) { TpAccountRequest *self = TP_ACCOUNT_REQUEST (object); TpAccountRequestPrivate *priv = self->priv; g_clear_object (&priv->account_manager); tp_clear_pointer (&priv->parameters, g_hash_table_unref); tp_clear_pointer (&priv->properties, g_hash_table_unref); /* release any references held by the object here */ if (G_OBJECT_CLASS (tp_account_request_parent_class)->dispose != NULL) G_OBJECT_CLASS (tp_account_request_parent_class)->dispose (object); } static void tp_account_request_finalize (GObject *object) { TpAccountRequest *self = TP_ACCOUNT_REQUEST (object); TpAccountRequestPrivate *priv = self->priv; tp_clear_pointer (&priv->cm_name, g_free); tp_clear_pointer (&priv->proto_name, g_free); tp_clear_pointer (&priv->display_name, g_free); /* free any data held directly by the object here */ if (G_OBJECT_CLASS (tp_account_request_parent_class)->finalize != NULL) G_OBJECT_CLASS (tp_account_request_parent_class)->finalize (object); } static void tp_account_request_class_init (TpAccountRequestClass *klass) { GObjectClass *object_class = (GObjectClass *) klass; g_type_class_add_private (klass, sizeof (TpAccountRequestPrivate)); object_class->constructed = tp_account_request_constructed; object_class->get_property = tp_account_request_get_property; object_class->set_property = tp_account_request_set_property; object_class->dispose = tp_account_request_dispose; object_class->finalize = tp_account_request_finalize; /** * TpAccountRequest:account-manager: * * The #TpAccountManager to create the account on. * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_ACCOUNT_MANAGER, g_param_spec_object ("account-manager", "Account manager", "The account's account manager", TP_TYPE_ACCOUNT_MANAGER, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); /** * TpAccountRequest:connection-manager: * * The account's connection manager name. * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_CONNECTION_MANAGER, g_param_spec_string ("connection-manager", "Connection manager", "The account's connection manager name", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); /** * TpAccountRequest:protocol: * * The account's machine-readable protocol name, such as "jabber", "msn" or * "local-xmpp". Recommended names for most protocols can be found in the * Telepathy D-Bus Interface Specification. * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_PROTOCOL, g_param_spec_string ("protocol", "Protocol", "The account's protocol name", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); /** * TpAccountRequest:display-name: * * The account's display name. To change this property use * tp_account_request_set_display_name(). * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_DISPLAY_NAME, g_param_spec_string ("display-name", "DisplayName", "The account's display name", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); /** * TpAccountRequest:parameters: * * The account's connection parameters. To add a parameter, use * tp_account_request_set_parameter() or another convience function. * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_PARAMETERS, g_param_spec_variant ("parameters", "Parameters", "Connection parameters of the account", G_VARIANT_TYPE_VARDICT, NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:properties: * * The account's properties. * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_PROPERTIES, g_param_spec_variant ("properties", "Properties", "Account properties", G_VARIANT_TYPE_VARDICT, NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:icon-name: * * The account's icon name. To change this propery, use * tp_account_request_set_icon_name(). * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_ICON_NAME, g_param_spec_string ("icon-name", "Icon", "The account's icon name", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:nickname: * * The account's nickname. To change this property use * tp_account_request_set_nickname(). * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_NICKNAME, g_param_spec_string ("nickname", "Nickname", "The account's nickname", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:requested-presence-type: * * The account's requested presence type (a * #TpConnectionPresenceType). To change this property use * tp_account_request_set_requested_presence(). * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_REQUESTED_PRESENCE_TYPE, g_param_spec_uint ("requested-presence-type", "RequestedPresence", "The account's requested presence type", 0, TP_NUM_CONNECTION_PRESENCE_TYPES, TP_CONNECTION_PRESENCE_TYPE_UNSET, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:requested-status: * * The requested Status string of the account. To change this * property use tp_account_request_set_requested_presence(). * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_REQUESTED_STATUS, g_param_spec_string ("requested-status", "RequestedStatus", "The account's requested status string", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:requested-status-message: * * The requested status message message of the account. To change * this property use tp_account_request_set_requested_presence(). * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_REQUESTED_STATUS_MESSAGE, g_param_spec_string ("requested-status-message", "RequestedStatusMessage", "The requested Status message string of the account", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:automatic-presence-type: * * The account's automatic presence type (a * #TpConnectionPresenceType). To change this property use * tp_account_request_set_automatic_presence(). * * When the account is put online automatically, for instance to * make a channel request or because network connectivity becomes * available, the automatic presence type, status and message will * be copied to their "requested" counterparts. * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_AUTOMATIC_PRESENCE_TYPE, g_param_spec_uint ("automatic-presence-type", "AutomaticPresence type", "Presence type used to put the account online automatically", 0, TP_NUM_CONNECTION_PRESENCE_TYPES, TP_CONNECTION_PRESENCE_TYPE_UNSET, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:automatic-status: * * The string status name to use in conjunction with the * #TpAccountRequest:automatic-presence-type. To change this property * use tp_account_request_set_automatic_presence(). * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_AUTOMATIC_STATUS, g_param_spec_string ("automatic-status", "AutomaticPresence status", "Presence status used to put the account online automatically", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:automatic-status-message: * * The user-defined message to use in conjunction with the * #TpAccount:automatic-presence-type. To change this property use * tp_account_request_set_automatic_presence(). * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_AUTOMATIC_STATUS_MESSAGE, g_param_spec_string ("automatic-status-message", "AutomaticPresence message", "User-defined message used to put the account online automatically", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:enabled: * * Whether the account is enabled or not. To change this property * use tp_account_request_set_enabled(). * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_ENABLED, g_param_spec_boolean ("enabled", "Enabled", "Whether this account is enabled or not", FALSE, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:connect-automatically: * * Whether the account should connect automatically or not. To change this * property, use tp_account_request_set_connect_automatically(). * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_CONNECT_AUTOMATICALLY, g_param_spec_boolean ("connect-automatically", "ConnectAutomatically", "Whether this account should connect automatically or not", FALSE, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:supersedes: * * The object paths of previously-active accounts superseded by this one. * For instance, this can be used in a logger to read old logs for an * account that has been migrated from one connection manager to another. * * To add to this property use tp_account_request_add_supersedes(). * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_SUPERSEDES, g_param_spec_boxed ("supersedes", "Supersedes", "Accounts superseded by this one", G_TYPE_STRV, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:avatar: * * The avatar set on the account. The avatar's mime type can be read * in the #TpAccountRequest:avatar-mime-type property. To change this * property, use tp_account_request_set_avatar(). * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_AVATAR, g_param_spec_boxed ("avatar", "Avatar", "The account's avatar data", G_TYPE_ARRAY, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:avatar-mime-type: * * The mime type of the #TpAccountRequest:avatar property. To change * this property, use tp_account_request_set_avatar(). * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_AVATAR_MIME_TYPE, g_param_spec_string ("avatar-mime-type", "Avatar mime type", "The account's avatar's mime type", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:service: * * A string describing the service of the account, which must * consist only of ASCII letters, numbers and hyphen/minus signs, * and start with a letter (matching the requirements for * Protocol). To change this property, use * tp_account_request_set_service(). * * Since: 0.19.1 */ g_object_class_install_property (object_class, PROP_SERVICE, g_param_spec_string ("service", "Service", "The account's service", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); /** * TpAccountRequest:storage-provider: * * The account's storage provider. To change this property use * tp_account_request_set_storage_provider(). * * Since: 0.19.4 */ g_object_class_install_property (object_class, PROP_STORAGE_PROVIDER, g_param_spec_string ("storage-provider", "Storage Provider", "The account's storage provider", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); } /** * tp_account_request_new: * @account_manager: the #TpAccountManager to create the account on * @manager: the name of the connection manager * @protocol: the name of the protocol on @manager * @display_name: the user-visible name of this account * * Convenience function to create a new account request object which * will assist in the creation of a new account on @account_manager, * using connection manager @manager, and protocol @protocol. * * Returns: (transfer full): a new reference to an account request * object, or %NULL if any argument is incorrect * * Since: 0.19.1 */ TpAccountRequest * tp_account_request_new (TpAccountManager *account_manager, const gchar *manager, const gchar *protocol, const gchar *display_name) { g_return_val_if_fail (TP_IS_ACCOUNT_MANAGER (account_manager), NULL); g_return_val_if_fail (manager != NULL, NULL); g_return_val_if_fail (protocol != NULL, NULL); return g_object_new (TP_TYPE_ACCOUNT_REQUEST, "account-manager", account_manager, "connection-manager", manager, "protocol", protocol, "display-name", display_name, NULL); } /** * tp_account_request_new_from_protocol: * @account_manager: the #TpAccountManager to create the account on * @protocol: a #TpProtocol * @display_name: the user-visible name of this account * * Convenience function to create a new #TpAccountRequest object using * a #TpProtocol instance, instead of specifying connection manager * and protocol name specifically. See tp_account_request_new() for * more details. * * Returns: (transfer full): a new reference to an account request * object, or %NULL if any argument is incorrect * * Since: 0.19.1 */ TpAccountRequest * tp_account_request_new_from_protocol (TpAccountManager *account_manager, TpProtocol *protocol, const gchar *display_name) { g_return_val_if_fail (TP_IS_ACCOUNT_MANAGER (account_manager), NULL); g_return_val_if_fail (TP_IS_PROTOCOL (protocol), NULL); return g_object_new (TP_TYPE_ACCOUNT_REQUEST, "account-manager", account_manager, "connection-manager", tp_protocol_get_cm_name (protocol), "protocol", tp_protocol_get_name (protocol), "display-name", display_name, NULL); } /** * tp_account_request_set_display_name: * @self: a #TpAccountRequest * @name: a display name for the account * * Set the display name for the new account, @self, to @name. Use the * #TpAccountRequest:display-name property to read the current display * name. * * Since: 0.19.1 */ void tp_account_request_set_display_name (TpAccountRequest *self, const gchar *name) { TpAccountRequestPrivate *priv; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); g_return_if_fail (name != NULL); priv = self->priv; g_return_if_fail (priv->result == NULL && !priv->created); g_free (priv->display_name); priv->display_name = g_strdup (name); } /** * tp_account_request_set_icon_name: * @self: a #TpAccountRequest * @icon: an icon name for the account * * Set the icon name for the new account, @self, to @icon. Use the * #TpAccountRequest:icon-name property to read the current icon name. * * Since: 0.19.1 */ void tp_account_request_set_icon_name (TpAccountRequest *self, const gchar *icon) { TpAccountRequestPrivate *priv; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); g_return_if_fail (icon != NULL); priv = self->priv; g_return_if_fail (priv->result == NULL && !priv->created); tp_asv_set_string (priv->properties, TP_PROP_ACCOUNT_ICON, icon); } /** * tp_account_request_set_nickname: * @self: a #TpAccountRequest * @nickname: a nickname for the account * * Set the nickname for the new account, @self, to @nickname. Use the * #TpAccountRequest:nickname property to read the current nickname. * * Since: 0.19.1 */ void tp_account_request_set_nickname (TpAccountRequest *self, const gchar *nickname) { TpAccountRequestPrivate *priv; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); g_return_if_fail (nickname != NULL); priv = self->priv; g_return_if_fail (priv->result == NULL && !priv->created); tp_asv_set_string (priv->properties, TP_PROP_ACCOUNT_NICKNAME, nickname); } /** * tp_account_request_set_requested_presence: * @self: a #TpAccountRequest * @presence: the requested presence type * @status: the requested presence status * @message: the requested presence message * * Set the requested presence for the new account, @self, to the type * (@presence, @status), with message @message. Use the * #TpAccountRequest:requested-presence-type, * #TpAccountRequest:requested-status, and * #TpAccountRequest:requested-status-message properties to read the * current requested presence. * * Since: 0.19.1 */ void tp_account_request_set_requested_presence (TpAccountRequest *self, TpConnectionPresenceType presence, const gchar *status, const gchar *message) { TpAccountRequestPrivate *priv; GValue *value; GValueArray *arr; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); priv = self->priv; g_return_if_fail (priv->result == NULL && !priv->created); value = tp_g_value_slice_new_take_boxed (TP_STRUCT_TYPE_SIMPLE_PRESENCE, dbus_g_type_specialized_construct (TP_STRUCT_TYPE_SIMPLE_PRESENCE)); arr = (GValueArray *) g_value_get_boxed (value); g_value_set_uint (arr->values, presence); g_value_set_string (arr->values + 1, status); g_value_set_string (arr->values + 2, message); g_hash_table_insert (priv->properties, TP_PROP_ACCOUNT_REQUESTED_PRESENCE, value); } /** * tp_account_request_set_automatic_presence: * @self: a #TpAccountRequest * @presence: the automatic presence type * @status: the automatic presence status * @message: the automatic presence message * * Set the automatic presence for the new account, @self, to the type * (@presence, @status), with message @message. Use the * #TpAccountRequest:automatic-presence-type, * #TpAccountRequest:automatic-status, and * #TpAccountRequest:automatic-status-message properties to read the * current automatic presence. * * Since: 0.19.1 */ void tp_account_request_set_automatic_presence (TpAccountRequest *self, TpConnectionPresenceType presence, const gchar *status, const gchar *message) { TpAccountRequestPrivate *priv; GValue *value; GValueArray *arr; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); priv = self->priv; g_return_if_fail (priv->result == NULL && !priv->created); value = tp_g_value_slice_new_take_boxed (TP_STRUCT_TYPE_SIMPLE_PRESENCE, dbus_g_type_specialized_construct (TP_STRUCT_TYPE_SIMPLE_PRESENCE)); arr = (GValueArray *) g_value_get_boxed (value); g_value_set_uint (arr->values, presence); g_value_set_string (arr->values + 1, status); g_value_set_string (arr->values + 2, message); g_hash_table_insert (priv->properties, TP_PROP_ACCOUNT_AUTOMATIC_PRESENCE, value); } /** * tp_account_request_set_enabled: * @self: a #TpAccountRequest * @enabled: %TRUE if the account is to be enabled * * Set the enabled property of the account on creation to * @enabled. Use the #TpAccountRequest:enabled property to read the * current enabled value. * * Since: 0.19.1 */ void tp_account_request_set_enabled (TpAccountRequest *self, gboolean enabled) { TpAccountRequestPrivate *priv; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); priv = self->priv; g_return_if_fail (priv->result == NULL && !priv->created); tp_asv_set_boolean (priv->properties, TP_PROP_ACCOUNT_ENABLED, enabled); } /** * tp_account_request_set_connect_automatically: * @self: a #TpAccountRequest * @connect_automatically: %TRUE if the account is to connect automatically * * Set the connect automatically property of the account on creation * to @connect_automatically so that the account is brought online to * the automatic presence. Use the * #TpAccountRequest:connect-automatically property to read the current * connect automatically value. * * Since: 0.19.1 */ void tp_account_request_set_connect_automatically (TpAccountRequest *self, gboolean connect_automatically) { TpAccountRequestPrivate *priv; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); priv = self->priv; g_return_if_fail (priv->result == NULL && !priv->created); tp_asv_set_boolean (priv->properties, TP_PROP_ACCOUNT_CONNECT_AUTOMATICALLY, connect_automatically); } /** * tp_account_request_add_supersedes: * @self: a #TpAccountRequest * @superseded_path: an account object path to add to the supersedes * list * * Add an account object path to the list of superseded accounts which * this new account will supersede. Use the * #TpAccountRequest:supersedes property to read the current list of * superseded accounts. * * Since: 0.19.1 */ void tp_account_request_add_supersedes (TpAccountRequest *self, const gchar *superseded_path) { TpAccountRequestPrivate *priv; GPtrArray *array; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); g_return_if_fail (g_variant_is_object_path (superseded_path)); priv = self->priv; g_return_if_fail (priv->result == NULL && !priv->created); array = tp_asv_get_boxed (priv->properties, TP_PROP_ACCOUNT_SUPERSEDES, TP_ARRAY_TYPE_OBJECT_PATH_LIST); if (array == NULL) { array = g_ptr_array_new (); tp_asv_take_boxed (priv->properties, TP_PROP_ACCOUNT_SUPERSEDES, TP_ARRAY_TYPE_OBJECT_PATH_LIST, array); } g_ptr_array_add (array, g_strdup (superseded_path)); } /** * tp_account_request_set_avatar: * @self: a #TpAccountRequest * @avatar: (allow-none) (array length=len): a new avatar to set; can * be %NULL only if %len equals 0 * @len: the length of the new avatar * @mime_type: (allow-none): the MIME type of the new avatar; can be %NULL * only if @len equals 0 * * Set the avatar of the account @self to @avatar. Use the * #TpAccountRequest:avatar and #TpAccountRequest:avatar-mime-type * properties to read the current avatar. * * Since: 0.19.1 */ void tp_account_request_set_avatar (TpAccountRequest *self, const guchar *avatar, gsize len, const gchar *mime_type) { TpAccountRequestPrivate *priv; GArray *tmp; GValueArray *arr; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); g_return_if_fail (avatar != NULL || len == 0); g_return_if_fail (mime_type != NULL || len == 0); priv = self->priv; g_return_if_fail (priv->result == NULL && !priv->created); tmp = g_array_new (FALSE, FALSE, sizeof (guchar)); if (len > 0) g_array_append_vals (tmp, avatar, len); arr = tp_value_array_build (2, TP_TYPE_UCHAR_ARRAY, tmp, G_TYPE_STRING, mime_type, G_TYPE_INVALID); g_array_unref (tmp); tp_asv_take_boxed (priv->properties, TP_PROP_ACCOUNT_INTERFACE_AVATAR_AVATAR, TP_STRUCT_TYPE_AVATAR, arr); } /** * tp_account_request_set_service: * @self: a #TpAccountRequest * @service: the service name for * * Set the service property of the account to @service. Use the * #TpAccountRequest:service property to read the current value. * * Since: 0.19.1 */ void tp_account_request_set_service (TpAccountRequest *self, const gchar *service) { TpAccountRequestPrivate *priv; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); g_return_if_fail (service != NULL); priv = self->priv; g_return_if_fail (priv->result == NULL && !priv->created); tp_asv_set_string (priv->properties, TP_PROP_ACCOUNT_SERVICE, service); } /** * tp_account_request_set_storage_provider: * @self: a #TpAccountRequest * @provider: the name of an account storage implementation * * Set the account storage to use when creating the account. Use the * #TpAccountRequest:storage-provider property to read the current value. * * Since: 0.19.4 */ void tp_account_request_set_storage_provider (TpAccountRequest *self, const gchar *provider) { TpAccountRequestPrivate *priv; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); priv = self->priv; g_return_if_fail (priv->result == NULL && !priv->created); tp_asv_set_string (priv->properties, TP_PROP_ACCOUNT_INTERFACE_STORAGE_STORAGE_PROVIDER, provider); } /** * tp_account_request_set_parameter: * @self: a #TpAccountRequest * @key: the parameter key * @value: (transfer none): a variant containing the parameter value * * Set an account parameter, @key, to @value. Use the * #TpAccountRequest:parameters property to read the current list of * set parameters. * * Parameters can be unset using tp_account_request_unset_parameter(). * * Since: 0.19.1 */ void tp_account_request_set_parameter (TpAccountRequest *self, const gchar *key, GVariant *value) { TpAccountRequestPrivate *priv; GValue one = G_VALUE_INIT, *two; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); g_return_if_fail (key != NULL); g_return_if_fail (value != NULL); priv = self->priv; g_return_if_fail (priv->result == NULL && !priv->created); dbus_g_value_parse_g_variant (value, &one); two = tp_g_value_slice_dup (&one); g_hash_table_insert (priv->parameters, g_strdup (key), two); g_value_unset (&one); } /** * tp_account_request_unset_parameter: * @self: a #TpAccountRequest * @key: the parameter key * * Unset the account parameter @key which has previously been set * using tp_account_request_set_parameter() or another convenience * function. * * Since: 0.19.1 */ void tp_account_request_unset_parameter (TpAccountRequest *self, const gchar *key) { TpAccountRequestPrivate *priv; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); g_return_if_fail (key != NULL); priv = self->priv; g_return_if_fail (priv->result == NULL && !priv->created); g_hash_table_remove (priv->parameters, key); } /** * tp_account_request_set_parameter_string: (skip) * @self: a #TpAccountRequest * @key: the parameter key * @value: the parameter value * * Convenience function to set an account parameter string value. See * tp_account_request_set_parameter() for more details. * * Since: 0.19.1 */ void tp_account_request_set_parameter_string (TpAccountRequest *self, const gchar *key, const gchar *value) { TpAccountRequestPrivate *priv; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); g_return_if_fail (key != NULL); g_return_if_fail (value != NULL); priv = self->priv; g_return_if_fail (priv->result == NULL && !priv->created); g_hash_table_insert (priv->parameters, g_strdup (key), tp_g_value_slice_new_string (value)); } static void tp_account_request_account_prepared_cb (GObject *object, GAsyncResult *result, gpointer user_data) { TpAccountRequest *self = user_data; TpAccountRequestPrivate *priv = self->priv; GError *error = NULL; if (!tp_proxy_prepare_finish (object, result, &error)) { DEBUG ("Error preparing account: %s", error->message); g_simple_async_result_take_error (priv->result, error); } g_simple_async_result_complete (priv->result); g_clear_object (&priv->result); } static void tp_account_request_create_account_cb (TpAccountManager *proxy, const gchar *account_path, const GError *error, gpointer user_data, GObject *weak_object) { TpAccountRequest *self = TP_ACCOUNT_REQUEST (weak_object); TpAccountRequestPrivate *priv = self->priv; GError *e = NULL; TpAccount *account; GArray *features; if (error != NULL) { DEBUG ("failed to create account: %s", error->message); g_simple_async_result_set_from_error (priv->result, error); g_simple_async_result_complete (priv->result); g_clear_object (&priv->result); return; } priv->created = TRUE; account = tp_simple_client_factory_ensure_account ( tp_proxy_get_factory (proxy), account_path, NULL, &e); if (account == NULL) { g_simple_async_result_take_error (priv->result, e); g_simple_async_result_complete (priv->result); g_clear_object (&priv->result); return; } /* Give account's ref to the result */ g_simple_async_result_set_op_res_gpointer (priv->result, account, g_object_unref); features = tp_simple_client_factory_dup_account_features ( tp_proxy_get_factory (proxy), account); tp_proxy_prepare_async (account, (GQuark *) features->data, tp_account_request_account_prepared_cb, self); g_array_unref (features); } /** * tp_account_request_create_account_async: * @self: a #TpAccountRequest * @callback: a function to call when the account has been created * @user_data: user data to @callback * * Start an asynchronous operation to create the account @self on the * account manager. * * @callback will only be called when the newly created #TpAccount has * the %TP_ACCOUNT_FEATURE_CORE feature ready on it, so when calling * tp_account_request_create_account_finish(), one can guarantee this * feature. * * Since: 0.19.1 */ void tp_account_request_create_account_async (TpAccountRequest *self, GAsyncReadyCallback callback, gpointer user_data) { TpAccountRequestPrivate *priv = self->priv; g_return_if_fail (TP_IS_ACCOUNT_REQUEST (self)); priv = self->priv; if (priv->result != NULL) { g_simple_async_report_error_in_idle (G_OBJECT (self), callback, user_data, TP_ERROR, TP_ERROR_BUSY, "An account creation operation has already been started on this " "account request"); return; } if (priv->created) { g_simple_async_report_error_in_idle (G_OBJECT (self), callback, user_data, TP_ERROR, TP_ERROR_NOT_AVAILABLE, "This account has already been created"); return; } priv->result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, tp_account_request_create_account_async); tp_cli_account_manager_call_create_account (priv->account_manager, -1, priv->cm_name, priv->proto_name, priv->display_name, priv->parameters, priv->properties, tp_account_request_create_account_cb, NULL, NULL, G_OBJECT (self)); } /** * tp_account_request_create_account_finish: * @self: a #TpAccountRequest * @result: a #GAsyncResult * @error: something * * Finishes an asynchronous account creation operation and returns a * new ref to a #TpAccount object. The returned account will have the * features listed in tp_simple_client_factory_dup_account_features() * (with the proxy factory from #TpAccountRequest:account-manager) * prepared on it. * * Returns: (transfer full): a new ref to a #TpAccount, or %NULL * * Since: 0.19.1 */ TpAccount * tp_account_request_create_account_finish (TpAccountRequest *self, GAsyncResult *result, GError **error) { _tp_implement_finish_return_copy_pointer (self, tp_account_request_create_account_async, g_object_ref); }