This is a pretty simple manager as duplicates are allowed and
PurpleFileTransfer all property driven which means we only need to propagate
the notify signal.
This doesn't persist across restarts as we have some other issues that are
making that harder than it needs to be.
Testing Done:
Ran the unit tests under valgrind.
Bugs closed: PIDGIN-17831
Reviewed at https://reviews.imfreedom.org/r/2874/
/* purple
*
* Purple is the legal property of its developers, whose names are too numerous
* to list here. Please refer to the COPYRIGHT file distributed with this
* source distribution.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
#include"buddyicon.h"
#include"debug.h"
#include"image.h"
#include"purpleaccountmanager.h"
#include"purpleconversation.h"
#include"purpleconversationmanager.h"
#include"purplepath.h"
#include"purpleprivate.h"
#include"purpleprotocolserver.h"
#ifdef _WIN32
#include"win32/libc_interface.h"
#endif
/* NOTE: Instances of this struct are allocated without zeroing the memory, so
* NOTE: be sure to update purple_buddy_icon_new() if you add members. */
struct_PurpleBuddyIcon
{
PurpleAccount*account;/* The account the user is on. */
PurpleImage*img;/* The image containing
the icon data. */
char*username;/* The username the icon belongs to. */
char*checksum;/* The protocol checksum. */
unsignedintref_count;/* The buddy icon reference count. */
};
/*
* This is the big grand daddy hash table that contains references to
* everybody's buddy icons.
*
* Key is a PurpleAccount.
* Value is another hash table, usually referred to as "icon_cache."
* For this inner hash table:
* Key is the username of the buddy whose icon is being stored.
* Value is the PurpleBuddyIcon for this buddy.
*/
staticGHashTable*account_cache=NULL;
/*
* This hash table contains a bunch of PurpleImages that are
* shared across all accounts.
*
* Key is the filename for this image as constructed by
* purple_image_generate_filename(). So it is the base16 encoded
* sha-1 hash plus an appropriate file extension. For example:
* "0f4972d17d1e70e751c43c90c948e72efbff9796.gif"
*
* The value is a PurpleImage containing the icon data. These images are
* reference counted, and when the count reaches 0 we remove the image from
* the hash table (but it might still be saved on disk, if the icon is being
* used by offline accounts or some such).
*/
staticGHashTable*icon_data_cache=NULL;
/*
* This hash table contains reference counts for how many times each
* icon in the ~/.purple/icons/ directory is being used. It's pretty
* crazy. It maintains the reference count across sessions, too, so
* if you exit Pidgin then this hash table is reconstructed the next
* time Pidgin starts.
*
* Key is the filename for this image as constructed by
* purple_image_generate_filename(). So it is the base16 encoded
* sha-1 hash plus an appropriate file extension. For example:
* "0f4972d17d1e70e751c43c90c948e72efbff9796.gif"
*
* The value is a GINT_TO_POINTER count of the number of times this
* icon is used. So if four of your buddies are using an icon, and
* you have the icon set for two of your accounts, then this number
* will be six. When this reference count reaches 0 the icon will
* be deleted from disk.
*/
staticGHashTable*icon_file_cache=NULL;
/*
* This hash table is used for both custom buddy icons on PurpleBlistNodes and