pidgin/purple-plugin-pack

6755acea599e
I give you handling of libpurple blist.xml files at long last. This compiles,
but I haven't yet had the chance to thoroughly test. Fixes #420
--- a/listhandler/gen_xml_files.c Fri Sep 28 12:28:14 2007 -0400
+++ b/listhandler/gen_xml_files.c Wed Oct 03 06:34:39 2007 -0400
@@ -80,7 +80,7 @@
lh_util_add_buddy(group_name, purple_group,
xmlnode_get_attrib(buddy, "screenname"),
xmlnode_get_attrib(buddy, "alias"), target_account,
- xmlnode_get_attrib(buddy, "notes"));
+ xmlnode_get_attrib(buddy, "notes"), 0, 0, 0, 0, NULL, NULL, NULL);
/* get the next buddy in the current group */
buddy = xmlnode_get_next_twin(buddy);
--- a/listhandler/lh_util.c Fri Sep 28 12:28:14 2007 -0400
+++ b/listhandler/lh_util.c Wed Oct 03 06:34:39 2007 -0400
@@ -26,19 +26,34 @@
void
lh_util_add_buddy(const gchar *group, PurpleGroup *purple_group,
const gchar *buddy, const gchar *alias, PurpleAccount *account,
- const gchar *buddynotes)
+ const gchar *buddynotes, gint signed_on, gint signed_off, gint lastseen,
+ gint last_seen, const gchar *gf_theme, const gchar *icon_file, gchar *lastsaid)
{
- /* create a PurpleBuddy and add it to the list in the specified group.
- * The first NULL is because we have no contact. Let the user do that.
- * The second NULL is because we're prepending to the group. Let the
- * user organize in whatever order he/she wants. This also is surprisingly
- * easy to do. */
- PurpleBuddy *purple_buddy = purple_buddy_new(account, buddy, alias);
+ PurpleBuddy *purple_buddy = NULL;
+ PurpleBlistNode *node = NULL;
+
+ purple_buddy = purple_buddy_new(account, buddy, alias);
+ node = (PurpleBlistNode *)purple_buddy;
+
purple_blist_add_buddy(purple_buddy, NULL, purple_group, NULL);
purple_account_add_buddy(account, purple_buddy);
if(buddynotes)
- purple_blist_node_set_string((PurpleBlistNode *)purple_buddy, "notes", buddynotes);
+ purple_blist_node_set_string(node, "notes", buddynotes);
+ if(signed_on)
+ purple_blist_node_set_int(node, "signedon", signed_on);
+ if(signed_off)
+ purple_blist_node_set_int(node, "signedoff", signed_off);
+ if(lastseen)
+ purple_blist_node_set_int(node, "lastseen", lastseen);
+ if(last_seen)
+ purple_blist_node_set_int(node, "last_seen", last_seen);
+ if(gf_theme)
+ purple_blist_node_set_string(node, "guifications-theme", gf_theme);
+ if(icon_file)
+ purple_blist_node_set_string(node, "buddy_icon", icon_file);
+ if(lastsaid)
+ purple_blist_node_set_string(node, "lastsaid", lastsaid);
purple_debug_info("listhandler: import",
"group: %s\tbuddy: %s\talias: %s\thas been added to the list\n",
--- a/listhandler/lh_util.h Fri Sep 28 12:28:14 2007 -0400
+++ b/listhandler/lh_util.h Wed Oct 03 06:34:39 2007 -0400
@@ -22,8 +22,10 @@
*/
void lh_util_add_buddy(const gchar *group, PurpleGroup *purple_group,
- const gchar *buddy, const gchar *alias,
- PurpleAccount *account, const gchar *buddynotes);
+ const gchar *buddy, const gchar *alias, PurpleAccount *account,
+ const gchar *buddynotes, gint signed_on, gint signed_off,
+ gint lastseen, gint last_seen, const gchar *gf_theme,
+ const gchar *icon_file, gchar *lastsaid);
void lh_util_add_to_blist(GList *buddies, GList *groups);
--- a/listhandler/purple_blist_xml.c Fri Sep 28 12:28:14 2007 -0400
+++ b/listhandler/purple_blist_xml.c Wed Oct 03 06:34:39 2007 -0400
@@ -52,7 +52,6 @@
* Globals
****************************************************************************/
static GList *infolist = NULL;
-static GList *accountlist = NULL;
/*****************************************************************************
* "API"
@@ -85,8 +84,15 @@
****************************************************************************/
static void
-lh_pbx_find_accounts(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;
}
@@ -137,13 +143,13 @@
data = xmlnode_get_data(siter);
if(g_ascii_strcasecmp("signedon", setting_name))
- tmpinfo->signed_on = atoi(data);
+ tmpinfo->signed_on = data ? atoi(data) : 0;
else if(g_ascii_strcasecmp("signedoff", setting_name))
- tmpinfo->signed_off = atoi(data);
+ tmpinfo->signed_off = data ? atoi(data) : 0;
else if(g_ascii_strcasecmp("lastseen", setting_name))
- tmpinfo->lastseen = atoi(data);
+ tmpinfo->lastseen = data ? atoi(data) : 0;
else if(g_ascii_strcasecmp("last_seen", setting_name))
- tmpinfo->last_seen = atoi(data);
+ 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))
@@ -167,35 +173,75 @@
****************************************************************************/
static void
-lh_pbx_import_target_request(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;
- purple_debug_info("listhandler: import", "Buddy in infolist:\n\tScreenname: %s\n\tAlias: "
- "%s\n\tGroup: %s\n\tAccount name: %s\n\tProtocol ID: %s\n\tSigned on/off: "
- "%i/%i\n\tLast seens: %i/%i\n\tGuifications theme: %s\n\tIcon file: %s\n\t"
- "Last said: %s\n\tBuddy Notes: %s\n\n\n", itmp->screenname, itmp->alias,
- itmp->alias, itmp->group, itmp->account, itmp->prpl_id, itmp->signed_on,
- itmp->signed_off, itmp->lastseen, itmp->last_seen, itmp->gf_theme, itmp->icon_file,
- itmp->lastsaid, itmp->notes);
+
+ 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_find_accounts();
lh_pbx_import_target_request();
+ lh_pbx_import_cleanup();
+
return;
}