|
Packit |
79f644 |
/*
|
|
Packit |
79f644 |
* tpaw-user-info.c - Source for TpawUserInfo
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* Copyright (C) 2012 - Collabora Ltd.
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
79f644 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
79f644 |
* License as published by the Free Software Foundation; either
|
|
Packit |
79f644 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
79f644 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
79f644 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
79f644 |
* Lesser General Public License for more details.
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* You should have received a copy of the GNU Lesser General Public License
|
|
Packit |
79f644 |
* along with This library. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
79f644 |
*/
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
#include "config.h"
|
|
Packit |
79f644 |
#include "tpaw-user-info.h"
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
#include <glib/gi18n-lib.h>
|
|
Packit |
79f644 |
#include <telepathy-glib/telepathy-glib-dbus.h>
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
#include "tpaw-avatar-chooser.h"
|
|
Packit |
79f644 |
#include "tpaw-calendar-button.h"
|
|
Packit |
79f644 |
#include "tpaw-contactinfo-utils.h"
|
|
Packit |
79f644 |
#include "tpaw-time.h"
|
|
Packit |
79f644 |
#include "tpaw-utils.h"
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
#define DEBUG_FLAG TPAW_DEBUG_CONTACT
|
|
Packit |
79f644 |
#include "tpaw-debug.h"
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
G_DEFINE_TYPE (TpawUserInfo, tpaw_user_info, GTK_TYPE_GRID)
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
struct _TpawUserInfoPrivate
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpAccount *account;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
GtkWidget *avatar_chooser;
|
|
Packit |
79f644 |
GtkWidget *identifier_label;
|
|
Packit |
79f644 |
GtkWidget *nickname_entry;
|
|
Packit |
79f644 |
GtkWidget *details_label;
|
|
Packit |
79f644 |
GtkWidget *details_spinner;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
GList *details_to_set;
|
|
Packit |
79f644 |
gboolean details_changed;
|
|
Packit |
79f644 |
GCancellable *details_cancellable;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
gboolean tried_preparing_contact_info;
|
|
Packit |
79f644 |
};
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
enum
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
PROP_0,
|
|
Packit |
79f644 |
PROP_ACCOUNT,
|
|
Packit |
79f644 |
};
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
#define DATA_FIELD "contact-info-field"
|
|
Packit |
79f644 |
#define DATA_IS_CONTACT_INFO "is-contact-info"
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void reload_contact_info (TpawUserInfo *self);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
contact_info_changed_cb (GtkEntry *entry,
|
|
Packit |
79f644 |
TpawUserInfo *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
const gchar *strv[] = { NULL, NULL };
|
|
Packit |
79f644 |
TpContactInfoField *field;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
self->priv->details_changed = TRUE;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
field = g_object_get_data ((GObject *) entry, DATA_FIELD);
|
|
Packit |
79f644 |
g_assert (field != NULL);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
strv[0] = gtk_entry_get_text (entry);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (field->field_value != NULL)
|
|
Packit |
79f644 |
g_strfreev (field->field_value);
|
|
Packit |
79f644 |
field->field_value = g_strdupv ((GStrv) strv);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
bday_changed_cb (TpawCalendarButton *button,
|
|
Packit |
79f644 |
GDate *date,
|
|
Packit |
79f644 |
TpawUserInfo *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
const gchar *strv[] = { NULL, NULL };
|
|
Packit |
79f644 |
TpContactInfoField *field;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
self->priv->details_changed = TRUE;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
field = g_object_get_data ((GObject *) button, DATA_FIELD);
|
|
Packit |
79f644 |
g_assert (field != NULL);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (date != NULL)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
gchar tmp[255];
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_date_strftime (tmp, sizeof (tmp), TPAW_DATE_FORMAT_DISPLAY_SHORT,
|
|
Packit |
79f644 |
date);
|
|
Packit |
79f644 |
strv[0] = tmp;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (field->field_value != NULL)
|
|
Packit |
79f644 |
g_strfreev (field->field_value);
|
|
Packit |
79f644 |
field->field_value = g_strdupv ((GStrv) strv);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static gboolean
|
|
Packit |
79f644 |
field_name_in_field_list (GList *list,
|
|
Packit |
79f644 |
const gchar *name)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
GList *l;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
for (l = list; l != NULL; l = g_list_next (l))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpContactInfoField *field = l->data;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!tp_strdiff (field->field_name, name))
|
|
Packit |
79f644 |
return TRUE;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return FALSE;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static TpContactInfoFieldSpec *
|
|
Packit |
79f644 |
get_spec_from_list (GList *list,
|
|
Packit |
79f644 |
const gchar *name)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
GList *l;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
for (l = list; l != NULL; l = g_list_next (l))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpContactInfoFieldSpec *spec = l->data;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!tp_strdiff (spec->name, name))
|
|
Packit |
79f644 |
return spec;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return NULL;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
add_row (GtkGrid *grid,
|
|
Packit |
79f644 |
GtkWidget *title,
|
|
Packit |
79f644 |
GtkWidget *value,
|
|
Packit |
79f644 |
gboolean contact_info)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
/* Title */
|
|
Packit |
79f644 |
gtk_grid_attach_next_to (grid, title, NULL, GTK_POS_BOTTOM, 1, 1);
|
|
Packit |
79f644 |
gtk_misc_set_alignment (GTK_MISC (title), 1, 0.5);
|
|
Packit |
79f644 |
gtk_style_context_add_class (gtk_widget_get_style_context (title),
|
|
Packit |
79f644 |
GTK_STYLE_CLASS_DIM_LABEL);
|
|
Packit |
79f644 |
gtk_widget_show (title);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Value */
|
|
Packit |
79f644 |
gtk_grid_attach_next_to (grid, value, title, GTK_POS_RIGHT,
|
|
Packit |
79f644 |
contact_info ? 2 : 1, 1);
|
|
Packit |
79f644 |
gtk_widget_set_hexpand (value, TRUE);
|
|
Packit |
79f644 |
if (GTK_IS_LABEL (value))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
gtk_misc_set_alignment (GTK_MISC (value), 0, 0.5);
|
|
Packit |
79f644 |
gtk_label_set_selectable (GTK_LABEL (value), TRUE);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
gtk_widget_show (value);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (contact_info)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_object_set_data (G_OBJECT (title),
|
|
Packit |
79f644 |
DATA_IS_CONTACT_INFO, (gpointer) TRUE);
|
|
Packit |
79f644 |
g_object_set_data (G_OBJECT (value),
|
|
Packit |
79f644 |
DATA_IS_CONTACT_INFO, (gpointer) TRUE);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static guint
|
|
Packit |
79f644 |
fill_contact_info_grid (TpawUserInfo *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpConnection *connection;
|
|
Packit |
79f644 |
TpContact *contact;
|
|
Packit |
79f644 |
GList *specs, *l;
|
|
Packit |
79f644 |
guint n_rows = 0;
|
|
Packit |
79f644 |
GList *info;
|
|
Packit |
79f644 |
const char **field_names = tpaw_contact_info_get_field_names (NULL);
|
|
Packit |
79f644 |
guint i;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_assert (self->priv->details_to_set == NULL);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
connection = tp_account_get_connection (self->priv->account);
|
|
Packit |
79f644 |
contact = tp_connection_get_self_contact (connection);
|
|
Packit |
79f644 |
specs = tp_connection_dup_contact_info_supported_fields (connection);
|
|
Packit |
79f644 |
info = tp_contact_dup_contact_info (contact);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Look at the fields set in our vCard */
|
|
Packit |
79f644 |
for (l = info; l != NULL; l = l->next)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpContactInfoField *field = l->data;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* For some reason it can happen that the vCard contains fields the CM
|
|
Packit |
79f644 |
* claims to be not supported. This is a workaround for gabble bug
|
|
Packit |
79f644 |
* https://bugs.freedesktop.org/show_bug.cgi?id=64319. But we shouldn't
|
|
Packit |
79f644 |
* crash on buggy CM anyway. */
|
|
Packit |
79f644 |
if (get_spec_from_list (specs, field->field_name) == NULL)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
DEBUG ("Buggy CM: self's vCard contains %s field but it is not in "
|
|
Packit |
79f644 |
"Connection' supported fields", field->field_name);
|
|
Packit |
79f644 |
continue;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* make a copy for the details_to_set list */
|
|
Packit |
79f644 |
field = tp_contact_info_field_copy (field);
|
|
Packit |
79f644 |
DEBUG ("Field %s is in our vCard", field->field_name);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
self->priv->details_to_set = g_list_prepend (self->priv->details_to_set,
|
|
Packit |
79f644 |
field);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Add fields which are supported but not in the vCard */
|
|
Packit |
79f644 |
for (i = 0; field_names[i] != NULL; i++)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpContactInfoFieldSpec *spec;
|
|
Packit |
79f644 |
TpContactInfoField *field;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Check if the field was in the vCard */
|
|
Packit |
79f644 |
if (field_name_in_field_list (self->priv->details_to_set,
|
|
Packit |
79f644 |
field_names[i]))
|
|
Packit |
79f644 |
continue;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Check if the CM supports the field */
|
|
Packit |
79f644 |
spec = get_spec_from_list (specs, field_names[i]);
|
|
Packit |
79f644 |
if (spec == NULL)
|
|
Packit |
79f644 |
continue;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* add an empty field so user can set a value */
|
|
Packit |
79f644 |
field = tp_contact_info_field_new (spec->name, spec->parameters, NULL);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
self->priv->details_to_set = g_list_prepend (self->priv->details_to_set,
|
|
Packit |
79f644 |
field);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Add widgets for supported fields */
|
|
Packit |
79f644 |
self->priv->details_to_set = g_list_sort (self->priv->details_to_set,
|
|
Packit |
79f644 |
(GCompareFunc) tpaw_contact_info_field_spec_cmp);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
for (l = self->priv->details_to_set; l != NULL; l= g_list_next (l))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpContactInfoField *field = l->data;
|
|
Packit |
79f644 |
GtkWidget *label, *w;
|
|
Packit |
79f644 |
TpContactInfoFieldSpec *spec;
|
|
Packit |
79f644 |
gboolean has_field;
|
|
Packit |
79f644 |
char *title;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
has_field = tpaw_contact_info_lookup_field (field->field_name,
|
|
Packit |
79f644 |
NULL, NULL);
|
|
Packit |
79f644 |
if (!has_field)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
/* We don't display this field so we can't change it.
|
|
Packit |
79f644 |
* But we put it in the details_to_set list so it won't be erased
|
|
Packit |
79f644 |
* when calling SetContactInfo (bgo #630427) */
|
|
Packit |
79f644 |
DEBUG ("Unhandled ContactInfo field spec: %s", field->field_name);
|
|
Packit |
79f644 |
continue;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
spec = get_spec_from_list (specs, field->field_name);
|
|
Packit |
79f644 |
/* We shouldn't have added the field to details_to_set if it's not
|
|
Packit |
79f644 |
* supported by the CM */
|
|
Packit |
79f644 |
g_assert (spec != NULL);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (spec->flags & TP_CONTACT_INFO_FIELD_FLAG_OVERWRITTEN_BY_NICKNAME)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
DEBUG ("Ignoring field '%s' due it to having the "
|
|
Packit |
79f644 |
"Overwritten_By_Nickname flag", field->field_name);
|
|
Packit |
79f644 |
continue;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Add Title */
|
|
Packit |
79f644 |
title = tpaw_contact_info_field_label (field->field_name,
|
|
Packit |
79f644 |
field->parameters,
|
|
Packit |
79f644 |
(spec->flags & TP_CONTACT_INFO_FIELD_FLAG_PARAMETERS_EXACT));
|
|
Packit |
79f644 |
label = gtk_label_new (title);
|
|
Packit |
79f644 |
g_free (title);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* TODO: if TP_CONTACT_INFO_FIELD_FLAG_PARAMETERS_EXACT is not set we
|
|
Packit |
79f644 |
* should allow user to tag the vCard fields (bgo#672034) */
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Add Value */
|
|
Packit |
79f644 |
if (!tp_strdiff (field->field_name, "bday"))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
w = tpaw_calendar_button_new ();
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (field->field_value[0])
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
GDate date;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_date_set_parse (&date, field->field_value[0]);
|
|
Packit |
79f644 |
if (g_date_valid (&date))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
tpaw_calendar_button_set_date (TPAW_CALENDAR_BUTTON (w),
|
|
Packit |
79f644 |
&date);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_signal_connect (w, "date-changed",
|
|
Packit |
79f644 |
G_CALLBACK (bday_changed_cb), self);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
else
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
w = gtk_entry_new ();
|
|
Packit |
79f644 |
gtk_entry_set_text (GTK_ENTRY (w),
|
|
Packit |
79f644 |
field->field_value[0] ? field->field_value[0] : "");
|
|
Packit |
79f644 |
g_signal_connect (w, "changed",
|
|
Packit |
79f644 |
G_CALLBACK (contact_info_changed_cb), self);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
add_row (GTK_GRID (self), label, w, TRUE);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_object_set_data ((GObject *) w, DATA_FIELD, field);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
n_rows++;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
tp_contact_info_spec_list_free (specs);
|
|
Packit |
79f644 |
tp_contact_info_list_free (info);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return n_rows;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
grid_foreach_cb (GtkWidget *widget,
|
|
Packit |
79f644 |
gpointer data)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
if (g_object_get_data (G_OBJECT (widget), DATA_IS_CONTACT_INFO) != NULL)
|
|
Packit |
79f644 |
gtk_widget_destroy (widget);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
request_contact_info_cb (GObject *object,
|
|
Packit |
79f644 |
GAsyncResult *res,
|
|
Packit |
79f644 |
gpointer user_data)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawUserInfo *self = user_data;
|
|
Packit |
79f644 |
TpContact *contact = TP_CONTACT (object);
|
|
Packit |
79f644 |
guint n_rows;
|
|
Packit |
79f644 |
GError *error = NULL;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!tp_contact_request_contact_info_finish (contact, res, &error))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
/* If the request got cancelled it could mean the contact widget is
|
|
Packit |
79f644 |
* destroyed, so we should not dereference self */
|
|
Packit |
79f644 |
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_clear_error (&error);
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
g_clear_error (&error);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
n_rows = fill_contact_info_grid (self);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
gtk_widget_set_visible (self->priv->details_label, n_rows > 0);
|
|
Packit |
79f644 |
gtk_spinner_stop (GTK_SPINNER (self->priv->details_spinner));
|
|
Packit |
79f644 |
gtk_widget_hide (self->priv->details_spinner);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
connection_contact_info_prepared_cb (GObject *object,
|
|
Packit |
79f644 |
GAsyncResult *res,
|
|
Packit |
79f644 |
gpointer user_data)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawUserInfo *self = user_data;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!tp_proxy_prepare_finish (object, res, NULL))
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
reload_contact_info (self);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_object_unref (self);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
reload_contact_info (TpawUserInfo *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpConnection *connection;
|
|
Packit |
79f644 |
TpContact *contact = NULL;
|
|
Packit |
79f644 |
TpContactInfoFlags flags;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Cancel previous RequestContactInfo, if any */
|
|
Packit |
79f644 |
if (self->priv->details_cancellable != NULL)
|
|
Packit |
79f644 |
g_cancellable_cancel (self->priv->details_cancellable);
|
|
Packit |
79f644 |
g_clear_object (&self->priv->details_cancellable);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Remove current contact info widgets, if any */
|
|
Packit |
79f644 |
gtk_container_foreach (GTK_CONTAINER (self), grid_foreach_cb, NULL);
|
|
Packit |
79f644 |
gtk_widget_hide (self->priv->details_label);
|
|
Packit |
79f644 |
gtk_widget_hide (self->priv->details_spinner);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
tp_clear_pointer (&self->priv->details_to_set, tp_contact_info_list_free);
|
|
Packit |
79f644 |
self->priv->details_changed = FALSE;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
connection = tp_account_get_connection (self->priv->account);
|
|
Packit |
79f644 |
if (connection != NULL)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
contact = tp_connection_get_self_contact (connection);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* FIXME: we should rely on the factory to do this, see bgo#706892 */
|
|
Packit |
79f644 |
if (!tp_proxy_is_prepared (connection,
|
|
Packit |
79f644 |
TP_CONNECTION_FEATURE_CONTACT_INFO) &&
|
|
Packit |
79f644 |
!self->priv->tried_preparing_contact_info)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
GQuark features[] = { TP_CONNECTION_FEATURE_CONTACT_INFO, 0 };
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Prevent an infinite loop if the connection doesn't implement
|
|
Packit |
79f644 |
* ContactInfo, see bgo#709677 */
|
|
Packit |
79f644 |
self->priv->tried_preparing_contact_info = TRUE;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
tp_proxy_prepare_async (connection, features,
|
|
Packit |
79f644 |
connection_contact_info_prepared_cb, g_object_ref (self));
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Display infobar if we don't have a self contact (probably offline) */
|
|
Packit |
79f644 |
if (contact == NULL)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
GtkWidget *infobar;
|
|
Packit |
79f644 |
GtkWidget *content;
|
|
Packit |
79f644 |
GtkWidget *label;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
infobar = gtk_info_bar_new ();
|
|
Packit |
79f644 |
gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), GTK_MESSAGE_INFO);
|
|
Packit |
79f644 |
content = gtk_info_bar_get_content_area (GTK_INFO_BAR (infobar));
|
|
Packit |
79f644 |
label = gtk_label_new (_("Go online to edit your personal information."));
|
|
Packit |
79f644 |
gtk_container_add (GTK_CONTAINER (content), label);
|
|
Packit |
79f644 |
gtk_widget_show (label);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
gtk_grid_attach_next_to ((GtkGrid *) self, infobar,
|
|
Packit |
79f644 |
NULL, GTK_POS_BOTTOM, 3, 1);
|
|
Packit |
79f644 |
gtk_widget_show (infobar);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_object_set_data (G_OBJECT (infobar),
|
|
Packit |
79f644 |
DATA_IS_CONTACT_INFO, (gpointer) TRUE);
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!tp_proxy_has_interface_by_id (connection,
|
|
Packit |
79f644 |
TP_IFACE_QUARK_CONNECTION_INTERFACE_CONTACT_INFO))
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
flags = tp_connection_get_contact_info_flags (connection);
|
|
Packit |
79f644 |
if ((flags & TP_CONTACT_INFO_FLAG_CAN_SET) == 0)
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Request the contact's info */
|
|
Packit |
79f644 |
gtk_widget_show (self->priv->details_spinner);
|
|
Packit |
79f644 |
gtk_spinner_start (GTK_SPINNER (self->priv->details_spinner));
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_assert (self->priv->details_cancellable == NULL);
|
|
Packit |
79f644 |
self->priv->details_cancellable = g_cancellable_new ();
|
|
Packit |
79f644 |
tp_contact_request_contact_info_async (contact,
|
|
Packit |
79f644 |
self->priv->details_cancellable, request_contact_info_cb,
|
|
Packit |
79f644 |
self);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
connection_notify_cb (TpawUserInfo *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpConnection *connection = tp_account_get_connection (self->priv->account);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (connection != NULL)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
tp_g_signal_connect_object (connection, "notify::self-contact",
|
|
Packit |
79f644 |
G_CALLBACK (reload_contact_info), self, G_CONNECT_SWAPPED);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
reload_contact_info (self);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
identifier_notify_cb (TpAccount *account,
|
|
Packit |
79f644 |
GParamSpec *param_spec,
|
|
Packit |
79f644 |
TpawUserInfo *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
gtk_label_set_label (GTK_LABEL (self->priv->identifier_label),
|
|
Packit |
79f644 |
tp_account_get_normalized_name (self->priv->account));
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
nickname_notify_cb (TpAccount *account,
|
|
Packit |
79f644 |
GParamSpec *param_spec,
|
|
Packit |
79f644 |
TpawUserInfo *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
gtk_entry_set_text (GTK_ENTRY (self->priv->nickname_entry),
|
|
Packit |
79f644 |
tp_account_get_nickname (self->priv->account));
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
tpaw_user_info_constructed (GObject *object)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawUserInfo *self = (TpawUserInfo *) object;
|
|
Packit |
79f644 |
GtkGrid *grid = (GtkGrid *) self;
|
|
Packit |
79f644 |
GtkWidget *infobar;
|
|
Packit |
79f644 |
GtkWidget *infobar_content;
|
|
Packit |
79f644 |
GtkWidget *infobar_label;
|
|
Packit |
79f644 |
GtkWidget *title;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
G_OBJECT_CLASS (tpaw_user_info_parent_class)->constructed (object);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
gtk_grid_set_column_spacing (grid, 6);
|
|
Packit |
79f644 |
gtk_grid_set_row_spacing (grid, 6);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
infobar = gtk_info_bar_new ();
|
|
Packit |
79f644 |
g_object_set (infobar, "margin-bottom", 6, NULL);
|
|
Packit |
79f644 |
gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), GTK_MESSAGE_INFO);
|
|
Packit |
79f644 |
infobar_content = gtk_info_bar_get_content_area (GTK_INFO_BAR (infobar));
|
|
Packit |
79f644 |
infobar_label = gtk_label_new (
|
|
Packit |
79f644 |
_("These details will be shared with other users on this "
|
|
Packit |
79f644 |
"chat network."));
|
|
Packit |
79f644 |
gtk_container_add (GTK_CONTAINER (infobar_content), infobar_label);
|
|
Packit |
79f644 |
gtk_widget_show (infobar_label);
|
|
Packit |
79f644 |
gtk_grid_attach_next_to ((GtkGrid *) self, infobar, NULL,
|
|
Packit |
79f644 |
GTK_POS_TOP, 3, 1);
|
|
Packit |
79f644 |
gtk_widget_show (infobar);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Setup id label */
|
|
Packit |
79f644 |
title = gtk_label_new (_("Identifier"));
|
|
Packit |
79f644 |
self->priv->identifier_label = gtk_label_new (
|
|
Packit |
79f644 |
tp_account_get_normalized_name (self->priv->account));
|
|
Packit |
79f644 |
add_row (grid, title, self->priv->identifier_label, FALSE);
|
|
Packit |
79f644 |
g_signal_connect_object (self->priv->account, "notify::normalized-name",
|
|
Packit |
79f644 |
G_CALLBACK (identifier_notify_cb), self, 0);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Setup nickname entry */
|
|
Packit |
79f644 |
title = gtk_label_new (_("Alias"));
|
|
Packit |
79f644 |
self->priv->nickname_entry = gtk_entry_new ();
|
|
Packit |
79f644 |
gtk_entry_set_text (GTK_ENTRY (self->priv->nickname_entry),
|
|
Packit |
79f644 |
tp_account_get_nickname (self->priv->account));
|
|
Packit |
79f644 |
add_row (grid, title, self->priv->nickname_entry, FALSE);
|
|
Packit |
79f644 |
g_signal_connect_object (self->priv->account, "notify::nickname",
|
|
Packit |
79f644 |
G_CALLBACK (nickname_notify_cb), self, 0);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Set up avatar chooser */
|
|
Packit |
79f644 |
self->priv->avatar_chooser = tpaw_avatar_chooser_new (self->priv->account,
|
|
Packit |
79f644 |
-1);
|
|
Packit |
79f644 |
gtk_grid_attach (grid, self->priv->avatar_chooser,
|
|
Packit |
79f644 |
2, 0, 1, 3);
|
|
Packit |
79f644 |
gtk_widget_show (self->priv->avatar_chooser);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Details label */
|
|
Packit |
79f644 |
self->priv->details_label = gtk_label_new (NULL);
|
|
Packit |
79f644 |
gtk_label_set_markup (GTK_LABEL (self->priv->details_label),
|
|
Packit |
79f644 |
_("Personal Details"));
|
|
Packit |
79f644 |
gtk_misc_set_alignment (GTK_MISC (self->priv->details_label), 0, 0.5);
|
|
Packit |
79f644 |
gtk_grid_attach_next_to (grid, self->priv->details_label, NULL,
|
|
Packit |
79f644 |
GTK_POS_BOTTOM, 3, 1);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Details spinner */
|
|
Packit |
79f644 |
self->priv->details_spinner = gtk_spinner_new ();
|
|
Packit |
79f644 |
gtk_widget_set_hexpand (self->priv->details_spinner, TRUE);
|
|
Packit |
79f644 |
gtk_widget_set_vexpand (self->priv->details_spinner, TRUE);
|
|
Packit |
79f644 |
gtk_grid_attach_next_to (grid, self->priv->details_spinner, NULL,
|
|
Packit |
79f644 |
GTK_POS_BOTTOM, 3, 1);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_signal_connect_swapped (self->priv->account, "notify::connection",
|
|
Packit |
79f644 |
G_CALLBACK (connection_notify_cb), self);
|
|
Packit |
79f644 |
connection_notify_cb (self);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
tpaw_user_info_dispose (GObject *object)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawUserInfo *self = (TpawUserInfo *) object;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (self->priv->account != NULL)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
/* Disconnect the signal manually, because TpAccount::dispose will emit
|
|
Packit |
79f644 |
* "notify::connection" signal before tp_g_signal_connect_object() had
|
|
Packit |
79f644 |
* a chance to disconnect. */
|
|
Packit |
79f644 |
g_signal_handlers_disconnect_by_func (self->priv->account,
|
|
Packit |
79f644 |
connection_notify_cb, self);
|
|
Packit |
79f644 |
g_clear_object (&self->priv->account);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (self->priv->details_cancellable != NULL)
|
|
Packit |
79f644 |
g_cancellable_cancel (self->priv->details_cancellable);
|
|
Packit |
79f644 |
g_clear_object (&self->priv->details_cancellable);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
G_OBJECT_CLASS (tpaw_user_info_parent_class)->dispose (object);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
tpaw_user_info_get_property (GObject *object,
|
|
Packit |
79f644 |
guint property_id,
|
|
Packit |
79f644 |
GValue *value,
|
|
Packit |
79f644 |
GParamSpec *pspec)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawUserInfo *self = (TpawUserInfo *) object;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
switch (property_id)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
case PROP_ACCOUNT:
|
|
Packit |
79f644 |
g_value_set_object (value, self->priv->account);
|
|
Packit |
79f644 |
break;
|
|
Packit |
79f644 |
default:
|
|
Packit |
79f644 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
Packit |
79f644 |
break;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
tpaw_user_info_set_property (GObject *object,
|
|
Packit |
79f644 |
guint property_id,
|
|
Packit |
79f644 |
const GValue *value,
|
|
Packit |
79f644 |
GParamSpec *pspec)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawUserInfo *self = (TpawUserInfo *) object;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
switch (property_id)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
case PROP_ACCOUNT:
|
|
Packit |
79f644 |
g_assert (self->priv->account == NULL); /* construct-only */
|
|
Packit |
79f644 |
self->priv->account = g_value_dup_object (value);
|
|
Packit |
79f644 |
break;
|
|
Packit |
79f644 |
default:
|
|
Packit |
79f644 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
Packit |
79f644 |
break;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
tpaw_user_info_init (TpawUserInfo *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
|
|
Packit |
79f644 |
TPAW_TYPE_USER_INFO, TpawUserInfoPrivate);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
tpaw_user_info_class_init (TpawUserInfoClass *klass)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
Packit |
79f644 |
GParamSpec *param_spec;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
object_class->constructed = tpaw_user_info_constructed;
|
|
Packit |
79f644 |
object_class->dispose = tpaw_user_info_dispose;
|
|
Packit |
79f644 |
object_class->get_property = tpaw_user_info_get_property;
|
|
Packit |
79f644 |
object_class->set_property = tpaw_user_info_set_property;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_type_class_add_private (object_class, sizeof (TpawUserInfoPrivate));
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
param_spec = g_param_spec_object ("account",
|
|
Packit |
79f644 |
"account",
|
|
Packit |
79f644 |
"The #TpAccount on which user info should be edited",
|
|
Packit |
79f644 |
TP_TYPE_ACCOUNT,
|
|
Packit |
79f644 |
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
|
Packit |
79f644 |
g_object_class_install_property (object_class, PROP_ACCOUNT, param_spec);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
GtkWidget *
|
|
Packit |
79f644 |
tpaw_user_info_new (TpAccount *account)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_return_val_if_fail (TP_IS_ACCOUNT (account), NULL);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return g_object_new (TPAW_TYPE_USER_INFO,
|
|
Packit |
79f644 |
"account", account,
|
|
Packit |
79f644 |
NULL);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
void
|
|
Packit |
79f644 |
tpaw_user_info_discard (TpawUserInfo *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_return_if_fail (TPAW_IS_USER_INFO (self));
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
reload_contact_info (self);
|
|
Packit |
79f644 |
gtk_entry_set_text ((GtkEntry *) self->priv->nickname_entry,
|
|
Packit |
79f644 |
tp_account_get_nickname (self->priv->account));
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
apply_complete_one (GSimpleAsyncResult *result)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
guint count;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
count = g_simple_async_result_get_op_res_gssize (result);
|
|
Packit |
79f644 |
count--;
|
|
Packit |
79f644 |
g_simple_async_result_set_op_res_gssize (result, count);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (count == 0)
|
|
Packit |
79f644 |
g_simple_async_result_complete (result);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
avatar_chooser_apply_cb (GObject *source,
|
|
Packit |
79f644 |
GAsyncResult *result,
|
|
Packit |
79f644 |
gpointer user_data)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawAvatarChooser *avatar_chooser = (TpawAvatarChooser *) source;
|
|
Packit |
79f644 |
GSimpleAsyncResult *my_result = user_data;
|
|
Packit |
79f644 |
GError *error = NULL;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!tpaw_avatar_chooser_apply_finish (avatar_chooser, result, &error))
|
|
Packit |
79f644 |
g_simple_async_result_take_error (my_result, error);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
apply_complete_one (my_result);
|
|
Packit |
79f644 |
g_object_unref (my_result);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
set_nickname_cb (GObject *source,
|
|
Packit |
79f644 |
GAsyncResult *result,
|
|
Packit |
79f644 |
gpointer user_data)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpAccount *account = (TpAccount *) source;
|
|
Packit |
79f644 |
GSimpleAsyncResult *my_result = user_data;
|
|
Packit |
79f644 |
GError *error = NULL;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!tp_account_set_nickname_finish (account, result, &error))
|
|
Packit |
79f644 |
g_simple_async_result_take_error (my_result, error);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
apply_complete_one (my_result);
|
|
Packit |
79f644 |
g_object_unref (my_result);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
set_contact_info_cb (GObject *source,
|
|
Packit |
79f644 |
GAsyncResult *result,
|
|
Packit |
79f644 |
gpointer user_data)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpConnection *connection = (TpConnection *) source;
|
|
Packit |
79f644 |
GSimpleAsyncResult *my_result = user_data;
|
|
Packit |
79f644 |
GError *error = NULL;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!tp_connection_set_contact_info_finish (connection, result, &error))
|
|
Packit |
79f644 |
g_simple_async_result_take_error (my_result, error);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
apply_complete_one (my_result);
|
|
Packit |
79f644 |
g_object_unref (my_result);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static gboolean
|
|
Packit |
79f644 |
field_value_is_empty (TpContactInfoField *field)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
guint i;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (field->field_value == NULL)
|
|
Packit |
79f644 |
return TRUE;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Field is empty if all its values are empty */
|
|
Packit |
79f644 |
for (i = 0; field->field_value[i] != NULL; i++)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
if (!tp_str_empty (field->field_value[i]))
|
|
Packit |
79f644 |
return FALSE;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return TRUE;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
void
|
|
Packit |
79f644 |
tpaw_user_info_apply_async (TpawUserInfo *self,
|
|
Packit |
79f644 |
GAsyncReadyCallback callback,
|
|
Packit |
79f644 |
gpointer user_data)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
GSimpleAsyncResult *result;
|
|
Packit |
79f644 |
const gchar *new_nickname;
|
|
Packit |
79f644 |
guint count = 0;
|
|
Packit |
79f644 |
GList *l, *next;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_return_if_fail (TPAW_IS_USER_INFO (self));
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
result = g_simple_async_result_new ((GObject *) self, callback, user_data,
|
|
Packit |
79f644 |
tpaw_user_info_apply_async);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Apply avatar */
|
|
Packit |
79f644 |
tpaw_avatar_chooser_apply_async (
|
|
Packit |
79f644 |
(TpawAvatarChooser *) self->priv->avatar_chooser,
|
|
Packit |
79f644 |
avatar_chooser_apply_cb, g_object_ref (result));
|
|
Packit |
79f644 |
count++;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Apply nickname */
|
|
Packit |
79f644 |
new_nickname = gtk_entry_get_text (GTK_ENTRY (self->priv->nickname_entry));
|
|
Packit |
79f644 |
if (tp_strdiff (new_nickname, tp_account_get_nickname (self->priv->account)))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
tp_account_set_nickname_async (self->priv->account, new_nickname,
|
|
Packit |
79f644 |
set_nickname_cb, g_object_ref (result));
|
|
Packit |
79f644 |
count++;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Remove empty fields */
|
|
Packit |
79f644 |
for (l = self->priv->details_to_set; l != NULL; l = next)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpContactInfoField *field = l->data;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
next = l->next;
|
|
Packit |
79f644 |
if (field_value_is_empty (field))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
DEBUG ("Drop empty field: %s", field->field_name);
|
|
Packit |
79f644 |
tp_contact_info_field_free (field);
|
|
Packit |
79f644 |
self->priv->details_to_set =
|
|
Packit |
79f644 |
g_list_delete_link (self->priv->details_to_set, l);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (self->priv->details_to_set != NULL)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
if (self->priv->details_changed)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
tp_connection_set_contact_info_async (
|
|
Packit |
79f644 |
tp_account_get_connection (self->priv->account),
|
|
Packit |
79f644 |
self->priv->details_to_set, set_contact_info_cb,
|
|
Packit |
79f644 |
g_object_ref (result));
|
|
Packit |
79f644 |
count++;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
tp_contact_info_list_free (self->priv->details_to_set);
|
|
Packit |
79f644 |
self->priv->details_to_set = NULL;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
self->priv->details_changed = FALSE;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_simple_async_result_set_op_res_gssize (result, count);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_object_unref (result);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
gboolean
|
|
Packit |
79f644 |
tpaw_user_info_apply_finish (TpawUserInfo *self,
|
|
Packit |
79f644 |
GAsyncResult *result,
|
|
Packit |
79f644 |
GError **error)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
tpaw_implement_finish_void (self, tpaw_user_info_apply_async);
|
|
Packit |
79f644 |
}
|