Exemplo n.º 1
0
static TwitterConvIcon *twitter_conv_icon_find(PurpleAccount * account, const char *who)
{
    PurpleConnection *gc = purple_account_get_connection(account);
    PurpleBuddyIcon *buddy_icon;
    TwitterConvIcon *conv_icon;
    TwitterConnectionData *twitter;

    if (!gc) {
        return NULL;
    }
    twitter = gc->proto_data;

    if (!twitter) {
        return NULL;
    }

    purple_debug_info(PLUGIN_ID, "Looking up %s\n", who);
    conv_icon = g_hash_table_lookup(twitter->icons, purple_normalize(account, who));
    if ((!conv_icon || !conv_icon->pixbuf) && (buddy_icon = purple_buddy_icons_find(account, who))) {
        if (!conv_icon) {
            if ((conv_icon = buddy_icon_to_conv_icon(buddy_icon)))
                g_hash_table_insert(twitter->icons, g_strdup(purple_normalize(account, who)), conv_icon);
        } else {
            conv_icon_set_buddy_icon_data(conv_icon, buddy_icon);
        }
        purple_buddy_icon_unref(buddy_icon);
    }
    return conv_icon;                            //may be NULL
}
Exemplo n.º 2
0
static void netsoul_close (PurpleConnection *gc)
{
  PurpleBlistNode *gnode, *cnode, *bnode;
  NetsoulData	*ns = gc->proto_data;

  purple_debug_info("netsoul", "netsoul_close\n");

  for(gnode = purple_get_blist()->root; gnode; gnode = gnode->next) {
    if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) continue;
    for(cnode = gnode->child; cnode; cnode = cnode->next) {
      if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) continue;
      for(bnode = cnode->child; bnode; bnode = bnode->next) {
	if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) continue;
	if(((PurpleBuddy*)bnode)->account == gc->account)
	{
	  PurpleBuddy *buddy = (PurpleBuddy*)bnode;
	  if (buddy)
	    purple_buddy_icon_unref(purple_buddy_get_icon(buddy));
	}
      }
    }
  }

  g_free(ns->challenge);
  g_free(ns->host);
  close(ns->fd);
  g_free(ns);
  purple_input_remove(gc->inpa);
}
Exemplo n.º 3
0
void
purple_buddy_icons_set_for_user(PurpleAccount *account, const char *username,
                                void *icon_data, size_t icon_len,
                                const char *checksum)
{
	GHashTable *icon_cache;
	PurpleBuddyIcon *icon = NULL;

	g_return_if_fail(account  != NULL);
	g_return_if_fail(username != NULL);

	icon_cache = g_hash_table_lookup(account_cache, account);

	if (icon_cache != NULL)
		icon = g_hash_table_lookup(icon_cache, username);

	if (icon != NULL)
		purple_buddy_icon_set_data(icon, icon_data, icon_len, checksum);
	else if (icon_data && icon_len > 0)
	{
		PurpleBuddyIcon *icon = purple_buddy_icon_new(account, username, icon_data, icon_len, checksum);

		/* purple_buddy_icon_new() calls
		 * purple_buddy_icon_set_data(), which calls
		 * purple_buddy_icon_update(), which has the buddy list
		 * and conversations take references as appropriate.
		 * This function doesn't return icon, so we can't
		 * leave a reference dangling. */
		purple_buddy_icon_unref(icon);
	}
	else
	{
		/* If the buddy list or a conversation was holding a
		 * reference, we'd have found the icon in the cache.
		 * Since we know we're deleting the icon, we only
		 * need a subset of purple_buddy_icon_update(). */

		GSList *buddies = purple_find_buddies(account, username);
		while (buddies != NULL)
		{
			PurpleBuddy *buddy = (PurpleBuddy *)buddies->data;

			unref_filename(purple_blist_node_get_string((PurpleBlistNode *)buddy, "buddy_icon"));
			purple_blist_node_remove_setting((PurpleBlistNode *)buddy, "buddy_icon");
			purple_blist_node_remove_setting((PurpleBlistNode *)buddy, "icon_checksum");

			buddies = g_slist_delete_link(buddies, buddies);
		}
	}
}
Exemplo n.º 4
0
//
// This function updates a given buddy. It first does a lookup the the buddy in
// the internal lookup table of buddies that where defined in the JSON file. If
// the buddy can't be found then no processing is done. Otherwise the buddy's
// name is changed unless if the buddy has already a name. Finally the buddy's
// icon is downloaded unless if the buddy has already an icon. The buddy icon is
// downloaded asynchronously.
//
// Returns a SoupMessage* if the buddy icon has been scheduled for a download.
//
static SoupMessage*
budicons_buddy_update (BudiconsPlugin *plugin, PurpleBuddy *buddy) {
	// Take the next buddy/user to process
	g_print("Buddy %s\n", buddy->name);

	BudiconsUser *user = g_hash_table_lookup(plugin->users, buddy->name);
	if (user == NULL) {return NULL;}

	// Set the buddy's name (alias) if it's still unset
	gboolean force_rename = budicons_prefs_get_force_name_update();
	if (force_rename || buddy->alias == NULL || EQ(buddy->name, buddy->alias)) {
		g_print("Rename %s to %s\n", buddy->alias, user->name);
		purple_blist_alias_buddy(buddy, user->name);
	}

	// Check if the buddy has already an image
	if (user->image == NULL) {return NULL;}
	PurpleBuddyIcon *icon = purple_buddy_icons_find(buddy->account, buddy->name);
	gboolean force_download = budicons_prefs_get_force_icon_download();
	if (icon != NULL) {
		// This buddy has already an icon
		purple_buddy_icon_unref(icon);
		if (!force_download) {
			// Don't redownload the icon once more
			return NULL;
		}
	}

	// Download the buddy's image since it doesn't have one (asynchronous)
	SoupMessage *message = soup_message_new(SOUP_METHOD_GET, user->image);
	if (message == NULL) {
		g_print("Invalid URL %s for buddy %s\n", user->image, buddy->name);
		return NULL;
	}
	g_print("Download of %s\n", user->image);
	return message;
}
Exemplo n.º 5
0
void
purple_buddy_icon_update(PurpleBuddyIcon *icon)
{
	PurpleConversation *conv;
	PurpleAccount *account;
	const char *username;
	PurpleBuddyIcon *icon_to_set;
	GSList *buddies;

	g_return_if_fail(icon != NULL);

	account  = purple_buddy_icon_get_account(icon);
	username = purple_buddy_icon_get_username(icon);

	/* If no data exists (icon->img == NULL), then call the functions below
	 * with NULL to unset the icon.  They will then unref the icon and it should
	 * be destroyed.  The only way it wouldn't be destroyed is if someone
	 * else is holding a reference to it, in which case they can kill
	 * the icon when they realize it has no data. */
	icon_to_set = icon->img ? icon : NULL;

	/* Ensure that icon remains valid throughout */
	purple_buddy_icon_ref(icon);

	buddies = purple_find_buddies(account, username);
	while (buddies != NULL)
	{
		PurpleBuddy *buddy = (PurpleBuddy *)buddies->data;
		char *old_icon;

		purple_buddy_set_icon(buddy, icon_to_set);
		old_icon = g_strdup(purple_blist_node_get_string((PurpleBlistNode *)buddy,
		                                                 "buddy_icon"));
		if (icon->img && purple_buddy_icons_is_caching())
		{
			const char *filename = purple_imgstore_get_filename(icon->img);
			purple_blist_node_set_string((PurpleBlistNode *)buddy,
			                             "buddy_icon",
			                             filename);

			if (icon->checksum && *icon->checksum)
			{
				purple_blist_node_set_string((PurpleBlistNode *)buddy,
				                             "icon_checksum",
				                             icon->checksum);
			}
			else
			{
				purple_blist_node_remove_setting((PurpleBlistNode *)buddy,
				                                 "icon_checksum");
			}
			ref_filename(filename);
		}
		else if (!icon->img)
		{
			purple_blist_node_remove_setting((PurpleBlistNode *)buddy, "buddy_icon");
			purple_blist_node_remove_setting((PurpleBlistNode *)buddy, "icon_checksum");
		}
		unref_filename(old_icon);
		g_free(old_icon);

		buddies = g_slist_delete_link(buddies, buddies);
	}

	conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, username, account);

	if (conv != NULL)
		purple_conv_im_set_icon(PURPLE_CONV_IM(conv), icon_to_set);

	/* icon's refcount was incremented above */
	purple_buddy_icon_unref(icon);
}