pidgin/purple-plugin-pack

Tweak plugins.cfg for switchspell to note the change in enchant support
org.guifications.plugins
2008-07-22, rekkanoryo
6bf9c444fc79
Tweak plugins.cfg for switchspell to note the change in enchant support
status, which is unfortunately somewhat buggy. I'll trust the distro
packagers to handle this correctly for their individual distros.
/*
* Purple Plugin Pack
* Copyright (C) 2003-2008
* See ../AUTHORS for a list of all authors
*
* listhandler: Provides importing, exporting, and copying functions
* for accounts' buddy lists.
*
* 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 "listhandler.h"
#include "purple_blist_xml.h"
/*****************************************************************************
* Structs
****************************************************************************/
typedef struct {
/* important stuff for adding the buddies back */
gchar *screenname;
gchar *alias;
const gchar *group;
const gchar *account;
const gchar *prpl_id;
/* useful blistnode settings */
gint signed_on;
gint signed_off;
gint lastseen;
gint last_seen;
gchar *gf_theme;
gchar *icon_file;
gchar *lastsaid;
gchar *notes;
} LhPbxInfo;
/*****************************************************************************
* Globals
****************************************************************************/
static GList *infolist = NULL;
/*****************************************************************************
* "API"
****************************************************************************/
static LhPbxInfo *
lh_pbx_info_new(void)
{
return g_new0(LhPbxInfo, 1);
}
static void
lh_pbx_info_destroy(LhPbxInfo *l)
{
/* clean up the allocated memory returned by the xmlnode api */
g_free(l->screenname);
g_free(l->alias);
g_free(l->gf_theme);
g_free(l->icon_file);
g_free(l->lastsaid);
g_free(l->notes);
/* now clean up the memory allocated for this struct */
g_free(l);
return;
}
/*****************************************************************************
* Helpers
****************************************************************************/
static void
lh_pbx_import_cleanup(void)
{
GList *tmp = infolist;
for(; tmp; tmp = g_list_next(tmp))
lh_pbx_info_destroy((LhPbxInfo *)(tmp->data));
g_list_free(infolist);
return;
}
static void
lh_pbx_import_file_parse(const char *file)
{
GError *error = NULL;
LhPbxInfo *tmpinfo = NULL;
gchar *contents = NULL;
gsize length = 0;
xmlnode *root = NULL, *blist = NULL, *giter = NULL, *citer = NULL, *biter = NULL, *siter = NULL;
/* grab the file contents, but bail out if there's an error */
if(!g_file_get_contents(file, &contents, &length, &error)) {
purple_debug_error("listhandler: import: blist.xml", "Error reading %s: %s\n",
file ? file : "(null)", error->message ? error->message : "(null)");
return;
}
/* if we get here, we have the file's contents--parse into xmlnode tree */
root = xmlnode_from_str(contents, -1);
blist = xmlnode_get_child(root, "blist");
giter = xmlnode_get_child(blist, "group");
for(; giter; giter = xmlnode_get_next_twin(giter)) {
citer = xmlnode_get_child(giter, "contact");
for(; citer; citer = xmlnode_get_next_twin(citer)) {
biter = xmlnode_get_child(citer, "buddy");
for(; biter; biter = xmlnode_get_next_twin(biter)) {
tmpinfo = lh_pbx_info_new();
siter = xmlnode_get_child(biter, "setting");
tmpinfo->screenname = xmlnode_get_data(xmlnode_get_child(biter, "name"));
tmpinfo->alias = xmlnode_get_data(xmlnode_get_child(biter, "alias"));
tmpinfo->group = xmlnode_get_attrib(giter, "name");
tmpinfo->account = xmlnode_get_attrib(biter, "account");
tmpinfo->prpl_id = xmlnode_get_attrib(biter, "proto");
for(; siter; siter = xmlnode_get_next_twin(siter)) {
const gchar *setting_name = NULL;
gchar *data = NULL;
setting_name = xmlnode_get_attrib(siter, "name");
data = xmlnode_get_data(siter);
if(g_ascii_strcasecmp("signedon", setting_name))
tmpinfo->signed_on = data ? atoi(data) : 0;
else if(g_ascii_strcasecmp("signedoff", setting_name))
tmpinfo->signed_off = data ? atoi(data) : 0;
else if(g_ascii_strcasecmp("lastseen", setting_name))
tmpinfo->lastseen = data ? atoi(data) : 0;
else if(g_ascii_strcasecmp("last_seen", setting_name))
tmpinfo->last_seen = data ? atoi(data) : 0;
else if(g_ascii_strcasecmp("guifications-theme", setting_name))
tmpinfo->gf_theme = data;
else if(g_ascii_strcasecmp("buddy_icon", setting_name))
tmpinfo->icon_file = data;
else if(g_ascii_strcasecmp("lastsaid", setting_name))
tmpinfo->lastsaid = data;
else if(g_ascii_strcasecmp("notes", setting_name))
tmpinfo->notes = data;
}
infolist = g_list_prepend(infolist, tmpinfo);
}
}
}
return;
}
/*****************************************************************************
* Plugin Stuff
****************************************************************************/
static void
lh_pbx_import_add_buddies(void *ignored, PurpleRequestFields *fields)
{
GList *tmp = infolist;
LhPbxInfo *itmp = NULL;
PurpleAccount *target = NULL;
const gchar *target_name = NULL, *target_prpl = NULL;
target = purple_request_fields_get_account(fields, "pbx_target_acct");
target_name = purple_account_get_username(target);
target_prpl = purple_account_get_protocol_id(target);
purple_debug_info("listhandler: import", "Got target account: %s on %s\n",
target_name, target_prpl);
for(; tmp; tmp = tmp->next) {
itmp = tmp->data;
if(!strcmp(itmp->account, target_name) && !strcmp(itmp->prpl_id, target_prpl)) {
purple_debug_info("listhandler: import",
"Current entry in infolist matches target account!\n");
lh_util_add_buddy(itmp->group, purple_group_new(itmp->group), itmp->screenname,
itmp->alias, target, itmp->notes, itmp->signed_on, itmp->signed_off,
itmp->lastseen, itmp->last_seen, itmp->gf_theme, itmp->icon_file,
itmp->lastsaid);
}
}
return;
}
static void
lh_pbx_import_target_request(void)
{
PurpleRequestField *field = NULL;
PurpleRequestFields *request = NULL;
PurpleRequestFieldGroup *group = NULL;
request = purple_request_fields_new();
group = purple_request_field_group_new(NULL);
purple_request_fields_add_group(request, group);
field = purple_request_field_account_new("pbx_target_acct", _("Account"), NULL);
purple_request_field_set_required(field, TRUE);
purple_request_field_group_add_field(group, field);
purple_request_fields(purple_get_blist(), _("Listhandler - Importing"),
_("Choose the account whose buddy list you wish to restore:"),
NULL, request, _("_Import"), G_CALLBACK(lh_pbx_import_add_buddies),
_("_Cancel"), NULL, NULL, NULL, NULL, NULL);
return;
}
static void
lh_pbx_import_request_cb(void *user_data, const char *file)
{
purple_debug_info("listhandler: import", "In request callback\n");
lh_pbx_import_file_parse(file);
lh_pbx_import_target_request();
lh_pbx_import_cleanup();
return;
}
void
lh_pbx_import_action_cb(PurplePluginAction *action)
{
purple_debug_info("listhandler: import", "Requesting the blist.xml to import\n");
purple_request_file(listhandler, _("Choose a Libpurple blist.xml File To Import"),
NULL, FALSE, G_CALLBACK(lh_pbx_import_request_cb), NULL, NULL, NULL, NULL, NULL);
return;
}