pidgin/purple-plugin-pack
Clone
Summary
Browse
Changes
Graph
Add the turtles target to keep the foot clan at bay
default
tip
13 months ago, Gary Kramlich
63ad7e4f10b4
Add the turtles target to keep the foot clan at bay
Testing Done:
Ran `ninja turtles` and verified it worked correctly.
Reviewed at https://reviews.imfreedom.org/r/2409/
/*
* Album (Buddy Icon Archiver)
*
* Copyright (C) 2005-2008, Sadrul Habib Chowdhury <imadil@gmail.com>
* Copyright (C) 2005-2008, Richard Laager <rlaager@pidgin.im>
*
* 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
"album.h"
#include
<errno.h>
#include
<string.h>
/* We want to use the gstdio functions when possible so that non-ASCII
* filenames are handled properly on Windows. */
#include
<glib/gstdio.h>
#ifndef _WIN32
#include
<sys/types.h>
#include
<utime.h>
#include
<unistd.h>
#endif
#include
<buddyicon.h>
#include
<debug.h>
#include
<plugin.h>
#include
<util.h>
#include
<cipher.h>
/* GUI */
#include
<gtkplugin.h>
#include
"album-ui.h"
GHashTable
*
buddy_windows
;
#define PLUGIN_AUTHOR "Richard Laager <rlaager@guifications.org>" \
"\n\t\t\tSadrul Habib Chowdhury <imadil@gmail.com>"
/*****************************************************************************
* Prototypes *
*****************************************************************************/
static
gboolean
plugin_load
(
PurplePlugin
*
plugin
);
/*****************************************************************************
* Plugin Info *
*****************************************************************************/
static
PurplePluginInfo
info
=
{
PURPLE_PLUGIN_MAGIC
,
PURPLE_MAJOR_VERSION
,
0
,
PURPLE_PLUGIN_STANDARD
,
/**< type */
PIDGIN_PLUGIN_TYPE
,
/**< ui_requirement */
0
,
/**< flags */
NULL
,
/**< dependencies */
PURPLE_PRIORITY_DEFAULT
,
/**< priority */
PLUGIN_ID
,
/**< id */
NULL
,
/**< name */
PP_VERSION
,
/**< version */
NULL
,
/**< summary */
NULL
,
/**< description */
PLUGIN_AUTHOR
,
/**< author */
PP_WEBSITE
,
/**< homepage */
plugin_load
,
/**< load */
NULL
,
/**< unload */
NULL
,
/**< destroy */
NULL
,
/**< ui_info */
NULL
,
/**< extra_info */
NULL
,
/**< prefs_info */
album_get_plugin_actions
,
/**< plugin actions */
NULL
,
/**< reserved 1 */
NULL
,
/**< reserved 2 */
NULL
,
/**< reserved 3 */
NULL
/**< reserved 4 */
};
/*****************************************************************************
* Helpers *
*****************************************************************************/
char
*
album_buddy_icon_get_dir
(
PurpleAccount
*
account
,
const
char
*
name
)
{
PurplePlugin
*
prpl
;
const
char
*
prpl_name
;
char
*
acct_name
;
char
*
buddy_name
;
char
*
dir
;
g_return_val_if_fail
(
account
!=
NULL
,
NULL
);
g_return_val_if_fail
(
name
!=
NULL
,
NULL
);
/* BUILD THE DIRECTORY PATH */
prpl
=
purple_find_prpl
(
purple_account_get_protocol_id
(
account
));
if
(
!
prpl
)
g_return_val_if_reached
(
NULL
);
prpl_name
=
PURPLE_PLUGIN_PROTOCOL_INFO
(
prpl
)
->
list_icon
(
account
,
NULL
);
acct_name
=
g_strdup
(
purple_escape_filename
(
purple_normalize
(
account
,
purple_account_get_username
(
account
))));
buddy_name
=
g_strdup
(
purple_escape_filename
(
purple_normalize
(
account
,
name
)));
dir
=
g_build_filename
(
purple_buddy_icons_get_cache_dir
(),
prpl_name
,
acct_name
,
buddy_name
,
NULL
);
g_free
(
acct_name
);
g_free
(
buddy_name
);
return
dir
;
}
/*****************************************************************************
* Callbacks *
*****************************************************************************/
static
void
store_buddy_icon
(
PurpleBuddyIcon
*
icon
,
PurpleBuddy
*
buddy
)
{
char
*
icon_path
;
char
*
filename
;
char
*
path
;
char
*
dir
;
gconstpointer
icon_data
;
size_t
len
;
FILE
*
file
;
#ifndef _WIN32
int
status
;
#endif
/* BUILD THE DIRECTORY PATH & CREATE DIRECTORY */
dir
=
album_buddy_icon_get_dir
(
purple_buddy_get_account
(
buddy
),
purple_buddy_get_name
(
buddy
));
purple_build_dir
(
dir
,
S_IRUSR
|
S_IWUSR
|
S_IXUSR
);
icon_path
=
purple_buddy_icon_get_full_path
(
icon
);
filename
=
g_path_get_basename
(
icon_path
);
path
=
g_build_filename
(
dir
,
filename
,
NULL
);
g_free
(
dir
);
g_free
(
filename
);
#ifndef _WIN32
/* TRY MAKING A HARD LINK */
status
=
link
(
icon_path
,
path
);
if
(
status
!=
0
)
{
if
(
status
!=
EEXIST
)
{
#endif
icon_data
=
purple_buddy_icon_get_data
(
icon
,
&
len
);
/* WRITE THE DATA */
if
((
file
=
g_fopen
(
path
,
"wb"
))
!=
NULL
)
{
if
(
!
fwrite
(
icon_data
,
len
,
1
,
file
))
{
purple_debug_error
(
PLUGIN_STATIC_NAME
,
"Failed to write to %s: %s
\n
"
,
path
,
strerror
(
errno
));
fclose
(
file
);
g_unlink
(
path
);
}
else
fclose
(
file
);
}
#ifndef _WIN32
}
else
{
utime
(
path
,
NULL
);
}
}
#endif
g_free
(
icon_path
);
g_free
(
path
);
}
static
void
cache_for_buddy
(
gpointer
key
,
PurpleBuddy
*
buddy
,
gpointer
data
)
{
PurpleBuddyIcon
*
icon
;
icon
=
purple_buddy_get_icon
(
buddy
);
if
(
icon
==
NULL
)
return
;
purple_debug_misc
(
PLUGIN_STATIC_NAME
,
"Caching icon for buddy: %s
\n
"
,
purple_buddy_get_name
(
buddy
));
store_buddy_icon
(
icon
,
buddy
);
}
static
void
cache_existing_icons
(
gpointer
data
)
{
/* Cache Existing Icons */
g_hash_table_foreach
(
purple_get_blist
()
->
buddies
,
(
GHFunc
)
cache_for_buddy
,
data
);
}
static
void
buddy_icon_changed_cb
(
PurpleBuddy
*
buddy
)
{
/* This callback doesn't use either of the arguments besides buddy,
* so it's convenient to reuse it here. */
cache_for_buddy
(
NULL
,
buddy
,
NULL
);
}
/*****************************************************************************
* Plugin Code *
*****************************************************************************/
static
gboolean
plugin_load
(
PurplePlugin
*
plugin
)
{
purple_signal_connect
(
purple_blist_get_handle
(),
"buddy-icon-changed"
,
plugin
,
PURPLE_CALLBACK
(
buddy_icon_changed_cb
),
NULL
);
/* Some UI stuff here. */
purple_signal_connect_priority
(
purple_blist_get_handle
(),
"buddy-icon-changed"
,
plugin
,
PURPLE_CALLBACK
(
album_update_runtime
),
NULL
,
PURPLE_SIGNAL_PRIORITY_DEFAULT
+
1
);
purple_signal_connect
(
purple_blist_get_handle
(),
"blist-node-extended-menu"
,
plugin
,
PURPLE_CALLBACK
(
album_blist_node_menu_cb
),
NULL
);
cache_existing_icons
(
NULL
);
buddy_windows
=
g_hash_table_new_full
(
icon_viewer_hash
,
icon_viewer_equal
,
icon_viewer_key_free
,
g_free
);
return
TRUE
;
}
static
void
plugin_init
(
PurplePlugin
*
plugin
)
{
#ifdef ENABLE_NLS
bindtextdomain
(
GETTEXT_PACKAGE
,
PP_LOCALEDIR
);
bind_textdomain_codeset
(
GETTEXT_PACKAGE
,
"UTF-8"
);
#endif
/* ENABLE_NLS */
info
.
name
=
_
(
"Album"
);
info
.
summary
=
_
(
"Archives buddy icons."
);
info
.
description
=
_
(
"Enable this plugin to automatically archive all buddy icons."
);
/* Setup preferences. */
purple_prefs_add_none
(
PREF_PREFIX
);
purple_prefs_add_int
(
PREF_WINDOW_HEIGHT
,
258
);
purple_prefs_add_int
(
PREF_WINDOW_WIDTH
,
362
);
purple_prefs_add_int
(
PREF_ICON_SIZE
,
1
);
}
PURPLE_INIT_PLUGIN
(
PLUGIN_STATIC_NAME
,
plugin_init
,
info
)