Thu, 06 Aug 2009 12:30:12 -0700
s/purple.guifications.org/plugins.guifications.org/
/* * 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; }