static void gaym_clean_channel_members(GaimConversation * conv) { g_return_if_fail(conv != NULL); if (conv->type == GAIM_CONV_CHAT) { GaimConvChat *chat = gaim_conversation_get_chat_data(conv); GaimConnection *gc = gaim_conversation_get_gc(conv); g_return_if_fail(gc != NULL); struct gaym_conn *gaym = gc->proto_data; GList *users = gaim_conv_chat_get_users(chat); gaim_debug_misc("gaym", "got userlist %x length %i\n", users, g_list_length(users)); g_list_foreach(users, (GFunc) deref_one_user, gaym); } else if (conv->type == GAIM_CONV_IM) { gaim_debug_misc("gaym", "removing reference to %s\n", conv->name); GaimConnection *gc = gaim_conversation_get_gc(conv); g_return_if_fail(gc != NULL); struct gaym_conn *gaym = gc->proto_data; gaym_unreference_channel_member(gaym, conv->name); } }
void GaimChatMngr::ChatJoinedCbk(GaimConversation *conv) { mConvInfo_t *mConv = (mConvInfo_t *) conv->ui_data; if (mConv->pending_invit) { for (GList *l = mConv->pending_invit; l != NULL; l = l->next) { serv_chat_invite(gaim_conversation_get_gc(conv), gaim_conv_chat_get_id(GAIM_CONV_CHAT(conv)), "Join my conference...", (char *)l->data); } } }
static void gaym_get_photo_info(GaimConversation * conv) { char *buf; char *name; gaim_debug_misc("gaym", "Got conversation-created signal\n"); if (strncmp(conv->account->protocol_id, "prpl-gaym", 9) == 0 && gaim_conversation_get_type(conv) == GAIM_CONV_IM) { /** * First check to see if we already have the photo via * the buddy list process. */ struct gaym_conn *gaym; GaimConnection *gc = gaim_conversation_get_gc(conv); gaym = (struct gaym_conn *) gc->proto_data; if (!gaym) { return; } struct gaym_buddy *ib = g_hash_table_lookup(gaym->buddies, conv->name); if (ib) { return; } /** * Since this person isn't in our buddy list, go ahead * with the WHOIS to get the photo for the IM thumbnail */ name = gaym_nick_to_gcom_strdup(conv->name); buf = gaym_format(gaym, "vn", "WHOIS", name); gaim_debug_misc("gaym", "Conversation triggered command: %s\n", buf); gaym_send(gaym, buf); gaym_get_channel_member_reference(gaym, name); g_free(name); g_free(buf); // Opens a reference in channel_members. } }
void gaym_gtkconv_update_thumbnail(GaimConversation * conv, struct fetch_thumbnail_data *thumbnail_data) { GaimGtkConversation *gtkconv; char filename[256]; FILE *file; GError *err = NULL; size_t len; GdkPixbuf *buf; GdkPixbuf *scale; GdkPixmap *pm; GdkBitmap *bm; int scale_width, scale_height; GaimAccount *account; GaimPluginProtocolInfo *prpl_info = NULL; g_return_if_fail(conv != NULL); g_return_if_fail(GAIM_IS_GTK_CONVERSATION(conv)); g_return_if_fail(gaim_conversation_get_type(conv) == GAIM_CONV_CHAT); gtkconv = GAIM_GTK_CONVERSATION(conv); GaymChatIcon *icon_data = g_hash_table_lookup(icons, conv); if (!thumbnail_data) return; if (!icon_data->show_icon) return; const char *data = thumbnail_data->pic_data; len = thumbnail_data->pic_data_len; account = gaim_conversation_get_account(conv); if (account && account->gc) prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(account->gc->prpl); if (icon_data->anim != NULL) g_object_unref(G_OBJECT(icon_data->anim)); icon_data->anim = NULL; if (icon_data->icon_timer != 0) g_source_remove(icon_data->icon_timer); icon_data->icon_timer = 0; if (icon_data->iter != NULL) g_object_unref(G_OBJECT(icon_data->iter)); icon_data->iter = NULL; if (!gaim_prefs_get_bool ("/gaim/gtk/conversations/im/show_buddy_icons")) return; if (gaim_conversation_get_gc(conv) == NULL) return; /* this is such an evil hack, i don't know why i'm even considering it. we'll do it differently when gdk-pixbuf-loader isn't leaky anymore. */ /* gdk-pixbuf-loader was leaky? is it still? */ g_snprintf(filename, sizeof(filename), "%s" G_DIR_SEPARATOR_S "gaimicon-%s.%d", g_get_tmp_dir(), thumbnail_data->who, getpid()); if (!(file = g_fopen(filename, "wb"))) return; fwrite(data, 1, len, file); fclose(file); icon_data->anim = gdk_pixbuf_animation_new_from_file(filename, &err); /* make sure we remove the file as soon as possible */ g_unlink(filename); if (err) { gaim_debug(GAIM_DEBUG_ERROR, "gtkconv", "Buddy icon error: %s\n", err->message); g_error_free(err); } if (!icon_data->anim) return; if (gdk_pixbuf_animation_is_static_image(icon_data->anim)) { icon_data->iter = NULL; buf = gdk_pixbuf_animation_get_static_image(icon_data->anim); } else { icon_data->iter = gdk_pixbuf_animation_get_iter(icon_data->anim, NULL); /* LEAK */ buf = gdk_pixbuf_animation_iter_get_pixbuf(icon_data->iter); } get_icon_scale_size(icon_data->anim, prpl_info ? &prpl_info->icon_spec : NULL, &scale_width, &scale_height); scale = gdk_pixbuf_scale_simple(buf, MAX(gdk_pixbuf_get_width(buf) * scale_width / gdk_pixbuf_animation_get_width (icon_data->anim), 1), MAX(gdk_pixbuf_get_height(buf) * scale_height / gdk_pixbuf_animation_get_height (icon_data->anim), 1), GDK_INTERP_NEAREST); gdk_pixbuf_render_pixmap_and_mask(scale, &pm, &bm, 100); g_object_unref(G_OBJECT(scale)); icon_data->event = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(icon_data->frame), icon_data->event); gtk_widget_set_size_request(GTK_WIDGET(icon_data->frame), scale_width, scale_height); // g_signal_connect(G_OBJECT(icon_data->event), "button-press-event", // G_CALLBACK(icon_menu), conv); gtk_widget_show(icon_data->event); icon_data->icon = gtk_image_new_from_pixmap(pm, bm); gtk_container_add(GTK_CONTAINER(icon_data->event), icon_data->icon); gtk_widget_show(icon_data->icon); g_object_unref(G_OBJECT(pm)); if (bm) g_object_unref(G_OBJECT(bm)); }
void gaym_update_thumbnail(GaimConversation * conv, GdkPixbuf * pixbuf) { GaimGtkConversation *gtkconv; GdkPixbuf *scale; GdkPixmap *pm = NULL; GdkBitmap *bm = NULL; int scale_width = 0, scale_height = 0; GaimAccount *account; GaimPluginProtocolInfo *prpl_info = NULL; g_return_if_fail(conv != NULL); g_return_if_fail(GAIM_IS_GTK_CONVERSATION(conv)); g_return_if_fail(gaim_conversation_get_type(conv) == GAIM_CONV_CHAT); gtkconv = GAIM_GTK_CONVERSATION(conv); GaymChatIcon *icon_data = g_hash_table_lookup(icons, conv); if (!icon_data->show_icon) return; account = gaim_conversation_get_account(conv); if (account && account->gc) prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(account->gc->prpl); if (!gaim_prefs_get_bool ("/gaim/gtk/conversations/im/show_buddy_icons")) return; if (gaim_conversation_get_gc(conv) == NULL) return; get_icon_scale_size(pixbuf, prpl_info ? &prpl_info->icon_spec : NULL, &scale_width, &scale_height); // double // aspect=(double)gdk_pixbuf_get_width(pixbuf)/(double)gdk_pixbuf_get_height(pixbuf); // // scale = gdk_pixbuf_scale_simple(pixbuf, scale_width, scale_height, GDK_INTERP_BILINEAR); gdk_pixbuf_render_pixmap_and_mask(scale, &pm, &bm, 100); g_object_unref(G_OBJECT(scale)); icon_data->event = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(icon_data->frame), icon_data->event); gtk_widget_set_size_request(GTK_WIDGET(icon_data->frame), 57, 77); // g_signal_connect(G_OBJECT(icon_data->event), "button-press-event", // G_CALLBACK(icon_menu), conv); gtk_widget_show(icon_data->event); icon_data->icon = gtk_image_new_from_pixmap(pm, bm); gtk_container_add(GTK_CONTAINER(icon_data->event), icon_data->icon); gtk_widget_show(icon_data->icon); if (pm) g_object_unref(G_OBJECT(pm)); if (bm) g_object_unref(G_OBJECT(bm)); }