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/
/*
* 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
;
}