static gboolean tp_contact_factory_avatar_maybe_update (EmpathyTpContactFactory *tp_factory, guint handle, const gchar *token) { EmpathyContact *contact; EmpathyAvatar *avatar; contact = tp_contact_factory_find_by_handle (tp_factory, handle); if (!contact) { return TRUE; } /* Check if we have an avatar */ if (EMP_STR_EMPTY (token)) { empathy_contact_set_avatar (contact, NULL); return TRUE; } /* Check if the avatar changed */ avatar = empathy_contact_get_avatar (contact); if (avatar && !tp_strdiff (avatar->token, token)) { return TRUE; } /* The avatar changed, search the new one in the cache */ if (empathy_contact_load_avatar_cache (contact, token)) { /* Got from cache, use it */ return TRUE; } /* Avatar is not up-to-date, we have to request it. */ return FALSE; }
GdkPixbuf * empathy_pixbuf_avatar_from_contact_scaled (EmpathyContact *contact, gint width, gint height) { EmpathyAvatar *avatar; g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); avatar = empathy_contact_get_avatar (contact); return empathy_pixbuf_from_avatar_scaled (avatar, width, height); }
static GdkPixbuf * theme_boxes_get_avatar_pixbuf_with_cache (EmpathyContact *contact) { AvatarData *data; EmpathyAvatar *avatar; GdkPixbuf *tmp_pixbuf; GdkPixbuf *pixbuf = NULL; /* Check if avatar is in cache and if it's up to date */ avatar = empathy_contact_get_avatar (contact); data = g_object_get_data (G_OBJECT (contact), "chat-view-avatar-cache"); if (data) { if (avatar && !tp_strdiff (avatar->filename, data->filename)) { /* We have the avatar in cache */ return data->pixbuf; } } /* Avatar not in cache, create pixbuf */ tmp_pixbuf = empathy_pixbuf_avatar_from_contact_scaled (contact, 32, 32); if (tmp_pixbuf) { pixbuf = theme_boxes_pad_to_size (tmp_pixbuf, 32, 32, 6); g_object_unref (tmp_pixbuf); } if (!pixbuf) { return NULL; } /* Insert new pixbuf in cache. We store the filename as it's unique * for each version of an avatar, so we can use it to perform change * detection (as above). */ data = g_slice_new0 (AvatarData); data->filename = g_strdup (avatar->filename); data->pixbuf = pixbuf; g_object_set_data_full (G_OBJECT (contact), "chat-view-avatar-cache", data, theme_boxes_avatar_cache_data_free); return data->pixbuf; }
static void contact_widget_avatar_notify_cb (EmpathyContactWidget *information) { EmpathyAvatar *avatar = NULL; if (information->contact) avatar = empathy_contact_get_avatar (information->contact); if (information->flags & EMPATHY_CONTACT_WIDGET_EDIT_AVATAR) { g_signal_handlers_block_by_func (information->widget_avatar, contact_widget_avatar_changed_cb, information); empathy_avatar_chooser_set ( EMPATHY_AVATAR_CHOOSER (information->widget_avatar), avatar); g_signal_handlers_unblock_by_func (information->widget_avatar, contact_widget_avatar_changed_cb, information); } else empathy_avatar_image_set ( EMPATHY_AVATAR_IMAGE (information->widget_avatar), avatar); }
static GdkPixbuf * theme_boxes_get_avatar_pixbuf_with_cache (EmpathyContact *contact) { AvatarData *data; EmpathyAvatar *avatar; GdkPixbuf *tmp_pixbuf; GdkPixbuf *pixbuf = NULL; /* Check if avatar is in cache and if it's up to date */ avatar = empathy_contact_get_avatar (contact); data = g_object_get_data (G_OBJECT (contact), "chat-view-avatar-cache"); if (data) { if (avatar && !tp_strdiff (avatar->token, data->token)) { /* We have the avatar in cache */ return data->pixbuf; } } /* Avatar not in cache, create pixbuf */ tmp_pixbuf = empathy_pixbuf_avatar_from_contact_scaled (contact, 32, 32); if (tmp_pixbuf) { pixbuf = theme_boxes_pad_to_size (tmp_pixbuf, 32, 32, 6); g_object_unref (tmp_pixbuf); } if (!pixbuf) { return NULL; } /* Insert new pixbuf in cache */ data = g_slice_new0 (AvatarData); data->token = g_strdup (avatar->token); data->pixbuf = pixbuf; g_object_set_data_full (G_OBJECT (contact), "chat-view-avatar-cache", data, theme_boxes_avatar_cache_data_free); return data->pixbuf; }
static void megaphone_applet_update_contact (MegaphoneApplet *applet) { MegaphoneAppletPriv *priv = GET_PRIV (applet); const gchar *name; const gchar *status; gchar *tip; const gchar *avatar_token = NULL; if (priv->contact) { EmpathyAvatar *avatar; avatar = empathy_contact_get_avatar (priv->contact); if (avatar) { avatar_token = avatar->token; } } if (avatar_token) { panel_applet_gconf_set_string (PANEL_APPLET (applet), "avatar_token", avatar_token, NULL); } megaphone_applet_update_icon (applet); if (priv->contact ) { name = empathy_contact_get_name (priv->contact); status = empathy_contact_get_status (priv->contact); tip = g_strdup_printf ("<b>%s</b>: %s", name, status); gtk_widget_set_tooltip_markup (GTK_WIDGET (applet), tip); g_free (tip); } else { gtk_widget_set_tooltip_markup (GTK_WIDGET (applet), _("Please configure a contact.")); } }
static void popup_avatar_menu (EmpathyContactWidget *information, GtkWidget *parent, GdkEventButton *event) { GtkWidget *menu, *item; gint button, event_time; if (information->contact == NULL || empathy_contact_get_avatar (information->contact) == NULL) return; menu = gtk_menu_new (); /* Add "Save as..." entry */ item = gtk_image_menu_item_new_from_stock (GTK_STOCK_SAVE_AS, NULL); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_show (item); g_signal_connect (item, "activate", G_CALLBACK (save_avatar_menu_activate_cb), information); if (event) { button = event->button; event_time = event->time; } else { button = 0; event_time = gtk_get_current_event_time (); } gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, button, event_time); g_object_ref_sink (menu); g_object_unref (menu); }
static void save_avatar_menu_activate_cb (GtkWidget *widget, EmpathyContactWidget *information) { GtkWidget *dialog; EmpathyAvatar *avatar; gchar *ext = NULL, *filename; dialog = gtk_file_chooser_dialog_new (_("Save Avatar"), NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE); /* look for the avatar extension */ avatar = empathy_contact_get_avatar (information->contact); if (avatar->format != NULL) { gchar **splitted; splitted = g_strsplit (avatar->format, "/", 2); if (splitted[0] != NULL && splitted[1] != NULL) ext = g_strdup (splitted[1]); g_strfreev (splitted); } else { /* Avatar was loaded from the cache so was converted to PNG */ ext = g_strdup ("png"); } if (ext != NULL) { gchar *id; id = tp_escape_as_identifier (empathy_contact_get_id ( information->contact)); filename = g_strdup_printf ("%s.%s", id, ext); gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), filename); g_free (id); g_free (ext); g_free (filename); } if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { GError *error = NULL; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); if (!empathy_avatar_save_to_file (avatar, filename, &error)) { /* Save error */ GtkWidget *dialog; dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Unable to save avatar")); gtk_message_dialog_format_secondary_text ( GTK_MESSAGE_DIALOG (dialog), "%s", error->message); g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL); gtk_window_present (GTK_WINDOW (dialog)); g_clear_error (&error); } g_free (filename); } gtk_widget_destroy (dialog); }
void empathy_log_manager_add_message (EmpathyLogManager *manager, const gchar *chat_id, gboolean chatroom, EmpathyMessage *message) { FILE *file; McAccount *account; EmpathyContact *sender; const gchar *body_str; const gchar *str; EmpathyAvatar *avatar; gchar *avatar_token = NULL; gchar *filename; gchar *basedir; gchar *body; gchar *timestamp; gchar *contact_name; gchar *contact_id; TpChannelTextMessageType msg_type; g_return_if_fail (EMPATHY_IS_LOG_MANAGER (manager)); g_return_if_fail (chat_id != NULL); g_return_if_fail (EMPATHY_IS_MESSAGE (message)); sender = empathy_message_get_sender (message); account = empathy_contact_get_account (sender); body_str = empathy_message_get_body (message); msg_type = empathy_message_get_tptype (message); if (EMP_STR_EMPTY (body_str)) { return; } filename = log_manager_get_filename (manager, account, chat_id, chatroom); basedir = g_path_get_dirname (filename); if (!g_file_test (basedir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) { DEBUG ("Creating directory:'%s'", basedir); g_mkdir_with_parents (basedir, LOG_DIR_CREATE_MODE); } g_free (basedir); DEBUG ("Adding message: '%s' to file: '%s'", body_str, filename); if (!g_file_test (filename, G_FILE_TEST_EXISTS)) { file = g_fopen (filename, "w+"); if (file) { g_fprintf (file, LOG_HEADER); } g_chmod (filename, LOG_FILE_CREATE_MODE); } else { file = g_fopen (filename, "r+"); if (file) { fseek (file, - strlen (LOG_FOOTER), SEEK_END); } } body = g_markup_escape_text (body_str, -1); timestamp = log_manager_get_timestamp_from_message (message); str = empathy_contact_get_name (sender); contact_name = g_markup_escape_text (str, -1); str = empathy_contact_get_id (sender); contact_id = g_markup_escape_text (str, -1); avatar = empathy_contact_get_avatar (sender); if (avatar) { avatar_token = g_markup_escape_text (avatar->token, -1); } g_fprintf (file, "<message time='%s' id='%s' name='%s' token='%s' isuser='******' type='%s'>%s</message>\n" LOG_FOOTER, timestamp, contact_id, contact_name, avatar_token ? avatar_token : "", empathy_contact_is_user (sender) ? "true" : "false", empathy_message_type_to_str (msg_type), body); fclose (file); g_free (filename); g_free (contact_id); g_free (contact_name); g_free (timestamp); g_free (body); g_free (avatar_token); }
static void megaphone_applet_update_icon (MegaphoneApplet *applet) { MegaphoneAppletPriv *priv = GET_PRIV (applet); EmpathyAvatar *avatar = NULL; GdkPixbuf *avatar_pixbuf; if (priv->contact) { avatar = empathy_contact_get_avatar (priv->contact); } else { gtk_image_set_from_icon_name (GTK_IMAGE (priv->image), GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU); return; } if (!avatar) { gchar *avatar_token; /* Try to take avatar from cache */ avatar_token = panel_applet_gconf_get_string (PANEL_APPLET (applet), "avatar_token", NULL); if (!EMP_STR_EMPTY (avatar_token)) { empathy_contact_load_avatar_cache (priv->contact, avatar_token); avatar = empathy_contact_get_avatar (priv->contact); } g_free (avatar_token); } if (avatar) { avatar_pixbuf = empathy_pixbuf_from_avatar_scaled (avatar, priv->image_size - 2, priv->image_size - 2); } else { GtkIconTheme *icon_theme; /* Load the default icon when no avatar is found */ icon_theme = gtk_icon_theme_get_default (); avatar_pixbuf = gtk_icon_theme_load_icon (icon_theme, "stock_contact", priv->image_size - 2, 0, NULL); } /* Now some desaturation if the contact is offline */ if (!empathy_contact_is_online (priv->contact)) { GdkPixbuf *offline_avatar; offline_avatar = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, gdk_pixbuf_get_height (avatar_pixbuf), gdk_pixbuf_get_width (avatar_pixbuf)); gdk_pixbuf_saturate_and_pixelate (avatar_pixbuf, offline_avatar, 0.0, TRUE); g_object_unref (avatar_pixbuf); avatar_pixbuf = offline_avatar; } gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), avatar_pixbuf); g_object_unref (avatar_pixbuf); }